2015-03-31 23 views
6

W Common Lisp The let wykorzystuje wykaz dotyczący powiązań, a mianowicie:Clojure niech vs Common Lisp niech

(let ((var1 1) 
     (var2 2)) 
    ...) 

Podczas Clojure wykorzystuje wektor Zamiast:

(let [a 1 
     b 2] 
    ...) 

Czy jest jakiś konkretny powód , inne niż czytelność, aby Clojure użył wektora?

+2

Opcja 'składnia LET' nie jest specyficzną cechą Common Lisp. Zasadniczo każdy Lisp (Emacs Lisp, ISLisp, Scheme, ...) obsługuje tę składnię. Clojure nie. –

+4

Clojure 'let' wiąże sekwencyjnie. Zatem jest to odpowiednik CL i Scheme 'let *'. – Sylwester

Odpowiedz

8

można znaleźć argumentu Rich Hickey w Simple Made Easy - slajd 14, około 26 minut w:

Simple Made Easy - slide 14

+0

Tak, myślę, że wskazówka jest w tym zdaniu: "przeciążony dla połączeń ang grupowania". Dzięki! – kamituel

+2

Teraz nawiasy kwadratowe są przeciążone (mniejszą) grupą i składnią wektorową. –

+1

@RainerJoswig Jeśli to nie było, że wiążą się sekwencyjnie, może być bardziej logiczne użycie literału literowego '{...}' zamiast literału wektorowego [...] 'dla Clojure' let' i ' loop'. – Thumbnail

2

linia Richa na ten był następujący

„Ponieważ mówiliśmy o składni , spójrzmy na klasyczne Lisp . Wygląda na to, że jest to najprostsza ze składni, wszystko to jest lista symboli, liczb i kilku innych rzeczy w formie nawiasów, co może być prostsze? w rzeczywistości nie jest to najprostszy, ponieważ do osiągnięcia tej jednorodności, aby trzeba było przeciążać znaczeniem list o wartości . Mogą to być wywołania funkcji, grupowanie konstruktów lub literałów danych itd. Określanie, które wymaga użycia kontekstu, zwiększając obciążenie poznawcze podczas skanowania kodu do , ocenia jego znaczenie. Clojure dodaje kilka bardziej złożonych literałów danych do list i używa ich do składni. Oznacza to, że listy są prawie zawsze rzeczami podobnymi do wywołań, a wektory są używane do grupowania, , a mapy mają własne literały. Przejście z jednej struktury danych do trzy zmniejsza obciążenie poznawcze znacznie.”

Jedną z rzeczy, które jego zdaniem został przeciążony w standardowej składni był czas dostępu. Tak więc wektor składni w argumentach jest związane z czasem stały dostęp Gdy Powiedział:

Wydaje się dziwne, ponieważ jest ważne tylko dla tej jednej postaci ... jak tylko zostanie zapisane w zmiennej lub przekazane w jakikolwiek sposób, informacja jest "utracona". ..

(defn test [a] 
    (nth a 0)) ;;<- what is the access time of and element of a? 

Osobiście preferuję ostre s yntax zmienia się jak nawiasy, które mają być zarezerwowane, gdy programista musi przełączać modele mentalne, np. dla języków wbudowanych.

;; Example showing a possible syntax for an embedded prolog. 

{size [],0} 
{size([H|T],N) :- size(T,N1), N is N1+1} 

(size '(1 2 3 4) 'n) ;; here we are back to lisp code 

Taka koncepcja jest syntaktycznie stała. W środowisku wykonawczym nie "przechodzisz" do struktury. Przed uruchomieniem (czas odczytu/makra/kompilacji) jest inna sprawa, więc w miarę możliwości często lepiej jest utrzymywać rzeczy w postaci list.

[edit] Oryginalny źródło wydaje się już, ale tu jest inny zapis wywiadu: https://gist.github.com/rduplain/c474a80d173e6ae78980b91bc92f43d1#file-code-quarterly-rich-hickey-2011-md

+2

Prima Aprilis? Czas dostępu nie może być przeciążony. Nie w składni, ogólnie. Czas dostępu można zaobserwować lub oczekiwać. Wektory w Clojure nie mają stałego czasu dostępu. Nazwy referencyjne nie przekazują informacji o typie lub czasie dostępu, chyba że je nazwiesz. W każdym razie nie ma to znaczenia dla składni i konstrukcji poprzez literały. Clojure nie "osadza" Prologa ani żadnego innego języka, więc preferencja zachowania nawiasów dla osadzania języków jest jak prośba o to, by samochód miał skrzydła zamiast drzwi. Clojures makra definicji najwyższego poziomu nazywa się 'defn', a nie" defun ". –

+0

Naprawiłem literówkę i aby wyjaśnić, linia Richa (próbuję znaleźć źródło) była taka, że ​​lista dróg była przeciążona. Nie tylko pod względem grupowania, ale także czasu dostępu. Ponieważ czas dostępu elementu jest listą, a element w wektorze nie jest taki sam, więc wektory do grupowania argumentów są lepszym wyborem, ponieważ odzwierciedlają (w przybliżeniu) stały czas dostępu. Nie powiedziałem też, że clojure ma wbudowany prolog, powiedziałem: * wolę, żeby składnia była zarezerwowana do używania takich rzeczy jak języki wbudowane. Być może zauważyłeś też tag common-seplp na pytanie ... – Baggers

+0

.. Oznacza to, że będą odpowiedzi na pytania dotyczące rzeczy, które możesz zrobić w zwykłym seplenienie, np. Poszerzając czytnik. – Baggers