2009-07-22 5 views

ответ

2

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

+3

У схемы нет классов. И «define» действительно определяет переменные - «lambda» определяет функции. (define (a b c) ...) эквивалентно (define a (lambda (b c) ...)) –

+2

В схеме 'lambda' does * not * определяет функцию, она только создает ее. 'define' используется для * all * определений. И да, у «Схемы» нет классов, но практически во всех системах классов Scheme (и почти во всех реализациях есть какая-то система OO) 'define' также используется для определения классов, просто случается, что выражение, которое используется в определение оценивается классом. –

15

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 как mnemomic устройство для def + fn. Такие ярлыки делают меньше кодировки и делают код более простым для чтения в целом. Я преподаю кому-то, как программировать Scheme на данный момент, и я заставляю их использовать длинные формы, чтобы они всегда имели в виду, что делает этот язык (и по достоинству оценят макрос сохранения работы, когда они наконец начнут используя их).

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

+1

Ваша схема там неправильная - имя функции и аргумент должны быть заключены в скобки. Кроме того, ваше объяснение - лишь малая часть всей картины.«Сахарная» версия определений Scheme - это «не *», чтобы избежать кода шаблона - его проще использовать (особенно для новичков), так как вещь, которая определена *, выглядит как * ее использование. Другими словами, вы определяете что-то, что похоже на символический шаблон для последующего использования функции. –

+0

Вы правы. Пытается держать слишком много разных пятен в голове сразу. Схема - это нечетное выделение на этом конкретном кусочке сахарирования, и поскольку я не очень много использовал Схему и избегаю сахарообразной формы, когда я это делаю, я взорвал ее. Исправленный. – Pinochle

+1

Я не заметил, что маленький когнитивный «примитивный трюк» играет сахаристская форма, которая предвосхищает будущее использование функции в s-выражении, аккуратно. Я этого не заметил, по крайней мере, не сознательно. Что-то всегда беспокоило меня об этой форме, и теперь я знаю, что это такое. Исходный трюк зависит от того, как мозг понимает, что синтаксис 'define' не имеет никакого отношения к s-выражению, а не дает значение имени (атому). Наверное, это то, что подсознательно отметил «семантическая неточность», вызвало у меня беспокойство. – Pinochle

1

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

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

+0

«defn - это макрос, который добавляет сахар для удобства установление docstrings и метаданных »: Но даже такие переменные могли бы извлечь выгоду из таких функций. Этот аргумент был бы прав только в том случае, если аргумент состоял в том, что defn должен вести себя как def.« def для всего приведет к большому количеству шаблонов ». Не могли бы вы рассказать на его это следует? Схема кода, как сказал Эли, использовать определение для обозначения переменных, функций и классов ... без каких-либо шаблонов. – kanak

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