从名称空间映射符号重新定义符号

时间:2016-03-01 22:02:13

标签: scheme lisp racket

我不确定问题标题是否合适但这是我想知道的:

从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))))

所以,调用(模块绑定)返回一个符号列表。但是如果我尝试从该结果中调用符号,例如执行((第一个(模块绑定))),我会得到一个“应用程序:不是过程”错误,尽管第一个符号是一个过程。

如何调用该符号的相应程序?

2 个答案:

答案 0 :(得分:4)

您可以使用namespace-variable-value查找命名空间变量的值。由于您的namespace-symbols-set只使用当前命名空间(也是namespace-variable-value的默认命名空间),因此使用它非常简单。

例如,要调用与module-bindings过程返回的列表中第一项关联的过程:

((namespace-variable-value (car (module-bindings))))

或者,将首选命名空间指定为namespace-variable-value调用的第四个参数。

答案 1 :(得分:1)

您需要评估该符号,以便它返回相应的过程。

> (define (foo) 'bar)
> (eval 'foo)
#<procedure:foo>
> ((eval 'foo))
'bar

因此在你的情况下

((eval (car (module-bindings))))

将调用module-bindings返回的列表的第一个过程。