函数名称作为Lisp中的字符串?

时间:2008-11-17 02:52:09

标签: lisp common-lisp

我有一个很大的全局变量列表,每个变量都有自己的设置功能。我的目标是遍历此列表,调用每个项目的设置函数,并生成匹配变量中加载的数据的一些统计信息。但是,我现在正在尝试的是不工作,我需要帮助才能使我的程序调用设置功能。

全局变量及其设置函数区分大小写,因为它来自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不起作用。如何从中获得可调用函数?

3 个答案:

答案 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))))))  

也有效。