«De grootste programmeertaal die ooit is gemaakt«
ā Alan Kay, Ā«over LispĀ»

Toen McCarthy Lisp ontwikkelde aan het einde van de jaren vijftig, verschilde het radicaal van de bestaande talen, waarvan de belangrijkste was .
Lisp belichaamde negen nieuwe ideeƫn:
1. Voorwaardelijke uitspraken (Conditionals). Voorwaardelijke uitspraken zijn if-then-else constructies. Tegenwoordig beschouwen we ze als vanzelfsprekend. Ze waren door McCarthy tijdens de ontwikkeling van Lisp. (Fortran had op dat moment alleen goto-instructies, nauw verbonden aan de vertakkingsinstructie op de onderliggende hardware.) McCarthy heeft voorwaardelijke uitspraken in Algol ingebracht, waar ze zich verspreidden naar andere talen.
2. Functionele types (A function type). In Lisp zijn functies eerste-klasse objecten ā ze zijn een datatype, net als getallen, strings, enzovoort, en hebben een letterlijke representatie, kunnen in variabelen worden opgeslagen, kunnen als argumenten worden doorgegeven, enzovoort.
3. Recursie (Recursion). Recursie bestond natuurlijk al als wiskundig concept vóór Lisp, maar Lisp was de eerste programmeertaal die het ondersteunde. (Dit wordt mogelijk geïmpliceerd in het creëren van functies als eerste-klasse objecten.)
4. Een nieuw concept van variabelen (A new concept of variables). In Lisp zijn alle variabelen effectieve pointers. Waarden zijn wat types hebben, en niet variabelen, en toewijzing of binding van variabelen betekent het kopiƫren van pointers, en niet wat ze aanwijzen.
5. Garbage Collection (Garbage-collection).
6. Programma's samengesteld uit expressies (Programs composed of expressions). Programma's in Lisp zijn expressiebomen, waarvan elk een waarde teruggeeft. (Sommige Lisp-uitdrukkingen kunnen meerdere waarden teruggeven.) Dit staat in contrast met Fortran en veel andere succesvolle talen, die 'expressies' en 'uitspraken' onderscheiden.
Het was natuurlijk om zo'n onderscheid in Fortran te hebben, omdat de taal lineair-georiƫnteerd was (niet verwonderlijk voor een taal met perforatiekaarten als invoerformaat). Je kon geen geneste uitspraken hebben. En terwijl je wiskundige expressies nodig had om mee te werken, had het geen zin om iets anders een waarde te laten teruggeven, omdat er misschien niets was dat op een terugkeer wachtte.
Beperkingen verdwenen met de opkomst van blok-gestructureerde talen, maar tegen die tijd was het al te laat. Het verschil tussen expressies en uitspraken had zich al gevestigd. Het is overgegaan van Fortran naar Algol en verder naar hun nakomelingen.
Wanneer een taal volledig uit expressies bestaat, kunt u expressies samenstellen zoveel u wilt. U kunt schrijven of (met behulp van de syntaxisĀ )
(if foo (= x 1) (= x 2))of
(= x (if foo 1 2))7. Symbooltype (A symbol type). Symbolen verschillen van strings, in dit geval kunt u gelijkheid controleren door de pointers te vergelijken.
8. Notatie voor code (A notation for code) met behulp van bomen van symbolen.
9. De hele taal altijd beschikbaar (The whole language always available). Er is geen duidelijk verschil tussen leertijd, compileertijd en uitvoeringstijd. U kunt code compileren of uitvoeren tijdens het lezen, of code lezen of uitvoeren terwijl u compileert, of code lezen of compileren tijdens de uitvoering.
Het uitvoeren van code tijdens het lezen stelt gebruikers in staat om de syntaxis van Lisp opnieuw te programmeren; het uitvoeren van code tijdens compilatie is de basis voor macro's; compileren tijdens uitvoering is de basis voor het gebruik van Lisp als een uitbreidbare taal in programma's zoals Emacs; en ten slotte, lezen tijdens uitvoering stelt programma's in staat om met elkaar te communiceren met behulp van s-expressies, een idee dat recentelijk opnieuw is uitgevonden in XML.
Conclusie
Toen Lisp net was uitgevonden, waren al deze ideeƫn ver weg van de gangbare programmeerpraktijken die dicteerden door de hardware die eind jaren vijftig beschikbaar was.
In de loop der tijd heeft de standaardtaal, belichaamd in het succes van populaire talen, zich geleidelijk ontwikkeld in de richting van Lisp. Punten 1-5 zijn nu wijdverspreid. Punt 6 begint in de mainstream te verschijnen. In Python is er in zekere zin punt 7, hoewel de geschikte syntaxis ontbreekt. Punt 8, dat (met punt 9) macro's in Lisp mogelijk maakt, bestaat nog steeds alleen in Lisp, mogelijk omdat (a) het deze haakjes of iets dergelijks vereist, en (b) als u deze laatste krachttoename toevoegt, u niet langer kunt claimen een nieuwe taal uitgevonden te hebben, maar slechts een nieuw dialect van Lisp heeft ontwikkeld; -)
Hoewel dit nuttig is voor moderne programmeurs, is het vreemd om Lisp te beschrijven vanuit het perspectief van de verschillen met willekeurige technieken die in andere talen worden gebruikt. Misschien is dit niet waar McCarthy aan dacht. Lisp was niet ontworpen om de tekortkomingen van Fortran te verhelpen; het kwam eerder voort uit een poging .
Bron: habr.com
