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
. Именно здесь все становится более сложным, а использование макрокоманд сохраняет вас в здравом уме и защищает от набитого текста.