Проверьте, связан ли символ
В 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.