Hvad gjorde Lisp speciel

«Det bedste programmeringssprog, der nogensinde er skabt«
- Alan Kay, "på Lisp"

Hvad gjorde Lisp speciel

Da McCarthy udviklede Lisp i slutningen af ​​1950'erne, var det radikalt anderledes end eksisterende sprog, hvoraf det vigtigste var Fortran.

Lisp introducerede ni nye ideer:

1. Betingelser. Betingede udsagn er hvis-så-andet-konstruktioner. Nu tager vi dem for givet. De var opfundet McCarthy under udviklingen af ​​Lisp. (Fortran havde på det tidspunkt kun goto-erklæringer, tæt koblet til en greninstruktion om den underliggende hardware.) McCarthy, mens han var i Algol-komiteen, bidrog med betingelser til Algol, hvorfra de spredte sig til andre sprog.

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 Arc)

(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 aksiomatisere beregninger.

Kilde: www.habr.com

Tilføj en kommentar