2015-03-31 2 views
6

В Common Lisp, то let использует список для привязки, то есть:Clojure пусть против Common Lisp пусть

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

В то время как Clojure использует вектор вместо:

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

Есть ли конкретная причина , кроме удобочитаемости, для Clojure использовать вектор?

+2

Параметр 'Синтаксис LET' не является специфической особенностью Common Lisp. В основном каждый Lisp (Emacs Lisp, ISLisp, Scheme, ...) поддерживает этот синтаксис. Clojure нет. –

+4

Clojure 'let' связывается последовательно. Таким образом, это эквивалентно CL и Scheme 'let *'. – Sylwester

ответ

8

Вы можете найти аргумент Rich Хики на Simple Made Easy - слайд 14, около 26 минут в:

Simple Made Easy - slide 14

+0

Да, я думаю, что в этом предложении есть ключ: «перегружен для группировки звонков». Благодаря! – kamituel

+2

Теперь квадратные скобки перегружены (меньше) группировкой и векторным синтаксисом. –

+1

@RainerJoswig Если бы они не связывались последовательно, было бы логичнее использовать буквенный символ '{...}' вместо векторного литерала '[...]' для Clojure 'let' и' loop'. – Thumbnail

2

линия Рича на это следующим образом

«Так как мы говорим о синтаксисе , давайте посмотрим на классический Lisp. Кажется, это самый простой синтаксис, все это в скобках список символов, цифр и несколько других. Что может быть проще ? ut в действительности, это не самое простое, так как до достичь этой однородности, должна быть существенная перегрузка значения значений списков. Это могут быть вызовы функций, группировка конструкций или литералов данных и т. Д. И определение, которое требует с использованием контекста, увеличивая когнитивную нагрузку при сканировании кода до , оценивает его значение. Clojure добавляет еще несколько композитных литералов данных в списки и использует их для синтаксиса. При этом это означает, что списки - почти всегда вызываемые вещи, а векторы используются для группировки, и карты имеют свои собственные литералы. Переход от одной структуры данных три снижает когнитивный нагрузка по существу.»

Одна из вещей, которые он считает, был перегружен в стандартном синтаксисе было время доступа. Таким образом, вектор синтаксис аргументов связан с постоянная временем доступа, когда вы использовали их. Он сказал:

Кажется странным, хотя он действителен только для одной формы ... как только он хранится в переменной или передается каким-либо образом информация «потеряна». Например. ..

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

Я лично предпочитаю суровые yntax изменяется, как скобки, зарезервированные для того, когда программист должен переключать умственные модели, например. для встроенных языков.

;; 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 

Такая концепция синтаксически постоянна. Во время выполнения вы не «обходите» структуру. Перед временем выполнения (чтение/макрос/время компиляции) другое дело, поэтому, когда это возможно, часто лучше хранить вещи в виде списков.

[edit] первоисточником, кажется, нет, но вот еще одна запись интервью: https://gist.github.com/rduplain/c474a80d173e6ae78980b91bc92f43d1#file-code-quarterly-rich-hickey-2011-md

+2

Апрельские дураки? Время доступа не может быть перегружено. Не в синтаксисе, не в общем. Время доступа можно наблюдать или ожидать. Векторы в Clojure не имеют постоянного времени доступа. Имена ссылок не передают информацию о типе или времени доступа, если вы не назовете их так, чтобы они это делали. В любом случае это не имеет отношения к синтаксису и построению через литералы. Clojure не «внедряет» Prolog или какой-либо язык, поэтому предпочтение сохранять скобки для встраивания языков - это как просить автомобиль иметь крылья вместо дверей. Макрос определения функции верхнего уровня Clojures называется 'defn', а не« defun ». –

+0

Я исправил опечатку и уточнил, что линия Рича (я пытаюсь найти источник) заключалась в том, что список путей был перегружен. Не только с точки зрения группировки, но и времени доступа. Поскольку время доступа элемента является списком, а элемент в векторе не является тем же, поэтому векторы для группировки аргументов являются лучшим выбором, поскольку он отражает это (примерно) постоянное время доступа. Я также не сказал, что clojure имеет встроенный пролог, я сказал * предпочитаю * синтаксис, зарезервированный для использования таких вещей, как встроенные языки. Вы также заметили тег common-lisp по вопросу ... – Baggers

+0

..Это означает, что будут ответы, относящиеся к вещам, которые вы можете сделать в общем lisp, например, расширение читателя. – Baggers

Смежные вопросы