2011-01-02 9 views

Odpowiedz

46

Według wikipedia:

czy odrębny nazw dla funkcji jest zaletą jest źródłem niezgody w Lisp społeczności. Zwykle jest to nazywane debatą Lisp-1 vs. Lisp-2. Lisp-1 odnosi się do modelu Schematu, a Lisp-2 do modelu Common Lisp.

Zasadniczo chodzi o to, czy zmienne i funkcje mogą mieć tę samą nazwę bez konfliktu. Clojure is a Lisp-1 oznacza, że ​​nie pozwala na jednoczesne użycie tej samej nazwy dla funkcji i zmiennej.

+9

Czy Lisp-2 nie jest bardziej zagmatwany, mając funkcje i zmienne o tych samych nazwach? – Zubair

+26

Po części dlatego, że programiści używający dialektów Lisp-2 nie robią nic, aby mieć funkcje i zmienne o tych samych nazwach. 'lista' jest często używana jako parametr funkcyjny i nie ma rzeczy, OMG, która jest tak zagmatwana, ponieważ' (lista ...) 'jest standardową funkcją. Wiele funkcji, które mają "listę" jako zmienną, nie korzystają z funkcji 'list' lub nie używają jej w pobliżu tej zmiennej. Nawet jeśli tak się stanie, nie jest tak źle: '(lista lista foo)'. Nie jest to bardziej mylące niż zdanie typu "walcz w dobrej walce", w którym to samo słowo pojawia się jako rzeczownik i czasownik. – Kaz

+2

@Zubair Java ma jeszcze więcej przestrzeni nazw. Możesz zdefiniować klasę, metodę i zmienną o tej samej nazwie. – ceving

58

Możesz przeczytać tę paper autorstwa Richarda Gabriela. Jest to podsumowanie problemów, o których dyskutowała społeczność Lisp w Lisp1 i Lisp2. Jest nieco gęsty i powolny w pierwszych kilku rozdziałach, ale jest znacznie łatwiejszy do odczytania przed przejściem do sekcji 5.

Zasadniczo Lisp1 ma pojedyncze środowisko, które odwzorowuje symbole na wartości, a wartości te można "zwykły" lub funkcje. Lisp2 ma (przynajmniej) dwa przestrzenie nazw (symbole mają gniazdo dla ich wartości funkcji i jedną dla zwykłej wartości). 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 w inny sposób).

Istnieje kilka kompromisów i różnic w smaku między tymi dwoma, ale przeczytaj artykuł o szczegółach. Książka Christiana Queinneca "Lisp in Small Pieces" również omawia różnice tkwiące w tekście.

+7

Jedną z bardziej enigmatycznych sekcji artykułu Gabriela jest sekcja 11 dotycząca przetwarzania wieloprocesowego. W tej części sugeruje, że Lisp1 bardziej sprzyja funkcjonalnemu stylowi programowania, a zatem bardziej sprzyja procesowi wieloprocesowemu. Oczywiście, jest to interesujące w Clojure. Ale nie jestem naprawdę pewien * dlaczego * Lisp1 jest bardziej sprzyjający FP. Ktoś ma wgląd w to? –

+30

prawdopodobnie dlatego, że głównym punktem FP jest traktowanie funkcji jako wartości pierwszej klasy, dlatego jest to o wiele wygodniejsze i czystsze pod względem koncepcyjnym traktowanie ich w taki sam sposób, jak wszystkich innych wartości. – mikera

+9

@PeterMcLain Kiedy użytkownicy dialektów Lisp-1 mówią: Lisp- 1 jest bardziej sprzyjający programowaniu funkcjonalnemu, chodzi o to, że nie musisz wciskać kodu pełnego operatorów "funcall" i "function". Te znikają w Lisp-1. – Kaz

Powiązane problemy