Fexpr są nieco ortogonalne do leniwych/chętnych do oceny.
Zwykłą funkcją funkcji jest eval argumentów funkcji, a następnie wywołanie jej na wyniku. Lazy eval nadal zachowuje się w ten sposób, po prostu opóźnia ocenę, aż bezpośrednio przed użyciem parametru.
Typowe podejście makro polega na przekazywaniu nieocenionych argumentów do szablonu, który ocenia wszystko, co nie jest cytowane. Powstały fragment AST jest wstrzykiwany do strony wywoławczej, gdzie jest zwykle oceniany ponownie. Działa to podobnie z leniwym eval.
Podejście historycznie szalone fexpr polega na przekazywaniu nieocenionych argumentów funkcji, co robi to, co im się podoba. Wynik jest wstrzykiwany bezpośrednio do strony wywoławczej i zwykle nie jest oceniany automatycznie.
Fexpr jest dość zbliżony do arbitralnej transformacji. Dzięki niemu możesz zaimplementować makra i lambdy. Możesz także wdrożyć dowolną hybrydę pożądanej/leniwej oceny, jaką chcesz. Podobnie można zaimplementować fexpr z domyślnymi leniwymi eval i jawnymi wywołaniami eval() w różnych miejscach, aby wymusić zachłanne zachowanie.
Nie sądzę, bym scharakteryzował Fexpr jako łatwe rozwiązanie do wdrażania leniwych eval, ale w leczeniu jest gorszy niż sens choroby.
Przez fexprs, masz na myśli [makra] (http://en.wikipedia.org/wiki/Macro_ (computer_science) #Lisp_macros) lub faktyczne [fexprs] (http://en.wikipedia.org/ wiki/Fexpr)? Pytam, ponieważ ogromna większość nowoczesnych Lisps używa makr zamiast fexprs. – malisper
FEXPR zmarł w mainstreamie Lisp w latach 80. i został zastąpiony przez makra. Makra służą do abstrakcyjnej składni. Z leniwą oceną wszystkie specjalne formularze mogą być funkcjami, więc możesz zaimplementować składnię z funkcjami, ponieważ ocena nie nastąpi, dopóki nie będziesz potrzebował czegoś obliczonego. Zwykle są to różne języki, więc nie widzę, jak te dwie rzeczy należy porównywać, gdy być może nigdy nie spotykają się w języku. – Sylwester
@malisper Tak, mam na myśli faktyczne fexprs lub "call-by-text", jeśli chcesz. –