2008-11-17 60 views
9

我有一个全局变量的大名单,每个变量都有自己的设置功能。我的目标是通过这个列表,调用每个项目的设置函数,并为匹配变量中加载的数据生成一些统计信息。然而,我现在正在尝试的是不工作,我需要帮助,使我的程序调用设置功能。函数名称作为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不起作用。我怎样才能从这个获得可调用的函数?

+0

如果没有人的答案奏效,将它标记为已通过点击打勾即可。 – Pablo 2008-11-17 11:07:01

+0

Lisp中的namegiving标准是使用连字符而不是下划线。此外,读者在内部大写所有符号,标准是将它们写成小写,所以调用您的设置函数的标准方式是“setup-abcd”。 – Svante 2008-11-17 13:00:36

回答

12

这是因为MAKE-SYMBOL返回一个未插入的符号。您应该使用INTERN来代替。

0

我要么使用INTERN或(可能,你必须配置为100%确定它是有帮助的)帮助函数,执行字符串连接和初始查找,然后将结果缓存到散列表(键入关闭原始符号)。这可能比纯粹的INTERN/CONCATENATE解决方案更快,可能会产生更少的暂时垃圾,但是probalby最终会使用更长期的存储。

线沿线的东西:

 
(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))))) 

如果需要的函数的名称,而不是本身的功能,离开了呼叫符号功能。

0
(funcall (read-from-string (concatenate 'string "setup_" (symbol-name(first '(abc\d)))))) 

也适用。