#scheme #lisp #chez-scheme
#схема #lisp #chez-схема
Вопрос:
Мне любопытно, почему схема Chez не рассматривает числа как символы. Независимо от того, находятся ли они в списке или заключены в кавычки отдельно, number?
возвращает значение true, означающее, что оно не было преобразовано в символ. Есть ли для этого практическая причина?
Chez Scheme Version 9.5.4
Copyright 1984-2020 Cisco Systems, Inc.
> (number? (car '(1 2 3 4 5)))
#t
> (symbol? (car '(1 2 3 4 5)))
#f
> (define symbolic-num '5)
> (number? symbolic-num)
#t
> (symbol? symbolic-num)
#f
>
Ответ №1:
Это не относится к Chez, но является стандартным поведением; см., Например, R5RS:
Правила написания символа точно такие же, как и правила написания идентификатора [6.3.3 Символы]
Таким образом, числовой литерал не может быть символом, потому что это не идентификатор.
Теперь 'e
это сокращение для (quote e)
, и
(quote <datum>)
вычисляется<datum>
как . [4.1.2 Литеральные выражения]
То есть (quote 1)
— '1
— вычисляет 1
, что является целым числом, и (quote a)
— 'a
— вычисляет a
, что является символом.
Числовые константы, строковые константы, символьные константы и логические константы вычисляются `сами по себе»; их не нужно заключать в кавычки. [4.1.2 Буквальные выражения]
Это немного сбивает с толку, потому что REPL печатают некоторые вещи в форме «сокращенных кавычек», но это всего лишь соглашение о выводе.
Обратите внимание, что (display 'a)
это покажет a
, а не 'a
.
Комментарии:
1. Спасибо! Это имеет смысл.