В чем разница между 1 и '1 в Лиспе? - PullRequest
33 голосов
/ 03 июня 2010

Я никогда не задумывался о том, может ли символ быть числом в Лиспе, поэтому я поиграл с ним сегодня:

> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2

Приведенный выше код является схемой, но, похоже, он примерно одинаков в Common Lisp и Clojure. Есть ли разница между 1 и 1?

Ответы [ 7 ]

26 голосов
/ 03 июня 2010

В Common Lisp '1 - это сокращение от (QUOTE 1). При оценке (QUOTE что-то ) возвращает часть что-то без оценки. Однако нет никакой разницы между 1 оцененным и 1 неоцененным.

Таким образом, для читателя есть различие: «1 читается как (Цитата 1), а 1 читается как 1. Но при оценке разницы нет.

14 голосов
/ 03 июня 2010

Числа самооценочные объекты .Вот почему вам не нужно беспокоиться о цитировании, как, например, со списками.

Символ может быть сделан из любой строки.Если вам нужен символ, имя которого является единственным символом 1, вы можете сказать:

(intern "1")

, который печатает |1|, предлагая альтернативный способ ввода его:

'|1|
11 голосов
/ 03 июня 2010

Заключение в кавычки предотвращает оценку выражений до позднего времени. Например, следующий список не является правильным:

(1 2 3)

Это потому, что Лисп интерпретирует 1 как функцию, а это не так. Таким образом, список должен быть процитирован:

'(1 2 3)

Когда вы цитируете очень простое выражение, такое как число, Лисп фактически не меняет своего поведения.

См. Википедия: Лисп .

9 голосов
/ 04 июня 2010

Ну, на самом деле они очень разные.'1, однако, точно такой же, как (quote 1).(car ''x) оценивается как символ «кавычка».

1 - это S-выражение, это внешнее представление элемента данных, числа 1. Сказать, что 1 - это «числовой объект».'или S-выражение для ввода этого объекта было бы приемлемым.Часто говорят, что 1 является внешним представлением для объекта фактического числа.

(quote 1) - это еще одно S-выражение, это S-выражение для списка , чей первый элементявляется символом «кавычка», а вторым элементом является число 1. Здесь это уже отличается, синтаксические ключевые слова, в отличие от функций, не считаются объектами в языке, и они не оценивают их.

Однакооба являются внешними представлениями объектов (данных), которые оценивают для одного и того же элемента данных.Число, внешнее представление которого равно 1, однако, это, безусловно, не одни и те же объекты, один и тот же код, одни и те же данные, что бы они ни были, они просто оценивают одно и то же.Числа оценивают сами.Сказать, что они одинаковы, значит сказать, что:

(+ 1 (* 3 3))

и

(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!")

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

Кроме того, меня научили удобному трюку, как толькопоказывает, что самооценочные данные на самом деле не являются символами при вводе:

(let ((num 4))
  (symbol? num) ; ====> evaluates to #f
  (symbol? 'num) ; ====> evaluates to #t
  (symbol? '4) ; ====> evaluates to #f
  (symbol? '#\c) ; #f again, et cetera
  (symbol? (car ''x)) ; #t
  (symbol? quote) ; error, in most implementations
)

Самооценочные данные действительно оценивают сами себя, они не являются «предопределенными символами» некоторых видов.

1 голос
/ 26 августа 2014

В Лиспе quote предотвращает вычисление следующего выражения. ' является сокращением для quote. В результате '1 совпадает с (quote 1).

Однако в Лиспе символы никогда не могут быть числом. Я имею в виду, 'abc является символом, но '123 не является (оценивается как) символом. Я думаю, что это неправильно дизайна Лисп. В другом случае не только #t или #f можно использовать как логическое выражение.

1 голос
/ 03 июня 2010

Как уже указывалось, нет никакой разницы, поскольку числа оценивают сами себя. Вы можете подтвердить это, используя eval:

(eval 1)  ;=> 1

Кстати, это не только цифры. На самом деле, в Common Lisp большинство вещей оценивают сами по себе. Просто очень редко можно оценить что-то кроме цифр, строк, символов и списков. Например, следующие работы:

(eval (make-hash-table))  ;equivalent to just (make-hash-table)
1 голос
/ 03 июня 2010

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

...