Jaka jest różnica między Lisp-1 i Lisp-2?

96

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ć?

appshare.co
źródło

Odpowiedzi:

69

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.

pauldoo
źródło
11
Czy Lisp-2 nie jest więc bardziej zagmatwany, mając funkcje i zmienne o takich samych nazwach?
appshare.co
39
Jednym z powodów jest to, że programiści używający dialektów Lisp-2 nie robią nic, aby funkcje i zmienne miały takie same nazwy. listjest 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ą listzmienną, nie używa tej listfunkcji 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.
Kaz
5
@Zubair Java ma jeszcze więcej przestrzeni nazw. Możesz zdefiniować klasę, metodę i zmienną o tej samej nazwie.
ceving
20
Jako mnemonik uważam, że Lisp 1 ma 1 przestrzeń nazw, a Lisp 2 ma 2 przestrzenie nazw (jedną dla funkcji i jedną dla zmiennych).
Nick McCurdy,
4
@NickMcCurdy Jako mnemonik myślę o rowerze, który ma dwa koła, a trójkołowiec ma trzy.
Kaz,
73

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.

Peter McLain
źródło
7
Jedną z bardziej zagadkowych sekcji artykułu Gabriela jest sekcja 11 dotycząca przetwarzania wieloprocesowego. W tej sekcji sugeruje, że Lisp1 bardziej sprzyja funkcjonalnemu stylowi programowania, a zatem bardziej sprzyja wieloprocesorowości. Oczywiście jest to interesujące dla Clojure. Ale nie jestem pewien, dlaczego Lisp1 bardziej sprzyja FP. Czy ktoś ma w to wgląd?
Peter McLain
41
prawdopodobnie dlatego, że głównym punktem FP jest do traktowania jako funkcji wartości pierwszej klasy, a więc jest to znacznie wygodniejsze i koncepcyjnie czystsze je traktować w taki sam sposób jak wszystkie inne wartości
mikera
10
@PeterMcLain Kiedy użytkownicy Lisp-1 dialektów powiedzieć tht Lisp-1 jest bardziej sprzyja programowania funkcyjnego, co mają na myśli to, że nie mają do rzeczy kod pełne funcalli functionoperatorzy. Te znikają w Lisp-1.
Kaz
3
Przykład, co się dzieje, gdy Schemer próbuje napisać Lispa: emacs.stackexchange.com/q/28979/2787
ceving
2
użyłeś wyrażenia „przynajmniej” w odniesieniu do Lisp-2. Proste rozróżnienie między tymi dwoma przypadkami jest następujące: czy symbol znajduje się na początku wyrażenia s, czy nie (jeśli tak, wyszukaj w przestrzeni nazw funkcji, w przeciwnym razie w przestrzeni nazw zmiennej). Czy możesz podać przykłady innych niż te 2 przypadki?
Daniel Dinnyes