2015-04-20 12 views
6

Szukam (rzeczywistych) zastosowań feksów, gdzie są one wykorzystywane w sposób inny niż to, co można osiągnąć leniwą ewaluacją.Przykłady nietrywialnego użycia fexpr

Większość przykładów, które mogłem znaleźć używają fexprs tylko do wykonania oceny warunkowej, na przykład do zwarcia "i" operacyjnego "(Oceń pierwszy argument, jeśli jest fałszywy, nie oceniaj drugiego i bezpośrednio zwracaj fałsz).

Szukam "użytecznych" zastosowań, to jest, gdy używanie fexpr prowadzi do kodu, który jest "lepszy" (czyściejszy) niż to, co można by zrobić bez fexprs.

+0

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

+1

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

+0

@malisper Tak, mam na myśli faktyczne fexprs lub "call-by-text", jeśli chcesz. –

Odpowiedz

2

Istnieją dwa główne powody, dla których warto skorzystać z feksprs.

Pierwsza z nich polega na tym, że umożliwiają one ocenę argumentów dowolną liczbę razy. Dzięki temu możliwe jest wdrożenie operatorów, którzy oceniają swoje argumenty leniwie, tak jak sugerowałeś. Konstrukty zbudowane w ten sposób są również zdolne do oceny ich argumentów więcej niż jeden raz. Umożliwia to zaimplementowanie pętli za pomocą fexprs!

Innym przykładem jest transformacja. Przekształcanie kodu jest w zasadzie sposobem pisania kompilatora na istniejącym Lispie. Mimo że używa makr, a nie fexprs, jest to doskonały przykład rodzaju transformacji, jakie można wykonać.

1

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.