Díky za článek, byť možná pár poznámek hnidopicha:
- v komentáři u se mluví o volání, ale přijde mi, že se lambda funkce v tomhle nikde nevolá. Jak to je míněno?
; call anonymous function (print (lambda (x y) (+ x y)))
- K
Pro tento účel se používá přímo lambda výraz (bez define), podobně jako v každém ortodoxním Lispu (snad kromě PicoLispu):
To si myslím je kompikovanější - v Common Lispu do verze CLtL2 a starších Lispech byl, pokud vím, (lambda ...)
název funkce (bylo ho možné použít v pozici prvního prvku výrazu), ale nikoliv výraz, který se na lambda funkci vyhodnocoval - až v ANSI CL je lambda i makro, které expanduje na #'(lambda...
, resp (function (lambda...
(v Scheme není třeba řešit, protože funkce nemají separátní namespace). Tedy ((lambda (a b) (+ a (* b 3))) 4 5)
se vyhodnotilo na 19, ale (lambda (a b) (+ a (* b 3)))
bylo volání neexistující funkce. Na druhou stranu se to už tehdy nazývalo lambda expression...
- zmiňovat CL mezi "staršími" Lispy (nemluvě o slovu interpreter...) v kontextu lexical scope je možná trochu zavádějící - CL je novější než Lambda papery i než Scheme, a mám za to, že lexical scope ze Scheme přebral.
Dobrý den, díky za poznámky.
To první je chyba copy & paste při skládání příkazů, protože (print) by měl vypsat jen informace o anonymní funkci (formát je různý, většinou něco v úhlových závorkách, ale hlavní je, že se jedná o plnohodnotnou hodnotu).
Ad druhá poznámka - máte pravdu, tady je to skutečně komplikovanější a zbytečně jsem to zjednodušil (a možná i zamlžil tím "ortodoxním").
Staršími LISPy myslím hlavně MacLISP a XLisp (resp. z něho odvozený AutoLISP) - prostě LISPy s dynamickým scope. Přesněji MacLISP a XLisp jsou jediné LISPy, se kterými jsem reálně dělal a takto se chovaly, bude sem patřit ale i LISP 1.5 atd. Z těch starších jsem ještě dělal v Interlispu, ale to si už popravdě nevzpomenu, jestli měl dynamický nebo lexikální scoping.