gpt4 book ai didi

lisp - 以编程方式 defun 具有给定名称的函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:46 25 4
gpt4 key购买 nike

我需要以编程方式调用类似于 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>

如何在 common lisp 中以编程方式定义命名函数?

最佳答案

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

  • 默认情况下,符号名称在内部是大写的。因此,最好创建一个当前大小写的符号,通常是大写。

  • 函数的符号通常应该放在一个包中。 INTERN 就是这个功能。 INTERN 符号在右包中。最好在调用 INTERN 时指定包。请参阅 INTERN 的文档.

您的符号名称是小写的。 MAKE-SYMBOL 也只是创建一个符号,但它没有驻留在包中。

FOO> (INTERN "BAOBAB" "CL-USER")
COMMON-LISP-USER::BAOBAB

关于lisp - 以编程方式 defun 具有给定名称的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23348089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com