首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式取消具有给定名称的函数的乐趣

以编程方式取消具有给定名称的函数的乐趣
EN

Stack Overflow用户
提问于 2014-04-28 18:01:06
回答 1查看 256关注 0票数 1

我需要以编程方式调用类似于defun的宏,以便定义给定(自动生成)名称的函数。我的尝试是:

代码语言:javascript
复制
`(defun ,(intern "autogen-command-33") () (echo "autogen-command-33!"))

但是,由于某些原因,(intern ...)停止了预期的工作(它现在抱怨如下):

代码语言:javascript
复制
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),希望它已经被定义了,但它没有:

代码语言:javascript
复制
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中定义命名函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-28 18:30:25

如果要将符号创建为要调用的函数的名称,则需要考虑以下几点:

  • 默认情况下,符号名在内部是大写的。所以最好在当前大写中创建一个符号,通常是大写字母。
  • 函数的符号通常应该在一个包中。实习医生就是其中的一员。实习生在正确的包裹中的符号。最好在调用实习生时指定包。请参阅实习生的文档。

你的符号名是小写字母。MAKE符号也只是创建了一个符号,但是它并不存在于一个包中.

代码语言:javascript
复制
FOO> (INTERN "BAOBAB" "CL-USER")
COMMON-LISP-USER::BAOBAB
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23348089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档