gpt4 book ai didi

lisp - 包通信 Common-Lisp 的问题

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

我定义了两个包:game(文件game.lisp)和commands(文件commands.lisp), 由 game.asd 文件加载。我在使用 (symbol-function (find-symbol "test-function"'commands)) 调用命令函数(已导出)时遇到问题,它返回该函数未定义,即使 (find-symbol "test-function"'commands) 返回该函数是外部函数,并且属于 commands 包。

game.asd 文件中的代码是:

(asdf:defsystem "game"
:depends-on (#:cl-ppcre)
:components ((:file "game")
(:file "commands")))

game.lisp 开始于:

(defpackage :game
(:use :cl :cl-ppcre))

commands.lisp 开始于:

(defpackage :commands
(:use :cl)
(:export "test-function"))

我需要使用in-package函数吗?我从 game.lisp 调用存储在 commands.lisp 文件中的命令,其中一些命令调用 game.lisp 中的一些函数,例如:

(defun test-function ()
(progn
(format *query-io* "Worked!~%")
(start)))

test-function 位于commands 包中,但调用了属于game.lispstart 函数。

当我调用 (symbol-function (find-symbol "test-function"'commands)) 时,我希望调用 test-function 函数。

最佳答案

总结

我的主要建议是您应该拥有包含用户命令和您的 Lisp 代码的单独包。

不必为您拥有的每个 Lisp 文件创建一个单独的包。

详情

您确实需要 in-package(它不是函数!)以确保您的代码驻留在正确的包装,因为 defpackage只是创造包,它改变 *package* .

因此我建议如下:

文件

游戏.asd

(asdf:defsystem "game"
:depends-on (#:cl-ppcre)
:components ((:file "package")
(:file "game" :depends-on ("package"))
(:file "commands" :depends-on ("package"))))

package.lisp

(defpackage :game
(:use :cl :cl-ppcre))

游戏.lisp

(in-package #:game)

...

命令.lisp

(in-package #:game)

...

(defconstant *commands-package* (make-package '#:commands :use nil))

然后使用 intern加上命令到 *commands-package*find-symbol找到他们。

(defun test-command ()
(format t "test-command~%")
(start))
(intern 'test-command *commands-package*)

您也可以为此定义自己的宏:

(defmacro defcommand (name arglist &body body)
`(progn
(intern (symbol-name ',name) *commands-package*)
(defun ,name ,arglist ,@body)))

(defcommand test-command ()
(format t "test-command~%")
(start))

挑剔

关于lisp - 包通信 Common-Lisp 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54220550/

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