代码之家  ›  专栏  ›  技术社区  ›  AlbusMPiroglu

从命名空间映射符号中重新内部化符号

  •  2
  • AlbusMPiroglu  · 技术社区  · 9 年前

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

    从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 回复  |  直到 9 年前
        1
  •  4
  •   C. K. Young    9 年前

    您可以使用 namespace-variable-value 。自从你 namespace-symbols-set 只使用当前名称空间,这也是的默认名称空间 命名空间变量值 ,使用它非常简单。

    例如,要调用与您的 module-bindings 程序:

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

    或者,将首选名称空间指定为 命名空间变量值 呼叫

        2
  •  1
  •   Kevin    9 年前

    您需要对该符号进行求值,以便它返回相应的过程。

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

    因此,在你的情况下

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

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