re-internilizing 来自 namespace-mapped-symbols 的符号
re-internilizing a symbol from namespace-mapped-symbols
我不确定问题标题是否合适,但我想知道的是:
我想从 repl 中获取当前模块中定义的绑定列表。经过一些搜索,这似乎是一个很好的解决方案:
(define (racket-symbols-set)
(list->set (namespace-mapped-symbols (module->namespace 'racket))))
(define (namespace-symbols-set)
(list->set (namespace-mapped-symbols)))
(define (module-bindings)
(set->list (set-subtract
(namespace-symbols-set)
(racket-symbols-set))))
因此,调用 (module-bindings) returns 符号列表。但是,如果我尝试从该结果中调用一个符号,例如执行 ((first (module-bindings))),我会得到一个 "application: not a procedure" 错误,尽管第一个符号是一个过程。
如何调用该交易品种对应的程序?
您需要对该符号求值,以便return执行相应的程序。
> (define (foo) 'bar)
> (eval 'foo)
#<procedure:foo>
> ((eval 'foo))
'bar
因此在你的情况下
((eval (car (module-bindings))))
将调用 return 由 module-bindings
编写的列表的第一个过程。
您可以使用 namespace-variable-value
查找命名空间变量的值。而且由于您的 namespace-symbols-set
只使用当前命名空间,这也是 namespace-variable-value
的默认命名空间,因此使用它非常简单。
例如,要调用与您的 module-bindings
过程返回的列表中的第一项关联的过程:
((namespace-variable-value (car (module-bindings))))
或者,将您的首选命名空间指定为 namespace-variable-value
调用的第四个参数。
我不确定问题标题是否合适,但我想知道的是:
我想从 repl 中获取当前模块中定义的绑定列表。经过一些搜索,这似乎是一个很好的解决方案:
(define (racket-symbols-set)
(list->set (namespace-mapped-symbols (module->namespace 'racket))))
(define (namespace-symbols-set)
(list->set (namespace-mapped-symbols)))
(define (module-bindings)
(set->list (set-subtract
(namespace-symbols-set)
(racket-symbols-set))))
因此,调用 (module-bindings) returns 符号列表。但是,如果我尝试从该结果中调用一个符号,例如执行 ((first (module-bindings))),我会得到一个 "application: not a procedure" 错误,尽管第一个符号是一个过程。
如何调用该交易品种对应的程序?
您需要对该符号求值,以便return执行相应的程序。
> (define (foo) 'bar)
> (eval 'foo)
#<procedure:foo>
> ((eval 'foo))
'bar
因此在你的情况下
((eval (car (module-bindings))))
将调用 return 由 module-bindings
编写的列表的第一个过程。
您可以使用 namespace-variable-value
查找命名空间变量的值。而且由于您的 namespace-symbols-set
只使用当前命名空间,这也是 namespace-variable-value
的默认命名空间,因此使用它非常简单。
例如,要调用与您的 module-bindings
过程返回的列表中的第一项关联的过程:
((namespace-variable-value (car (module-bindings))))
或者,将您的首选命名空间指定为 namespace-variable-value
调用的第四个参数。