虽然我已经在 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 开心的提示。
您在声明变量之前就使用了它。您可以使用
defvar
或 defparameter
来声明它。
(defparameter PrimeList '((2 1) (3 2)))
请记住,这些不是词法变量,它们将被动态绑定。
大多数时候最好继续传递附加变量。
如果您不希望全局变量始终可用,您仍然可以这样做:
(let ((prime-list '((2 1) (3 2))))
(defun some-func ()
(format t "~A~%" prime-list)))
如果您不想再次设置全局常量,可以使用
defconstant
。