Wat Lisp speciaal maakte

«De beste programmeertaal ooit gemaakt«
- Alan Kay, "op Lisp"

Wat Lisp speciaal maakte

Toen McCarthy eind jaren vijftig Lisp ontwikkelde, verschilde het radicaal van de bestaande talen, waarvan de belangrijkste was Fortran.

Lisp introduceerde negen nieuwe ideeën:

1. Voorwaardelijke voorwaarden. Voorwaardelijke uitspraken zijn if-then-else-constructies. Nu beschouwen we ze als vanzelfsprekend. Ze waren uitgevonden McCarthy tijdens de ontwikkeling van Lisp. (Fortran had destijds alleen goto-verklaringen, nauw gekoppeld aan een branch-instructie over de onderliggende hardware.) McCarthy droeg, terwijl hij lid was van de Algol-commissie, conditionals bij aan Algol, vanwaar ze zich naar andere talen verspreidden.

2. Een functietype. In Lisp zijn functies eersteklas objecten - ze zijn een gegevenstype, net als getallen, tekenreeksen, enz., en hebben een letterlijke weergave, kunnen worden opgeslagen in variabelen, kunnen worden doorgegeven als argumenten, enz.

3. Herhaling. Recursie bestond uiteraard al vóór Lisp als een wiskundig concept, maar Lisp was de eerste programmeertaal die dit ondersteunde. (Dit wordt misschien geïmpliceerd bij het creëren van functies als eersteklas objecten.)

4. Een nieuw concept van variabelen. In Lisp zijn alle variabelen effectieve aanwijzingen. Waarden zijn wat typen hebben, niet variabelen, en het toewijzen of binden van variabelen betekent het kopiëren van verwijzingen, niet waar ze naar verwijzen.

5. Afvalinzameling.

6. Programma's die zijn samengesteld uit uitdrukkingen. Lisp-programma's zijn bomen met uitdrukkingen, die elk een waarde retourneren. (Sommige Lisp-expressies kunnen meerdere waarden retourneren.) Dit staat in contrast met Fortran en vele andere succesvolle talen die onderscheid maken tussen ‘expressies’ en ‘statements’.

Het was normaal dat dit onderscheid in Fortran bestond, omdat de taal lijngeoriënteerd was (niet verrassend voor een taal waarvan het invoerformaat een ponskaart was). U kunt geen geneste instructies hebben. En zolang je wiskundige uitdrukkingen nodig had om te werken, had het geen zin om iets anders een waarde te laten retourneren, omdat er misschien niets wacht om teruggestuurd te worden.

De beperkingen werden opgeheven met de komst van blokgestructureerde talen, maar tegen die tijd was het te laat. Het onderscheid tussen uitdrukkingen en uitspraken is al vastgelegd. Het ging van Fortran naar Algol en verder naar hun nakomelingen.

Wanneer een taal volledig uit uitdrukkingen bestaat, kunt u uitdrukkingen op elke gewenste manier samenstellen. U kunt beide schrijven (met behulp van de syntaxis Boog)

(if foo (= x 1) (= x 2))

of

(= x (if foo 1 2))

7. Een symbooltype. Tekens verschillen van tekenreeksen. In dat geval kunt u de gelijkheid controleren door verwijzingen te vergelijken.

8. Een notatie voor code gebruik van symboolbomen.

9. De hele taal is altijd beschikbaar. Er is geen duidelijk verschil tussen leestijd, compileertijd en runtime. U kunt code compileren of uitvoeren terwijl u leest, of code lezen of uitvoeren terwijl u compileert, of code lezen of compileren terwijl deze wordt uitgevoerd.

Door code uit te voeren tijdens het lezen kunnen gebruikers de syntaxis van Lisp herprogrammeren; het uitvoeren van code tijdens het compileren is de basis voor macro's; runtime-compilatie is de basis voor het gebruik van Lisp als extensietaal in programma's zoals Emacs; en ten slotte zorgt runtime-lezen ervoor dat programma's kunnen communiceren met behulp van s-expressies, een idee dat onlangs opnieuw is uitgevonden in XML.

Conclusie

Toen Lisp voor het eerst werd uitgevonden, stonden deze ideeën ver af van de conventionele programmeerpraktijken die werden gedicteerd door de hardware die eind jaren vijftig beschikbaar was.

In de loop van de tijd evolueerde de standaardtaal, belichaamd door het succes van populaire talen, geleidelijk naar Lisp. De punten 1 tot en met 5 worden nu algemeen aanvaard. Punt 6 begint in de mainstream te verschijnen. In Python is er een clausule 7 in een of andere vorm, hoewel er geen geschikte syntaxis is. Item 8, dat (samen met item 9) macro's mogelijk maakt in Lisp, is nog steeds alleen in Lisp, waarschijnlijk omdat (a) het die haakjes vereist of iets dat even erg is, en (b) als je deze laatste toename in kracht toevoegt, kun je niet langer beweren een nieuwe taal te hebben uitgevonden, maar alleen een nieuw Lisp-dialect te hebben ontwikkeld; -)

Hoewel dit handig is voor moderne programmeurs, is het vreemd om Lisp te beschrijven in termen van het verschil met de willekeurige technieken die in andere talen worden toegepast. Dit is misschien niet wat McCarthy dacht. Lisp was niet ontworpen om de fouten van Fortran te corrigeren; het leek meer een bijproduct van proberen axiomatiseren van berekeningen.

Bron: www.habr.com

Voeg een reactie