Как отметил Эли Барзилай, то, сможете ли вы рефлексивно найти все имена, связанные в среде, зависит от того, какую реализацию Схемы вы используете.
Из вашего вопроса я делаю вывод, что вы работаете в рамках MIT Scheme, поскольку вы сказали, что "имя" среды - (the-environment)
Из моих собственных экспериментов со схемой MIT (выпуск 9.1.1) вы действительно можете перечислить имена привязок, связанных в среде:
1 ]=> (define (add1 n) (+ n 1))
;Value: add1
1 ]=> (add1 3)
;Value: 4
1 ]=> (environment-bound-names (the-environment))
;Value 13: (add1)
1 ]=>
Я был немного удивлен, когда впервые столкнулся с вышесказанным; Я ожидал увидеть гораздо больше привязок в окружающей среде, чем только один, который я определил сам.
Это потому, что вам нужно рекурсивно подходить к родительской среде? Ну:
1 ]=> (environment-parent (the-environment))
;Value: #f
1 ]=>
Похоже, что помимо привязок, к которым вы можете получить доступ путем проверки (the-environment)
, необходимо также проверить привязки, доступные через system-global-environment
:
1 ]=> (define global-names (environment-bound-names system-global-environment))
;Value: global-names
1 ]=> (length global-names)
;Value: 4050
1 ]=> (not (null? (memq '+ global-names)))
;Value: #t
1 ]=> (car global-names)
;Value: valid-hash-number?
Оттуда можно использовать такие функции, как environment-lookup
, чтобы извлечь значения, ограниченные в каждой среде:
1 ]=> (environment-lookup system-global-environment '+)
;Value 14: #[arity-dispatched-procedure 14]
1 ]=> ((environment-lookup system-global-environment '+) 2 3)
;Value: 5
(Это может быть полезно, например, если вы хотите отфильтровать список global-names
только по именам, которые связаны с процедурами в глобальной среде системы.)
К вашему сведению: я не знал вышеизложенного на макушке; но, к счастью, MIT Scheme, как и ряд других диалектов Lisp, предлагает функцию apropos
, которая очень полезна, когда вы думаете, что знаете часть имени функции, которую вы ищете. (apropos n)
распечатывает все связанные символы с n
в названии; поэтому в моем случае я сделал предположение и набрал (apropos 'env)
, чтобы увидеть все символы, связанные с окружающей средой. Этот список слишком длинный для того, чтобы его можно было привести в качестве примера, но вот что-то похожее:
1 ]=> (apropos 'lookup)
#[package 14 (user)]
#[package 15 ()]
1d-table/lookup
dld-lookup-symbol
environment-lookup
environment-lookup-macro
environment-safe-lookup
hash-table/lookup
rb-tree/lookup
wt-tree/lookup
;Unspecified return value