Próbowałem zrozumieć różnicę między Lisp-1 i Lisp-2 i jak to się ma do Clojure, ale nadal nie rozumiem poprawnie. Czy ktoś może mnie oświecić?
96
Według Wikipedii :
To, czy oddzielna przestrzeń nazw dla funkcji jest zaletą, jest źródłem niezgody w społeczności Lisp. Zwykle nazywa się to debatą Lisp-1 vs. Lisp-2. Lisp-1 odnosi się do modelu Scheme, a Lisp-2 do modelu Common Lisp.
Zasadniczo chodzi o to, czy zmienne i funkcje mogą mieć tę samą nazwę bez kolizji. Clojure to Lisp-1, co oznacza, że nie pozwala na jednoczesne użycie tej samej nazwy dla funkcji i zmiennej.
list
jest często używany jako parametr funkcji i nikt nie robi rzeczy, OMG, który jest tak zagmatwany, ponieważ(list ...)
jest funkcją standardową. Wiele funkcji, które mająlist
zmienną, nie używa tejlist
funkcji lub nie używa jej w pobliżu tej zmiennej. Nawet gdy to się zdarza, że nie jest tak źle:(list foo list)
. Nie jest to bardziej zagmatwane niż zdanie typu „stocz w dobrej walce”, w którym to samo słowo występuje jako rzeczownik i czasownik.Możesz przeczytać ten artykuł Richarda Gabriela. Jest to podsumowanie problemów, które społeczność Lisp omawiała w Lisp1 vs Lisp2. W pierwszych kilku sekcjach jest trochę gęsty i powolny, ale jest znacznie łatwiejszy do odczytania, gdy miniesz sekcję 5.
Zasadniczo Lisp1 ma jedno środowisko, które odwzorowuje symbole na wartości, a te wartości mogą być „zwykłe” lub funkcyjne. Lisp2 ma (co najmniej) dwie przestrzenie nazw (symbole mają miejsce na wartość funkcji i jedną na zwykłą wartość). Tak więc w Lisp2 możesz mieć funkcję o nazwie foo i wartość o nazwie foo, podczas gdy w Lisp1 nazwa foo może odnosić się tylko do pojedynczej wartości (funkcji lub innej).
Istnieje kilka kompromisów i różnic gustu między nimi, ale przeczytaj artykuł, aby uzyskać szczegółowe informacje. Książka Christiana Queinneca „Lisp in Small Pieces” również zawiera dyskusję na temat różnic w tekście.
źródło
funcall
ifunction
operatorzy. Te znikają w Lisp-1.