10

我有一大堆全局变量,每个变量都有自己的设置函数。我的目标是通过这个列表,调用每个项目的设置函数,并生成匹配变量中加载的数据的一些统计信息。但是,我现在尝试的方法不起作用,我需要帮助才能让我的程序调用设置函数。

全局变量及其设置函数是区分大小写的,因为它来自 XML 并且是唯一性所必需的。

数据看起来像这样:

'(ABCD ABC\d AB\c\d ...)

设置函数如下所示:

(defun setup_ABCD...  
(defun setup_ABC\d...

我尝试将它们连接在一起并将生成的字符串转换为函数,但这会干扰先前加载的设置函数的命名空间。这是我尝试实现的方法:

(make-symbol (concatenate 'string "setup_" (symbol-name(first '(abc\d)))))

但是funcall在这个上使用是行不通的。如何从中获取可调用函数?

4

3 回答 3

12

这是因为 MAKE-SYMBOL 返回了一个 uninterned 符号。您应该改用 INTERN。

于 2008-11-17T02:58:52.783 回答
0

我要么使用 INTERN 要么(可能,你必须配置文件以 100% 确定它有帮助)一个辅助函数,它执行字符串连接和初始查找,然后将结果缓存在哈希表中(键控原始符号)。这可能比纯 INTERN/CONCATENATE 解决方案更快,可能会产生更少的瞬态垃圾,但最终可能会使用更长期的存储。

类似于以下内容:

(defvar *symbol-function-map* (make-hash-table))

(defun 查找符号 (符号)
  (或(gethash 符号 *symbol-function-map*)
      (let ((function-name (intern (concatenate 'string "setup_" (symbol-name symbol)))))
        (setf (gethash symbol *symbol-function-map*) (symbol-function function-name)))))

如果您需要函数的名称,而不是函数本身,请忽略对 SYMBOL-FUNCTION 的调用。

于 2008-11-17T12:35:51.870 回答
0
(funcall (read-from-string (concatenate 'string "setup_" (symbol-name(first '(abc\d))))))  

也可以。

于 2011-07-22T14:48:06.103 回答