Какой смысл использовать def и defn вместо определения? - PullRequest
6 голосов
/ 22 июля 2009

В Схеме мы только что определили для всех определений, почему Clojure и Lisp используют разные ключевые слова для разных объявлений?

Ответы [ 3 ]

16 голосов
/ 22 июля 2009

defn, defmacro, defstruct и тому подобное - просто макросы для определения их соответствующей структуры, что делает ненужным написание стандартного кода. Например, defn упрощает написание функций, поскольку вам больше не нужно беспокоиться о введении лямбда-термина (что можно сделать в схеме, просто заключив аргументы в скобки сразу после определения имени):

Схема:

(define hello
  (lambda (name)
    (display (string-append "hello, " name))))


(define (hello name)
  (display (string-append "hello, " name)))

Clojure:

(def hello
  (fn [name]
    (println (str "hello, " name))))

(defn hello [name]
  (println (str "hello, " name)))

Вы можете посмотреть на defn как мнемосхему для def + fn. Такие сочетания клавиш упрощают кодирование и упрощают чтение кода в целом. Я учу кого-то, как программировать Scheme в данный момент, и заставляю их использовать длинные формы, чтобы они всегда имели в виду, что делает язык (и будут ценить макросы, спасающие работу, еще больше, когда они, наконец, начнут работать используя их).

Формы define или def дают имя некоторому следующему выражению. Форма lambda или fn дает имени набор привязок при использовании в выражении define или def. Именно здесь все становится более сложным, а использование макрокоманд сохраняет вас в здравом уме и защищает от набитого текста.

2 голосов
/ 22 июля 2009

Они определяют различные виды объектов (функции, специальные переменные, макросы, структуры, классы, универсальные функции, методы, пакеты). В Common Lisp они также находятся в разных пространствах имен. Различные формы определения также имеют разный синтаксис (схема define объединяет определение переменной и функции. Но может ли она определить класс?)

1 голос
/ 23 июля 2009

def в Clojure - это особая форма, и желательно, чтобы специальные формы были максимально простыми и примитивными. defn - это макрос, который добавляет сахар для легкой установки строк документации и метаданных и (как уже говорили другие) устраняет необходимость в посторонних паренах. defn также автоматически устанавливает некоторые метаданные для самой вашей функции (показывая списки участников и т. Д.), Что не имеет смысла для общих def.

Функции - безусловно, самая распространенная вещь, которую вы собираетесь определять для верхнего уровня в Clojure. Изменяемые переменные верхнего уровня не приветствуются. Поэтому имеет смысл иметь простой и быстрый способ определения функции верхнего уровня. Использование def для всего приведет к большому количеству шаблонов. Если бы не было defn, мы бы все заново изобрели это, чтобы не быть раздраженными до смерти.

...