Цитирование числовых констант в схеме Chez

#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. Спасибо! Это имеет смысл.