【问题标题】:Common Lisp: Exported Function UndefinedCommon Lisp:导出函数未定义
【发布时间】:2022-11-16 15:02:53
【问题描述】:

我已经用 asdf 系统创建了几次可执行文件。我知道还有其他方法可以做到这一点,但我想弄清楚为什么这一次不起作用。

我有一个剪刀石头布游戏。

口齿不清文件:

(defun main ()
  (let* ((x (y-or-n-p (format t "Is there two players? [Y/N]"))))
    (if (equal x t)
    (rps-game2)
    (rps-game))))

... other stuff

包.lisp:


(defpackage #:rps
      (:use #:cl)
      (:export main))

rps.asd


(asdf:defsystem #:rps
       :components ((:file "package")
                    (:file "rps"))
        :build-operation "program-op"
        :build-pathname "launch"
        :entry-point "rps:main")


生成文件:


build:
    sbcl \
     --eval '(load "rps.asd")' \
    --eval '(ql:quickload "rps")' \
     --eval '(asdf:make :rps)' \
     --eval '(quit)'



错误信息:

The function rps:main is an undefined

我遵循了与我之前创建的包完全相同的过程。由于某种原因,这次无法识别 main。为什么?

【问题讨论】:

  • 在实际定义函数main之前,lisp文件中是否有对(in-package "RPS")的调用?否则,您实际上定义的是cl:main,而不是rfs:main
  • 默认不是 CL,但可能是 CL-USER ... Common Lisp 包没有 MAIN 符号。
  • main 是我在 rps.lisp @RainerJoswig 中定义的函数
  • @Numbra 我相信先有鸡还是先有蛋...如果我将 (in-package "rps") 添加到我的 rps.lisp,那么当我 (ql:quickload "rps") 时,我会收到“RPS”不是包的错误.

标签: makefile package common-lisp sbcl


【解决方案1】:

我发现了以下问题:

  1. 在我的rps.asd 中添加了serial t。我相信这会告诉 lisp 按顺序编译文件。因此首先编译包,然后是 rps 文件。
  2. 我在 rps.lisp 文件中添加了 (in-package #:rps)。 (感谢@Numbra)

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多