Каково объяснение позади использования определения, и defn вместо просто определяют?

6
задан unj2 22 July 2009 в 04:20
поделиться

3 ответа

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

Схема:

(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 дают имя некоторому последующему выражению. Форма лямбда или fn дает имени набор привязок при использовании в выражении define или def . Здесь все становится сложнее, и использование макроформ сохраняет ваше рассудок и защищает от скуки набора текста.

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

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

16
ответ дан 8 December 2019 в 12:22
поделиться

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

2
ответ дан 8 December 2019 в 12:22
поделиться

def in Clojure is a special form and it's nice to keep special forms as simple and primitive as possible. defn is a macro that adds sugar for easily setting docstrings and metadata, and (as others have said) removes the need for extraneous parens. defn also automatically sets up some metadata on your function itself (showing arglists etc.) which makes no sense for a general def.

Functions are by far the most common thing you're going to be defining toplevel in Clojure. Toplevel mutable variables are discouraged. So it makes sense to have an easy and fast way to define a toplevel function. Using def for everything would result in a lot of boilerplate. If there was no defn we'd all be reinventing it ourselves to avoid being annoyed to death.

1
ответ дан 8 December 2019 в 12:22
поделиться