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

В чем разница между 1 и 1 в Lisp?

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

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

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

4b9b3361

Ответ 1

Ну, они на самом деле очень разные. '1, однако, точно совпадает с (quote 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!")

"То же самое", они не являются, они оба разные программы, которые просто заканчиваются на одно и то же значение, форма 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
)

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

Ответ 2

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

Таким образом, для читателя есть разница: "1 читается как (QUOTE 1), а 1 читается как 1. Но нет никакой разницы, если его опровергнуть.

Ответ 3

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

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

(intern "1")

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

'|1|

Ответ 4

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

(1 2 3)

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

'(1 2 3)

При цитировании очень простого выражения, такого как число, Lisp эффективно не изменяет его поведение.

См. Википедия: Lisp.

Ответ 5

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

Ответ 6

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

(eval 1)  ;=> 1

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

(eval (make-hash-table))  ;equivalent to just (make-hash-table)

Ответ 7

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

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