Проверьте, связан ли символ

В Emacs Lisp (boundp 'symbol) возвращается t если symbol привязан к некоторому значению, nil иначе. Есть ли эквивалентная процедура в схеме Гиле?

1 ответ

Решение

Схема избегает утечки реализации в спецификацию и говорит об "идентификаторах", а не о привязке интернированного символа к значению - см. §2.1 R7RS. В схеме "идентификатор" - это просто имя.

Имя идентификатора обрабатывается как идентифицирующее переменную, если только оно не идентифицирует макрос (синтаксис) или если оно находится в контексте, требующем его обработки как идентифицирующего символа, например, в кавычках. В частности, §2.1 R7RS гласит: "Когда идентификатор появляется как литерал или внутри литерала (см. Раздел 4.1.2), он используется для обозначения символа (см. Раздел 6.5)". Вы можете проверить, идентифицирует ли идентификатор символ с символом? процедура.

Схема Guile на самом деле реализует идентификаторы путем интернирования символов, и вы можете запросить, связан ли символ с помощью define?:

(defined? 'num)

=> #f

(define num 1)(defined? 'num)

=> #t

Это хитрая реализация, а не переносимая схема.

Изменить: Обратите внимание, что определено? работает только с переменными верхнего уровня, определенными с помощью define. Он не работает с let и cognates.

Другие вопросы по тегам