我需要以编程方式调用类似于defun的宏,以便定义给定(自动生成)名称的函数。我的尝试是:
`(defun ,(intern "autogen-command-33") () (echo "autogen-command-33!"))但是,由于某些原因,(intern ...)停止了预期的工作(它现在抱怨如下):
invalid number of arguments: 1
[Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING {10078C8DE3}>)
Backtrace:
0: [error printing frame]
1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (INTERN "autogen-command-34") #<NULL-LEXENV>)
2: (EVAL (INTERN "autogen-command-34"))因此,我将intern替换为make-symbol,这不会产生错误。然后,我尝试(autogen-command-35),希望它已经被定义了,但它没有:
STUMPWM> (eval `(defun ,(make-symbol "autogen-command-35") () (echo "autogen 35")))
#:|autogen-command-35|
STUMPWM> (autogen-command-35)
; Evaluation aborted on #<UNDEFINED-FUNCTION AUTOGEN-COMMAND-35 {10082F8D43}>.
STUMPWM> 如何以编程方式在普通lisp中定义命名函数?
发布于 2014-04-28 18:30:25
如果要将符号创建为要调用的函数的名称,则需要考虑以下几点:
你的符号名是小写字母。MAKE符号也只是创建了一个符号,但是它并不存在于一个包中.
FOO> (INTERN "BAOBAB" "CL-USER")
COMMON-LISP-USER::BAOBABhttps://stackoverflow.com/questions/23348089
复制相似问题