Scheme 如何在“函数”中找到所有函数和有界符号;环境",;

Scheme 如何在“函数”中找到所有函数和有界符号;环境",;,scheme,environment,Scheme,Environment,我使用的是一个有内置方案解释器的软件。我知道“环境”的名字是(环境)。如何找到环境中的所有功能和符号 (define p (open-output-file "d:/test.txt")) (display (the-environment) p) 这会显示所有功能吗? 提前谢谢。 Joe正如Eli Barzilay所指出的,您是否能够反射式地找到环境中绑定的所有名称取决于您使用的方案的实现 我从你的问题推断,你是在麻省理工学院的方案中工作,因为你说环境的“名称”是(环境) 通过我自己对MIT

我使用的是一个有内置方案解释器的软件。我知道“环境”的名字是(环境)。如何找到环境中的所有功能和符号

(define p (open-output-file "d:/test.txt"))
(display (the-environment) p)
这会显示所有功能吗? 提前谢谢。
Joe

正如Eli Barzilay所指出的,您是否能够反射式地找到环境中绑定的所有名称取决于您使用的方案的实现

我从你的问题推断,你是在麻省理工学院的方案中工作,因为你说环境的“名称”是
(环境)

通过我自己对MIT Scheme(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-lookup system-global-environment '+)

;Value 14: #[arity-dispatched-procedure 14]

1 ]=> ((environment-lookup system-global-environment '+) 2 3)

;Value: 5
当我第一次遇到上述情况时,我有点惊讶;我曾期望在环境中看到更多的绑定,而不仅仅是我自己定义的单个绑定

这是因为您需要递归地进入父环境吗?嗯:

1 ]=> (environment-parent (the-environment))

;Value: #f

1 ]=> 
除了可以通过检查
(环境)
访问的绑定之外,还必须检查通过
系统全局环境访问的绑定:

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?
在此基础上,可以使用
环境查找
等函数提取每个环境中绑定的值:

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-lookup system-global-environment '+)

;Value 14: #[arity-dispatched-procedure 14]

1 ]=> ((environment-lookup system-global-environment '+) 2 3)

;Value: 5
(例如,如果要将
全局名称
列表筛选为仅绑定到系统全局环境中的过程的名称,这可能非常有用。)


仅供参考:我不知道上面这些我的头顶;但幸运的是,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

正如Eli Barzilay所指出的,您是否能够反射式地找到环境中绑定的所有名称取决于您使用的方案的实现

我从你的问题推断,你是在麻省理工学院的方案中工作,因为你说环境的“名称”是
(环境)

通过我自己对MIT Scheme(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-lookup system-global-environment '+)

;Value 14: #[arity-dispatched-procedure 14]

1 ]=> ((environment-lookup system-global-environment '+) 2 3)

;Value: 5
当我第一次遇到上述情况时,我有点惊讶;我曾期望在环境中看到更多的绑定,而不仅仅是我自己定义的单个绑定

这是因为您需要递归地进入父环境吗?嗯:

1 ]=> (environment-parent (the-environment))

;Value: #f

1 ]=> 
除了可以通过检查
(环境)
访问的绑定之外,还必须检查通过
系统全局环境访问的绑定:

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?
在此基础上,可以使用
环境查找
等函数提取每个环境中绑定的值:

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-lookup system-global-environment '+)

;Value 14: #[arity-dispatched-procedure 14]

1 ]=> ((environment-lookup system-global-environment '+) 2 3)

;Value: 5
(例如,如果要将
全局名称
列表筛选为仅绑定到系统全局环境中的过程的名称,这可能非常有用。)


仅供参考:我不知道上面这些我的头顶;但幸运的是,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

取决于实现。哪些方案实现将环境作为其标准库的一部分提供?我很快在谷歌上搜索,发现麻省理工学院的计划就是其中之一。因此,也许我们可以假设Joe在MIT Scheme中……这取决于实现。哪个方案实现提供了
环境作为其标准库的一部分?我很快在谷歌上搜索,发现麻省理工学院的计划就是其中之一。所以也许有人可以假设乔参加了麻省理工学院的计划。。。