Kio igis Lisp speciala

«La plej bonega programlingvo iam kreita«
- Alan Kay, "sur Lisp"

Kio igis Lisp speciala

Kiam McCarthy evoluigis Lisp en la malfruaj 1950-aj jaroj, ĝi estis radikale diferenca de ekzistantaj lingvoj, la plej grava el kiuj estis Fortran.

Lisp prezentis naŭ novajn ideojn:

1. Kondicionaloj. Kondiĉaj deklaroj estas se-tiam-alie konstruoj. Nun ni prenas ilin por donitaj. Ili estis inventita McCarthy dum la evoluo de Lisp. (Fortran tiutempe nur havis goto-deklarojn, proksime kunligitajn al branĉo-instrukcio pri la subesta aparataro.) McCarthy, dum en la Algol-komisiono, kontribuis kondicionalojn al Algol, de kie ili disvastiĝis al aliaj lingvoj.

2. Funkcia tipo. En Lisp, funkcioj estas unuaklasaj objektoj - ili estas datumtipo, same kiel nombroj, ŝnuroj, ktp., kaj havas laŭvortan reprezentadon, povas esti stokitaj en variabloj, povas esti pasitaj kiel argumentoj, ktp.

3. Rikurso. Rekurso, kompreneble, ekzistis kiel matematika koncepto antaŭ Lisp, sed Lisp estis la unua programlingvo kiu subtenis ĝin. (Ĉi tio eble estas implicita en kreado de funkcioj kiel bonegaj objektoj.)

4. Nova koncepto de variabloj. En Lisp, ĉiuj variabloj estas efikaj montriloj. Valoroj estas kiaj tipoj havas, ne variabloj, kaj atribui aŭ ligi variablojn signifas kopii montrilojn, ne kion ili montras.

5. Rubkolekto.

6. Programoj kunmetitaj de esprimoj. Lisp-programoj estas arboj de esprimoj, ĉiu el kiuj liveras valoron. (Kelkaj Lisp-esprimoj povas resendi plurajn valorojn.) Ĉi tio kontrastas kun Fortran kaj multaj aliaj sukcesaj lingvoj, kiuj distingas inter "esprimoj" kaj "deklaroj."

Estis nature havi ĉi tiun distingon en Fortran ĉar la lingvo estis lini-orientita (ne surprize por lingvo kies enigformato estis truita karto). Vi ne povus havi nestitajn deklarojn. Kaj tiel longe kiel vi bezonis matematikajn esprimojn por funkcii, ne estis senco havi ion alian resendi valoron ĉar eble ne estas io atendanta esti resendita.

La restriktoj estis nuligitaj kun la apero de blok-strukturitaj lingvoj, sed tiam estis tro malfrue. La distingo inter esprimoj kaj deklaroj jam estis establita. Ĝi pasis de Fortran al Algol kaj plu al iliaj posteuloj.

Kiam lingvo estas farita tute el esprimoj, vi povas komponi esprimojn kiel vi volas. Vi povas skribi ĉu (uzante la sintakson arko)

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

(= x (if foo 1 2))

7. Simbolospeco. Signoj estas malsamaj de ĉenoj, en kiu kazo vi povas kontroli egalecon komparante montrilojn.

8. Notacio por kodo uzante simbolarbojn.

9. La tuta lingvo estas ĉiam disponebla. Ne estas evidenta diferenco inter tempo de legado, tempo de kompilo kaj tempo de ruliĝo. Vi povas kompili aŭ ruli kodon dum vi legas, aŭ legi aŭ ruli kodon dum vi kompilas, aŭ legi aŭ kompili kodon dum ĝi funkcias.

Ruli kodon dum legado permesas al uzantoj reprogrami la sintakson de Lisp; ruli kodon je kompiltempo estas la bazo por makrooj; rultempa kompilo estas la bazo por uzi Lisp kiel etendan lingvon en programoj kiel Emakso; kaj finfine, rultempa legado permesas al programoj komuniki per s-esprimoj, ideo lastatempe reinventita en XML.

konkludo

Kiam Lisp unue estis inventita, tiuj ideoj estis malproksime de konvenciaj programaj praktikoj diktitaj per la aparataro havebla en la malfruaj 1950-aj jaroj.

Kun la tempo, la defaŭlta lingvo, enkorpigita de la sukceso de popularaj lingvoj, iom post iom evoluis al Lisp. La punktoj 1-5 nun estas vaste akceptitaj. Punkto 6 komencas aperi en la ĉefa fluo. En Python, ekzistas klaŭzo 7 en iu formo, kvankam ekzistas neniu taŭga sintakso. Item 8, kiu (kun ero 9) ebligas makroojn en Lisp, estas ankoraŭ nur en Lisp, verŝajne ĉar (a) ĝi postulas tiujn krampojn aŭ ion same malbonan, kaj (b) se vi aldonas ĉi tiun lastan plialtiĝon de potenco, vi povas ne plu pretendas esti inventinta novan lingvon, sed nur disvolvi novan dialekton de Lisp; -)

Kvankam tio estas utila por modernaj programistoj, estas strange priskribi Lisp laŭ ĝia diferenco de la hazardaj teknikoj adoptitaj en aliaj lingvoj. Ĉi tio eble ne estas kion McCarthy pensis. Lisp ne estis dizajnita por korekti la erarojn de Fortran; ĝi prezentiĝis pli kiel kromprodukto de provado aksiomatigi kalkulojn.

fonto: www.habr.com

Aldoni komenton