Подтвердить что ты не робот

Существуют ли формы Lisp и выражения Lisp?

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

4b9b3361

Ответ 1

Определения и использование этих терминов различаются диалектом и сообществом Lisp, поэтому нет четкого ответа на ваш вопрос для Lisps в целом.

Для использования в Common Lisp см. подробный ответ Райнера. Чтобы дать краткое резюме:

Запись HyperSpec для form:

форма n. 1. любой объект, который должен быть оценен. 2. символ, соединение формы или самооценки объекта. 3. (для оператора, как в <<operator>> form'') a compound form having that operator as its first element. Форма цитаты - это постоянная форма. '

Запись HyperSpec для expression:

выражение n. 1. объект, часто используемый, чтобы подчеркнуть использование объект для кодирования или представления информации в специализированном формате, таких как текст программы. The second expression in a let form is a list of bindings.'' 2. the textual notation used to notate an object in a source file. Выражение 'sample эквивалентно (quote образец). ''

Итак, согласно выражению HyperSpec, выражение используется для (текстового) представления, тогда как форма используется для объектов Lisp для оценки. Но, как я сказал выше, это только определение этих терминов в контексте HyperSpec (и, следовательно, Common Lisp).

В схеме, однако, R5RS не упоминает форму вообще и говорит только о выражениях. R6RS даже дает определение, которое почти похоже на то, что противоположно выше:

На чисто синтаксическом уровне оба являются формами, а форма - общее имя для синтаксической части программы Scheme.

(Говоря о разнице между (define …) и (* …).)

Ответ 2

Резюме

A form является Lisp кодом в качестве данных. expression - это данные как текст.

Объяснение

В Common Lisp форма и выражение имеют два разных значения, и полезно понять разницу.

Форма - это фактический объект данных внутри текущей системы Lisp. Форма является допустимым входом для оценщика Lisp.

EVAL принимает форму в качестве аргумента.

Синтаксис:

eval form => result*

EVAL не получает текстового ввода в виде выражений Lisp. Он получает формы. Что такое Lisp данные: числа, строки, символы, программы в виде списков,...

CL-USER 103 > (list '+ 1 2)
(+ 1 2)

Над строками форма Lisp: здесь список с символом + в качестве первого элемента, а числа 1 и 2 - как следующие элементы. + обозначает функцию, а два числа - это аргументы. Таким образом, это действительный вызов функции.

CL-USER 104 > (eval (list '+ 1 2))
3

Выше выдает форму EVAL и вычисляет результат. Мы не можем видеть формы напрямую - мы можем позволить системе Lisp создавать для нас печатные представления.

Форма представляет собой выражение Lisp как объект данных.

Это немного необычно, поскольку большинство языков программирования определяются путем описания текстового ввода. Общий Lisp описывает ввод данных в EVAL. Формы как структуры данных.

После этого создается форма Lisp:

"foo"         ; strings evaluate to themselves

'foo          ; that evaluates to a symbol, which then denotes a variable

123

(list '+ 1 2) ; evaluates to a list, which describes a function call

'(+ 1 2)      ; evaluates to a list, which describes a function call

Пример использования:

CL-USER 105 > (defparameter foo 42)
FOO

CL-USER 106 > (eval 'foo)
42

Ниже приведены не создание допустимых форм:

'(1 + 2)            ; Lisp expects prefix form

(list 1 '+ 2)       ; Lisp expects prefix form

'(defun foo 1 2)'   ; Lisp expects a parameter list as third element

Пример:

CL-USER 107 > (eval '(1 + 2))

Error: Illegal argument in functor position: 1 in (1 + 2).

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

Если вы видите Lisp данные на вашем экране или листе бумаги, это выражение.

(1 + 2)             ; is a valid expression in a text, `READ` can read it.

Ответ 3

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

Так, например, рассмотрим форму (lambda (x) (+ x 1)). Это список из трех элементов: символ lambda, список (x) и список (+ x 1). Все эти элементы являются формами, но только последнее является выражением, потому что оно "предназначено" для оценки; первые две формы перетасовываются макроэкрандером, но никогда не оцениваются. Самая внешняя форма (lambda (x) (+ x 1)) сама по себе является выражением.

Мне кажется, что это интересное различие, но оно означает, что оно чувствительно к контексту: (x) всегда является формой и может быть или не быть выражением, зависящим от контекста.