Lisp | ||
---|---|---|
multparadigma programlingvo • funkcia programlingvo • proceda programlingvo • reflektema programlingvo • metaprogramlingvo • interpretata programlingvo vd | ||
Dum | 1958 - nekonata/nuntempe | |
Lispo[1], angle LISP aŭ Lisp (mallongigo de angla LISt Processing = prilaboro de listoj) estas programlingvo kreita de John McCarthy, kaj eldonita en 1958 ĉe MIT, komence nur kiel matematika notacio, sed poste enkarnigita kiel komputila lingvo de studentoj. Ofte, sed ne ekskluzive, ĝi estas interpretata lingvo. Lispo estas plej ofte konata kiel la lingvo de artefarita intelekto. Lispo estas funkcia lingvo. Lispo ĉefe estas dediĉita por procezi simbolojn. Common Lisp estas populara dialekto de LISP.
Lispo ankaŭ estas la lingvo por konfiguri Emakson kaj AutoCad-on. Fakte, unu artikolo diris lastatempe ke nuntempe la plej ofta uzo de Lispo estas skribi etendaĵojn por tiuj iloj.
Atomoj kaj listoj
Lispo estas esprimo-orientita lingvo. En ĝi ĉio estas esprimoj - kaj datumoj kaj ordonoj (funkcioj).
Ĉefaj datumoj estas atomoj - nombroj, konstantoj, signoĉenoj, kaj listoj (finhava vico de esprimoj - atomoj kaj/aŭ aliaj listoj, metita en rondajn krampojn). Ekzemple: (abc 123 "eĥoŝanĝo" (ĉiuĵaŭde))
- listo el kvar elementoj, la kvara estas ankaŭ listo.
Ĉiu celo de listoj en lispo (nomata cons) estas paro de kapo kaj vosto. La kapo estas la unua elemento de la listo (t.n. car), kaj vosto estas resto de la listo (t.n. cdr). En la punkto-notacio tio skribatas: (kapo . vosto)
. La supra listo en la punkto-notacio aspektas jene: (abc . (123 . ("eĥoŝanĝo" . ((ĉiuĵaŭde . nil) . nil))))
, kie nil estas speciala atomo, signifanta malplenan liston = ()
.
Funkcioj
Funkcioj estas skribataj ankaŭ en formo de listo: (+ 1 2 3)
, kie la unua elemento estas nomo de funkcio, kaj la ceteraj estas ties parametroj. Defino de funkcio estas voko de speciala funkcio defun
(kiu havas tri argumentojn: nomo de nova funkcio, listo de ĝiaj argumentoj, kaj ĝia korpo). Jen estas difino de rekursia funkcio faktorialo:
(defun faktorialo (n)
(if (<= n 1)
1
(* n (faktorialo (- n 1)))))
;; Aŭ...
(defun faktorialo2 (n &optional (acc 1))
(if (<= n 1)
acc
(faktorialo2 (- n 1)(* acc n))))
Speciala funkcio "if" havas tri argumentojn, ĝi kalkulas la unuan (kondiĉo), se ties valoro estas vero (io ajn ne egala al nil
), tiam la rezulto estas la valoro de la dua argumento, alie la rezulto estas la valoro de la tria.
Aliaj funkcioj:
- quote - donas sian argumenton kiel simbolon, sed ne kiel variablon, do blokas ĝian kalkuladon:
(quote a)
--> a. Ekzistas mallongigo de tiu ĉi funkcio - apostrofo:'a
--> a - cons - kombinas liston el du siaj argumentoj:
(cons 'a 'b)
--> (a . b),(cons 'a (cons 'b . nil))
--> (a b),(cons 'a '(b c))
--> (a b c) - car - kalkulas la unuan elementon de argumento - listo, aŭ donas nil-on, se la argumento ne estas listo:
(car '(a b c))
--> a - cdr - kalkulas la reston de la listo sen la unua elemento:
(cdr '(a b c))
--> (b c) - atom - logika funkcio, kiu kontrolas, ĉu la argumento estas atomo
- eq - logika funkcio, kiu kontrolas, ĉu la du argumentoj estas egalaj atomoj
Ĉar en lispo kaj datumoj kaj funkcioj estas listoj, tial eblas skribi funkciojn, kiuj kreas novajn funkciojn aŭ ŝanĝas aliajn.
Ekzemploj
Kuino - programo, kies rezulto estas la teksto de si mem:
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
(print "Saluton, mondo!")