函数名在Lisp中是字符串吗?

函数名在Lisp中是字符串吗?,lisp,common-lisp,Lisp,Common Lisp,我有一个大的全局变量列表,每个变量都有自己的设置函数。我的目标是浏览这个列表,调用每个项的setup函数,并生成一些匹配变量中加载的数据的统计信息。但是,我现在尝试的方法不起作用,我需要帮助使我的程序调用设置函数 全局变量及其设置函数区分大小写,因为它来自XML,并且是唯一性所必需的 数据如下所示: '(ABCD ABC\d AB\c\d ...) (defun setup_ABCD... (defun setup_ABC\d... 设置功能如下所示: '(ABCD ABC\d AB\c

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

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

数据如下所示:

'(ABCD ABC\d AB\c\d ...)
(defun setup_ABCD...  
(defun setup_ABC\d...
设置功能如下所示:

'(ABCD ABC\d AB\c\d ...)
(defun setup_ABCD...  
(defun setup_ABC\d...
我尝试将它们连接在一起,并将结果字符串转换为函数, 但这会干扰先前加载的设置函数的名称空间。下面是我如何尝试实现的:

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

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

这是因为MAKE-SYMBOL返回一个不需要的符号。您应该改用INTERN。

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

大致如下:

(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))))) (defvar*符号函数映射*(生成哈希表)) (定义查找符号(符号) (或(gethash符号*符号函数映射*) (let((函数名(intern(连接'string'setup_u2;)(符号名symbol‘‘‘)’))) (setf(gethash符号*符号函数映射*)(符号函数名称()()())) 如果需要函数名,而不是函数本身,请省略对SYMBOL-function的调用

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

也有效。

答对了!我希望事情会这么简单,谢谢!你能给我举个例子来巩固这一点吗,我仍然有点困惑:(如果你这样做(intern“FOO”),你会得到存储由(defun FOO())定义的函数的相同符号。所以(funcall(intern“FOO”)等同于(FOO)。但是当你这样做时(使符号“FOO”)有好几次,您会得到几个名称相同但不相等的符号,并且没有一个是您创建的符号(defun foo())。如果没有人的答案有效,最好通过单击勾号将其标记为已接受。Lisp中的命名标准是使用连字符,而不是下划线。此外,读取器的大写字母在内部都是符号,标准是用小写字母书写,因此调用设置函数的标准方法是
setup abcd
。抱歉延迟滴答声!设置fns也是由一个非lisper编写的。后来我把我的Norvigs Lisp/AI书借给了他。