Я действительно никогда не думал о том, мог ли символ быть числом в Lisp, таким образом, я играл вокруг с ним сегодня:
> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
Вышеупомянутый код является схемой, но это, кажется, примерно то же в языке Common LISP и Clojure также. Есть ли какое-либо различие между 1 и заключило в кавычки 1?
Ну, на самом деле они очень разные. '1
, однако, точно такое же, как (цитата 1)
. (car ''x)
оценивает символ 'quote'.
1
является S-выражением, это внешнее представление данности, числа 1. Сказать, что 1
- это "число-объект" или S-выражение для ввода этого объекта - оба варианта будут приемлемы. Часто говорят, что 1
- это внешнее представление для реального объекта числа.
(quote 1)
- это другое S-выражение, это S-выражение для списка, первым элементом которого является символ 'quote', а вторым - число 1. Здесь уже другое дело, синтаксические ключевые слова, в отличие от функций, не считаются объектами в языке и не оцениваются им.
Однако оба они являются внешними представлениями объектов (данных), которые оцениваются одним и тем же числом. Число, чьим внешним представлением является 1
, они, однако, совершенно точно не являются одними и теми же объектами, одним и тем же, кодом, одной и той же данностью, чем бы то ни было, они просто оценивают одну и ту же вещь. Числа оценивают сами себя. Сказать, что они одинаковые, значит сказать, что:
(+ 1 (* 3 3))
и
(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!")
они "одинаковые", это не так, они обе разные программы, которые просто случайно завершаются одним и тем же значением, форма лиспа - это тоже программа, форма - это данность, которая тоже программа, помните.
Кроме того, однажды меня научили удобному трюку, который показывает, что самооценивающиеся данные действительно не являются символами при вводе:
(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
)
Самооценивающиеся данные действительно оценивают сами себя, они не являются какими-то "предопределенными символами".
В Common Lisp «1» является сокращением для (QUOTE 1). При оценке (QUOTE something ) возвращает неоцененную часть something . Однако нет никакой разницы между 1 оцененным и 1 неоцененным.
Итак, для читателя есть разница: «1 читается как (ЦИТАТА 1), а 1 - как 1. Но при вычислении разницы нет.
Числа - это самооценка объектов . Вот почему вам не нужно беспокоиться о цитировании их, как, скажем, со списками.
Символ можно составить из любой строки. Если вам нужен символ, имя которого представляет собой одиночный символ 1
, вы можете сказать:
(intern "1")
, который печатает | 1 |
, предлагая альтернативный способ его ввода:
'|1|
Заключение в кавычки предотвращает вычисление выражений на потом. Например, следующий список не является правильным:
(1 2 3)
Это потому, что Lisp интерпретирует 1 как функцию, а это не так. Итак, список должен быть заключен в кавычки:
'(1 2 3)
Когда вы цитируете очень простое выражение, такое как число, Лисп фактически не меняет его поведения.
См. Википедия: Лисп .
Как было указано, нет никакой разницы, поскольку числа оценивают сами себя. Вы можете подтвердить это, используя eval
:
(eval 1) ;=> 1
Между прочим, это не ограничивается числами. Фактически, в Common Lisp большинство вещей оцениваются сами по себе. Просто очень редко оценивается что-то, кроме чисел, строк, символов и списков. Например, следующие работы:
(eval (make-hash-table)) ;equivalent to just (make-hash-table)
В Лиспе апостроф предотвращает вычисление символов. Использование апострофа перед числом не запрещено, в нем нет необходимости, поскольку числа представляют сами себя. Однако, как и любой другой список, он автоматически преобразуется в соответствующий вызов функции. Интерпретатор считает, что эти числа совпадают со своим значением.