“未定义的变量:COMMON-LISP-USER::PRIMELIST”警告,在 Mac 上使用 SBCL

问题描述 投票:0回答:1

虽然我已经在 Linux 上使用 Common Lisp 一段时间了,但我对 SBCL 的经验非常有限。

我在 Mac 上使用 SBCL 的经验等于没有。

我刚刚使用自制软件在 Mac (Sonoma 14.2.1) 上安装了 SBCL。

我现在有:SBCL 2.4.1

当我尝试使用单独的文件来包含函数时遇到第一个问题。

作为第一个测试,我有这个文件(test1):

   % cat test1
  #!/opt/homebrew/bin/sbcl --script

  (format t "Hello Lisp World !~%")
   % 

按预期工作:

   % ./test1
  Hello Lisp World !
   % 

接下来我想包含来自单独文件的函数:

   % cat test2 
  #!/opt/homebrew/bin/sbcl --script

  (load "testInc")

  (format t "Hello Lisp World !~%")
  (outFunc)
   % 

testInc 如下:

   % cat testInc 
  (defun outFunc()
    (format t "Hello Lisp Library !~%")
    (format t " From testInc.~%"))
   % 

此时一切仍按预期进行:

   % ./test2    
  Hello Lisp World !
  Hello Lisp Library !
    From testInc.
   % 

我的第三次测试出了问题。我现在将 testInc 文件更改为:

   % cat testInc
  (setq PrimeList '((2 1) (3 2)))

  (defun outFunc()
    (format t "Hello Lisp Library !~%")
    (format t " From testInc.~%")
    (format t "P1: ~a.~%" (car (car PrimeList)))
  ) ; End of outFunc.
   % 

当我现在尝试运行 test2 时,我遇到了问题。 像这样:

   % ./test2     

  ; file: /.../testInc
  ; in: SETQ PRIMELIST
  ;     (SETQ PRIMELIST '((2 1) (3 2)))
  ; 
  ; caught WARNING:
  ;   undefined variable: COMMON-LISP-USER::PRIMELIST
  ; 
  ; compilation unit finished
  ;   Undefined variable:
  ;     PRIMELIST
  ;   caught 1 WARNING condition

  ; file: /.../testInc
  ; in: DEFUN OUTFUNC
  ;     (CAR PRIMELIST)
  ; 
  ; caught WARNING:
  ;   undefined variable: COMMON-LISP-USER::PRIMELIST
  ; 
  ; compilation unit finished
  ;   Undefined variable:
  ;     PRIMELIST
  ;   caught 1 WARNING condition
  Hello Lisp World !
  Hello Lisp Library !
    From testInc.
  P1: 2.
    % 

可以看到预期的最后一行出现了。这段代码在与 common lisp 一起使用时没有问题(在 Debian 上)。为什么我会遇到这个问题(警告):

  ;   undefined variable: COMMON-LISP-USER::PRIMELIST

我应该如何编写代码以避免这种警告?

所以我希望了解 SBCL 的人能够给我一些关于如何让 SBCL 开心的提示。

lisp common-lisp sbcl
1个回答
3
投票

您在声明变量之前就使用了它。您可以使用

defvar
defparameter
来声明它。

(defparameter PrimeList '((2 1) (3 2)))

请记住,这些不是词法变量,它们将被动态绑定。

大多数时候最好继续传递附加变量。

如果您不希望全局变量始终可用,您仍然可以这样做:

(let ((prime-list '((2 1) (3 2))))
  (defun some-func ()
    (format t "~A~%" prime-list)))

如果您不想再次设置全局常量,可以使用

defconstant

© www.soinside.com 2019 - 2024. All rights reserved.