Каково различие между 1 и '1 в Lisp?

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

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

Вышеупомянутый код является схемой, но это, кажется, примерно то же в языке Common LISP и Clojure также. Есть ли какое-либо различие между 1 и заключило в кавычки 1?

33
задан Jason Baker 3 June 2010 в 14:15
поделиться

6 ответов

Ну, на самом деле они очень разные. '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
)

Самооценивающиеся данные действительно оценивают сами себя, они не являются какими-то "предопределенными символами".

9
ответ дан 27 November 2019 в 18:10
поделиться

В Common Lisp «1» является сокращением для (QUOTE 1). При оценке (QUOTE something ) возвращает неоцененную часть something . Однако нет никакой разницы между 1 оцененным и 1 неоцененным.

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

26
ответ дан 27 November 2019 в 18:10
поделиться

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

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

(intern "1")

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

'|1|
14
ответ дан 27 November 2019 в 18:10
поделиться

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

(1 2 3)

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

'(1 2 3)

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

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

11
ответ дан 27 November 2019 в 18:10
поделиться

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

(eval 1)  ;=> 1

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

(eval (make-hash-table))  ;equivalent to just (make-hash-table)
1
ответ дан 27 November 2019 в 18:10
поделиться

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

1
ответ дан 27 November 2019 в 18:10
поделиться