«Det bedste programmeringssprog, der nogensinde er skabt«
- Alan Kay, "på Lisp"
Da McCarthy udviklede Lisp i slutningen af 1950'erne, var det radikalt anderledes end eksisterende sprog, hvoraf det vigtigste var
Lisp introducerede ni nye ideer:
1. Betingelser. Betingede udsagn er hvis-så-andet-konstruktioner. Nu tager vi dem for givet. De var
2. En funktionstype. I Lisp er funktioner førsteklasses objekter - de er en datatype, ligesom tal, strenge osv., og har en bogstavelig repræsentation, kan gemmes i variable, kan videregives som argumenter osv.
3. Rekursion. Rekursion eksisterede selvfølgelig som et matematisk begreb før Lisp, men Lisp var det første programmeringssprog, der understøttede det. (Dette er måske underforstået i at skabe funktioner som førsteklasses objekter.)
4. Et nyt koncept for variabler. I Lisp er alle variable effektive pointere. Værdier er, hvilke typer der har, ikke variabler, og at tildele eller binde variabler betyder kopiering af pointere, ikke hvad de peger på.
5. Dagrenovation.
6. Programmer sammensat af udtryk. Lisp-programmer er træer af udtryk, som hver returnerer en værdi. (Nogle Lisp-udtryk kan returnere flere værdier.) Dette står i kontrast til Fortran og mange andre succesfulde sprog, der skelner mellem "udtryk" og "udsagn."
Det var naturligt at have denne sondring i Fortran, fordi sproget var linjeorienteret (ikke overraskende for et sprog, hvis inputformat var et hulkort). Du kunne ikke have indlejrede udsagn. Og så længe du havde brug for matematiske udtryk for at fungere, var der ingen mening i at få noget andet til at returnere en værdi, fordi der måske ikke var noget, der ventede på at blive returneret.
Restriktionerne blev ophævet med fremkomsten af blokstrukturerede sprog, men da var det for sent. Sondringen mellem udtryk og udsagn er allerede etableret. Den gik fra Fortran til Algol og videre til deres efterkommere.
Når et sprog udelukkende består af udtryk, kan du komponere udtryk, som du vil. Du kan skrive enten (ved hjælp af syntaksen
(if foo (= x 1) (= x 2))
eller
(= x (if foo 1 2))
7. En symboltype. Tegn er forskellige fra strenge, i hvilket tilfælde du kan tjekke for lighed ved at sammenligne pointere.
8. En notation for kode ved hjælp af symboltræer.
9. Hele sproget er altid tilgængeligt. Der er ingen åbenlys forskel mellem læsetid, kompileringstid og køretid. Du kan kompilere eller køre kode, mens du læser, eller læse eller køre kode, mens du kompilerer, eller læse eller kompilere kode, mens den kører.
At køre kode under læsning giver brugerne mulighed for at omprogrammere Lisps syntaks; kørende kode på kompileringstidspunktet er grundlaget for makroer; runtime compilation er grundlaget for at bruge Lisp som et udvidelsessprog i programmer som Emacs; og endelig giver runtime-læsning programmer mulighed for at kommunikere ved hjælp af s-udtryk, en idé, der for nylig blev genopfundet i XML.
Konklusion
Da Lisp først blev opfundet, var disse ideer langt fra konventionel programmeringspraksis dikteret af den tilgængelige hardware i slutningen af 1950'erne.
Over tid udviklede standardsproget, legemliggjort af populære sprogs succes, gradvist sig mod Lisp. Punkt 1-5 er nu bredt accepteret. Punkt 6 begynder at dukke op i mainstream. I Python er der en klausul 7 i en eller anden form, selvom der ikke er nogen passende syntaks. Punkt 8, som (med punkt 9) muliggør makroer i Lisp, er stadig kun i Lisp, sandsynligvis fordi (a) det kræver disse parenteser eller noget lige så dårligt, og (b) hvis du tilføjer denne seneste stigning i kraft, kan du ikke længere hævder at have opfundet et nyt sprog, men kun at have udviklet en ny dialekt af Lisp; -)
Selvom dette er nyttigt for moderne programmører, er det mærkeligt at beskrive Lisp i forhold til dens forskel fra de tilfældige teknikker, der anvendes på andre sprog. Det var måske ikke, hvad McCarthy tænkte. Lisp var ikke designet til at rette Fortrans fejl; det fremstod mere som et biprodukt af at prøve
Kilde: www.habr.com