【发布时间】:2019-02-06 17:49:12
【问题描述】:
这是特定上下文中的一般符号问题。我想我需要回答的问题是:给定一个包含符号 'foo 的参数,我如何操作符号的包部分,使其 eql 到 'package:foo?
更具体的上下文:有一个单元测试包,fiveam,它将测试函数存储在哈希表 (it.bese.fiveam::*tests) 中,其中带有像 package::test-name 这样的键散列到包含测试的对象。要运行测试,通常将一个作为哈希键的符号传递给run! 函数:(run! 'package::test-name。如果我从定义测试的tests 包中调用run!,我可以在(run! 'test-name) 上按C-x C-e。从 SLIME REPL 调用时,我必须使用 (tests::run! 'tests::test-name),这有点不便。
我想使用 (run! 'test-name) 从 cl-user 运行测试并省略包名。我认为包装 run! 并将缺少的包添加到符号会很简单,但我所有的尝试都失败了,我想部分是因为 CL-USER:test-name 与 tests:test-name 不同。
有问题的哈希表使用eql 来测试相等性。在tests 包中:
(eql 'tests::foo 'foo) => T
在 CL-USER 中:
(eql 'tests::foo 'foo) => nil
各种函数可以返回符号(例如 intern、make-symbol 或 format-symbol),但它们都不等于哈希表中的键:
(eql (alexandria:format-symbol t "foo::bar") 'foo::bar) => nil
(eql (make-symbol "foo::bar") 'foo::bar) => nil
将其从 SLIME/REPL/FIVEAM 上下文中排除以概括我认为问题出在哪里,我无法弄清楚如何将 'bar 转换为 'foo:bar 作为符号。我可以手动将其指定为 'foo:bar,但我似乎无法得到任何 eql 'foo:bar,给定 'bar。
注意:我并不关心为包名输入额外的几个字母。我在这里真正想做的是提高我对范围和指定符号的理解。
谢谢。
【问题讨论】:
-
(find-symbol (symbol-name 'bar) :foo)将在名为FOO的包中返回名为BAR的符号,如果这样的符号被实习在那里。
标签: common-lisp symbols