我有一个很大的全局变量列表,每个变量都有自己的设置功能。我的目标是遍历此列表,调用每个项目的设置函数,并生成匹配变量中加载的数据的一些统计信息。但是,我现在正在尝试的是不工作,我需要帮助才能使我的程序调用设置功能。
全局变量及其设置函数区分大小写,因为它来自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
不起作用。如何从中获得可调用函数?
答案 0 :(得分:12)
这是因为MAKE-SYMBOL返回一个未加载的符号。你应该使用INTERN。
答案 1 :(得分:0)
我要么使用INTERN,要么(可能需要分析100%确定它是有帮助的)辅助函数,它执行字符串连接和初始查找,然后将结果缓存在哈希表中(键入关闭)原始符号)。这可能比纯粹的INTERN / CONCATENATE解决方案更快,可能产生更少的瞬态垃圾,但最终会使用更长期的存储。
有些事情:
(defvar *symbol-function-map* (make-hash-table)) (defun lookup-symbol (symbol) (or (gethash symbol *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的调用。
答案 2 :(得分:0)
(funcall (read-from-string (concatenate 'string "setup_" (symbol-name(first '(abc\d))))))
也有效。