разница между составной формой и специальной формой - PullRequest
2 голосов
/ 26 мая 2011

На странице 19 «Практического замысла» Люка ВандерХарта и Стюарта Сьерры, глава 2, есть параграф:

  • Определение специальных форм: Специальные формы - это особый тип составной формы. Для большинства целей они используются очень похоже на вызов функции. Разница в том, что первая форма специальной формы - это не определенная где-то функция, а специальная системная форма, встроенная в Clojure.

1-й вопрос , Является ли слово формы здесь опечаткой? Разве это слово не будет item ? Если нет, def a форма ? Это означает, что этот код содержит 3 формы. : -S

Позже, когда запись объясняла пример, он использовал item .

(def message "Hello, World!")
  • Анализируя первую форму (определение сообщения "Hello, World!"), Вы сначала видите, что она заключена в скобки. Следовательно, это список, и он будет оцениваться как приложение-функция или специальная форма. В списке три элемента : def, message и "Hello, World!". Первым элементом в списке, def, будет вызванная функция или специальная форма. В данном случае это особая форма. Но, как и функция, она принимает два параметра - переменную, которую нужно определить, и значение, к которому она привязана. Оценка этой формы создает переменную, которая устанавливает привязку значения "Hello, World!" на символьное сообщение.

* 2-й вопрос , является ли составной формой является специальной формой только в том случае, если первый элемент списка содержит только предопределено в Clojure ? Если да, то возможно ли создать специальную специальную форму? Тогда пользовательская составная форма будет называться специальной формой? Потому что, согласно определению, мой обычай - это не нечто встроенное в clojure, оно определено где-то еще.

EDIT: Я думаю, что ответ на мой первый вопрос - нет, это не опечатка. def - это форма.

потому что позже в записи написано,

  • Вторая форма (println message) также является списком, и на этот раз это обычное функциональное приложение. Он имеет двухкомпонентные формы - каждый из них является символом

Это означает, (println message)> все это форма, а все остальное (аргументы функции), которое она содержит, также является формой.

Но в начале автор сказал, что существует четыре основных разновидности форм.

  1. Буквально,
  2. Символ,
  3. Составная форма и
  4. Специальная форма.

Согласно определению Символов из книги, это не символ.

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

В какую категорию входит def ?

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

def - это специальная форма. Чтобы понять почему, подумайте, как бы вы оценили выражение def, если бы оно было функцией. Когда вы вводите выражение вроде (квадрат (* x y)), вы можете сначала оценить подвыражение (* x y), а затем применить квадрат к любому значению. Это не то, что происходит с def, и по уважительной причине, которую вы можете увидеть, если запустите REPL:

> (def a 1)

#'user/a

> (def a 2)

...

Что должно произойти дальше? Если бы def была нормальной функцией, REPL оценил бы a, а затем попытался бы применить def к аргументам 1 и 2: то есть попытался бы переопределить 1. Но что вы, вероятно, ожидаете сделать, это определить символ " a "оценить до 2 (забивая старый символ в процессе). Чтобы получить желаемое поведение из def и нескольких других встроенных процедур, которые были бы нарушены, если бы они оценивались как функции, эти специальные формы либо компилируются в интерпретатор, либо реализуются как макросы.

2 голосов
/ 27 мая 2011

Я написал эту главу.Определенно можно было бы написать лучше, но я попытаюсь прояснить это:

Чтобы ответить на ваш первый вопрос: Да, форма - правильное слово.Одиночный символ (например, def) по-прежнему является формой, поскольку форма - это все, что может быть вычислено.Я иногда говорю «пункт», но это просто более общее слово, которое я использовал, чтобы указать на «вещи» в списке.Технически, если он написан на коде Clojure и может быть eval'd, это форма.

Ваш второй вопрос: нет, составная форма - это что-то, построенное из других форм.Например, если я определю это:

(defn sq [x] (* x x))

И затем назову это

(sq 3) => 9

, выражение (sq 3) является составной формой, состоящей из двух других форм, первая из которыхявляется символом sq, который будет соответствовать вашей функции, второй является буквальным 3.

Термин «составная форма» не является формальным определением или чем-то еще, это просто самый простой способ выразить тот факт, что формы могут быть построены из других форм.Куда бы я ни захотел поставить 3, это правильный синтаксис, чтобы поставить x, и куда бы я ни положил x Я могу поставить (f x) - потому что они все просто формы.

Чтобы ответить на вашПоследний вопрос, def - это символ, который имеет особое значение для компилятора, поэтому в терминологии, которую я использовал в книге, это специальная форма.

1 голос
/ 26 мая 2011

1-й вопрос:

Да - я думаю, что "первый пункт особой формы" был бы более понятным в этих обстоятельствах. Но поскольку символ считается формой сам по себе, называть его «первой формой специальной формы» также технически правильно.

Имейте в виду, что первый элемент в особом случае иногда называется специальной формой, например, в «def - это особая форма». Я думаю, что здесь есть некоторая путаница в терминологии, но если вы понимаете концепцию специальной формы, то обычно ясно, что имеется в виду. В целом, вы будете правы, если под "особой формой" будете понимать всю форму.

Вопрос об определении формы Lisp очень полезен здесь.

2-й вопрос

Да - специальные формы существуют только тогда, когда первый символ является одним из символов специальной формы, предопределенных в Clojure. См. http://clojure.org/special_forms для полезного списка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...