Как найти все функции и ограниченные символы в «среде» - PullRequest
2 голосов
/ 30 декабря 2010

Я использую более мягкую программу, у которой есть встроенный интерпретатор схем.Я знаю, что «окружение» зовут (окружение).Как я могу найти все функции и символы в окружающей среде?

(define p (open-output-file "d:/test.txt"))
(display (the-environment) p)

Может ли это отобразить все функции?Заранее спасибо.Джо

1 Ответ

0 голосов
/ 25 февраля 2013

Как отметил Эли Барзилай, то, сможете ли вы рефлексивно найти все имена, связанные в среде, зависит от того, какую реализацию Схемы вы используете.

Из вашего вопроса я делаю вывод, что вы работаете в рамках 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
...