【问题标题】:re-internilizing a symbol from namespace-mapped-symbols从命名空间映射符号重新内部化符号
【发布时间】:2016-06-14 13:16:50
【问题描述】:

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

从 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) 返回符号列表。但是,如果我尝试从该结果中调用一个符号,例如执行 ((first (module-bindings))),我会收到“应用程序:不是过程”错误,尽管第一个符号是一个过程。

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

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    您可以使用namespace-variable-value 查找命名空间变量的值。而且由于你的namespace-symbols-set只是使用了当前的命名空间,这也是namespace-variable-value的默认命名空间,所以使用起来非常简单。

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

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

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

    【讨论】:

    • 好点,克里斯!看来我很快就会阅读球拍参考第 14 章了。
    【解决方案2】:

    您需要评估该符号以使其返回相应的过程。

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

    因此在你的情况下

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2019-04-24
      相关资源
      最近更新 更多