Common lisp sbcl终端和sbcl文件
定义局部变量X,就像LET一样。 如果将相同的函数写入文件,然后在sbcl上编译为:sbcl--script file.lisp 给出错误:Common lisp sbcl终端和sbcl文件,common-lisp,sbcl,Common Lisp,Sbcl,定义局部变量X,就像LET一样。 如果将相同的函数写入文件,然后在sbcl上编译为:sbcl--script file.lisp 给出错误: (defun foo (&aux (defvar x 10)) (print x)) ;在:德文福 ; (DEFUN FOO(&AUX(DEFVAR X 10))(打印X)) ; --> 程序SB-INT:NAMED-LAMBDA ; ==> ; #'(SB-INT:NAMED-LAMBDA FOO (&AUX(DEFVAR
(defun foo (&aux (defvar x 10))
(print x))
;在:德文福
; (DEFUN FOO(&AUX(DEFVAR X 10))(打印X))
; --> 程序SB-INT:NAMED-LAMBDA
; ==>
; #'(SB-INT:NAMED-LAMBDA FOO
(&AUX(DEFVAR X 10))
(BLOCK FOO(打印X)))
;
; 捕获错误:
; 格式错误的辅助绑定说明符(&A):(DEFVAR X 10)
;
; 编译单元已完成
; 捕获1个错误条件
未处理的SB-INT:线程#中的已编译程序错误:
执行带错误编译的表单。
表格:
#"(名为LAMBDA FOO)
(&AUX(DEFVAR X 10))
(图块FOO(打印X)))
编译时错误:
格式错误的辅助绑定说明符(&A):(DEFVAR X 10)
0:(SB-DEBUG::MAP-BACKTRACE)
#
:开始
0
:计数
128)
1:(回溯128#)
2:(SB-DEBUG::DEBUGGER-DISABLED-HOOK)
#
#)
3:(SB-DEBUG::RUN-HOOK)
*调用调试器钩子*
#)
4:(调用调试器#)
5:(错误)
SB-INT:编译程序错误
:信息
“格式错误的辅助绑定说明符(&A):(DEFVAR X 10)”
:来源
“#”(名为LAMBDA FOO)
(&AUX(DEFVAR X 10))
(正楷(正楷))
6:(#:EVAL-THUNK)
7:(SB-INT:SIMPLE-EVAL-IN-lexev)
(SB-INT:NAMED-LAMBDA FOO
(&AUX(DEFVAR X 10))
(图块FOO(打印X)))
#)
8:(SB-INT:SIMPLE-EVAL-IN-lexev)
(SB-IMPL::%DEFUN'FOO
(SB-INT:NAMED-LAMBDA FOO
(&AUX(DEFVAR X 10))
(图块FOO(打印X)))
零零(SB-C:源位置))
#)
9:(SB-INT:SIMPLE-EVAL-IN-lexev)
(EVAL-WHEN(:LOAD-top-level:EXECUTE)
(SB-IMPL::%DEFUN'FOO
(SB-INT:NAMED-LAMBDA FOO
(&AUX(DEFVAR X 10))
(图块FOO(打印X)))
零零(SB-C:源位置)
#)
10:(SB-INT:SIMPLE-EVAL-IN-lexev)
(DEFUN FOO(&AUX(DEFVAR X 10))(打印X))
#)
11:(EVAL-TLF(DEFUN FOO(&AUX(DEFVAR X 10))(PRINT X))7#)
12:((FLET SB-FASL::EVAL-FORM:IN SB-INT:LOAD-AS-SOURCE)
(DEFUN FOO(&AUX(DEFVAR X 10))(打印X))
7)
13:(SB-INT:LOAD-AS-SOURCE
#
:冗长
无
:打印
无
:上下文
“装载”)
14:((FLET SB-FASL::加载流:加载中)
#
零)
15:(装载)
#
:冗长
无
:打印
无
:如果不存在
T
:外部格式
:默认值)
16:((FLET SB-IMPL::LOAD-SCRIPT:在SB-IMPL::PROCESS-SCRIPT中)
#)
17:((FLET#:无中断-INTERRUPTS-BODY-5599:在SB-IMPL::PROCESS-SCRIPT中))
18:(SB-IMPL::PROCESS-SCRIPT“fib.lisp”)
19:(SB-IMPL::TOPLEVEL-INIT)
20:((FLET#:无中断-BODY-236911:IN SAVE-LISP-AND-DIE))
21:((标签SB-IMPL::RESTART-LISP:IN SAVE-LISP-AND-DIE))
处于--禁用调试器模式的未处理条件,正在退出
旧版本的赋值变量&aux有什么问题?如果我们查看,我们会看到:
; in: DEFUN FOO
; (DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X))
; --> PROGN SB-INT:NAMED-LAMBDA
; ==>
; #'(SB-INT:NAMED-LAMBDA FOO
; (&AUX (DEFVAR X 10))
; (BLOCK FOO (PRINT X)))
;
; caught ERROR:
; malformed &AUX binding specifier: (DEFVAR X 10)
;
; compilation unit finished
; caught 1 ERROR condition
unhandled SB-INT:COMPILED-PROGRAM-ERROR in thread #<SB-THREAD:THREAD
"main thread" RUNNING
{10029B8FC3}>:
Execution of a form compiled with errors.
Form:
#'(NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
Compile-time error:
malformed &AUX binding specifier: (DEFVAR X 10)
0: (SB-DEBUG::MAP-BACKTRACE
#<CLOSURE (LAMBDA # :IN BACKTRACE) {1002A39DEB}>
:START
0
:COUNT
128)
1: (BACKTRACE 128 #<SB-SYS:FD-STREAM for "standard error" {10029BA863}>)
2: (SB-DEBUG::DEBUGGER-DISABLED-HOOK
#<SB-INT:COMPILED-PROGRAM-ERROR {1002A373D3}>
#<unavailable argument>)
3: (SB-DEBUG::RUN-HOOK
*INVOKE-DEBUGGER-HOOK*
#<SB-INT:COMPILED-PROGRAM-ERROR {1002A373D3}>)
4: (INVOKE-DEBUGGER #<SB-INT:COMPILED-PROGRAM-ERROR {1002A373D3}>)
5: (ERROR
SB-INT:COMPILED-PROGRAM-ERROR
:MESSAGE
"malformed &AUX binding specifier: (DEFVAR X 10)"
:SOURCE
"#'(NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))")
6: (#:EVAL-THUNK)
7: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(SB-INT:NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
#<NULL-LEXENV>)
8: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(SB-IMPL::%DEFUN 'FOO
(SB-INT:NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
NIL 'NIL (SB-C:SOURCE-LOCATION))
#<NULL-LEXENV>)
9: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(EVAL-WHEN (:LOAD-TOPLEVEL :EXECUTE)
(SB-IMPL::%DEFUN 'FOO
(SB-INT:NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
NIL 'NIL (SB-C:SOURCE-LOCATION)))
#<NULL-LEXENV>)
10: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X))
#<NULL-LEXENV>)
11: (EVAL-TLF (DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X)) 7 #<NULL-LEXENV>)
12: ((FLET SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE)
(DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X))
7)
13: (SB-INT:LOAD-AS-SOURCE
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>
:VERBOSE
NIL
:PRINT
NIL
:CONTEXT
"loading")
14: ((FLET SB-FASL::LOAD-STREAM :IN LOAD)
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>
NIL)
15: (LOAD
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>
:VERBOSE
NIL
:PRINT
NIL
:IF-DOES-NOT-EXIST
T
:EXTERNAL-FORMAT
:DEFAULT)
16: ((FLET SB-IMPL::LOAD-SCRIPT :IN SB-IMPL::PROCESS-SCRIPT)
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>)
17: ((FLET #:WITHOUT-INTERRUPTS-BODY-5599 :IN SB-IMPL::PROCESS-SCRIPT))
18: (SB-IMPL::PROCESS-SCRIPT "fib.lisp")
19: (SB-IMPL::TOPLEVEL-INIT)
20: ((FLET #:WITHOUT-INTERRUPTS-BODY-236911 :IN SAVE-LISP-AND-DIE))
21: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))
unhandled condition in --disable-debugger mode, quitting
以上是普通函数的参数列表声明的语法
如果查看表单,您可能希望了解符号DEFVAR
应该做什么,以及它在lambda列表中是否有意义
让我们运行并在REPL中尝试它
lambda-list::= (var*
[&optional {var | (var [init-form [supplied-p-parameter]])}*]
[&rest var]
[&key {var | ({var | (keyword-name var)}
[init-form [supplied-p-parameter]])}*
[&allow-other-keys]]
[&aux {var | (var [init-form])}*])
SBCL清楚地检测到语法错误。如果我们查看,我们会看到:
; in: DEFUN FOO
; (DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X))
; --> PROGN SB-INT:NAMED-LAMBDA
; ==>
; #'(SB-INT:NAMED-LAMBDA FOO
; (&AUX (DEFVAR X 10))
; (BLOCK FOO (PRINT X)))
;
; caught ERROR:
; malformed &AUX binding specifier: (DEFVAR X 10)
;
; compilation unit finished
; caught 1 ERROR condition
unhandled SB-INT:COMPILED-PROGRAM-ERROR in thread #<SB-THREAD:THREAD
"main thread" RUNNING
{10029B8FC3}>:
Execution of a form compiled with errors.
Form:
#'(NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
Compile-time error:
malformed &AUX binding specifier: (DEFVAR X 10)
0: (SB-DEBUG::MAP-BACKTRACE
#<CLOSURE (LAMBDA # :IN BACKTRACE) {1002A39DEB}>
:START
0
:COUNT
128)
1: (BACKTRACE 128 #<SB-SYS:FD-STREAM for "standard error" {10029BA863}>)
2: (SB-DEBUG::DEBUGGER-DISABLED-HOOK
#<SB-INT:COMPILED-PROGRAM-ERROR {1002A373D3}>
#<unavailable argument>)
3: (SB-DEBUG::RUN-HOOK
*INVOKE-DEBUGGER-HOOK*
#<SB-INT:COMPILED-PROGRAM-ERROR {1002A373D3}>)
4: (INVOKE-DEBUGGER #<SB-INT:COMPILED-PROGRAM-ERROR {1002A373D3}>)
5: (ERROR
SB-INT:COMPILED-PROGRAM-ERROR
:MESSAGE
"malformed &AUX binding specifier: (DEFVAR X 10)"
:SOURCE
"#'(NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))")
6: (#:EVAL-THUNK)
7: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(SB-INT:NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
#<NULL-LEXENV>)
8: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(SB-IMPL::%DEFUN 'FOO
(SB-INT:NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
NIL 'NIL (SB-C:SOURCE-LOCATION))
#<NULL-LEXENV>)
9: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(EVAL-WHEN (:LOAD-TOPLEVEL :EXECUTE)
(SB-IMPL::%DEFUN 'FOO
(SB-INT:NAMED-LAMBDA FOO
(&AUX (DEFVAR X 10))
(BLOCK FOO (PRINT X)))
NIL 'NIL (SB-C:SOURCE-LOCATION)))
#<NULL-LEXENV>)
10: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X))
#<NULL-LEXENV>)
11: (EVAL-TLF (DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X)) 7 #<NULL-LEXENV>)
12: ((FLET SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE)
(DEFUN FOO (&AUX (DEFVAR X 10)) (PRINT X))
7)
13: (SB-INT:LOAD-AS-SOURCE
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>
:VERBOSE
NIL
:PRINT
NIL
:CONTEXT
"loading")
14: ((FLET SB-FASL::LOAD-STREAM :IN LOAD)
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>
NIL)
15: (LOAD
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>
:VERBOSE
NIL
:PRINT
NIL
:IF-DOES-NOT-EXIST
T
:EXTERNAL-FORMAT
:DEFAULT)
16: ((FLET SB-IMPL::LOAD-SCRIPT :IN SB-IMPL::PROCESS-SCRIPT)
#<SB-SYS:FD-STREAM for "file /home/student/3357/fib.lisp" {10029C1513}>)
17: ((FLET #:WITHOUT-INTERRUPTS-BODY-5599 :IN SB-IMPL::PROCESS-SCRIPT))
18: (SB-IMPL::PROCESS-SCRIPT "fib.lisp")
19: (SB-IMPL::TOPLEVEL-INIT)
20: ((FLET #:WITHOUT-INTERRUPTS-BODY-236911 :IN SAVE-LISP-AND-DIE))
21: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))
unhandled condition in --disable-debugger mode, quitting
以上是普通函数的参数列表声明的语法
如果查看表单,您可能希望了解符号DEFVAR
应该做什么,以及它在lambda列表中是否有意义
让我们运行并在REPL中尝试它
lambda-list::= (var*
[&optional {var | (var [init-form [supplied-p-parameter]])}*]
[&rest var]
[&key {var | ({var | (keyword-name var)}
[init-form [supplied-p-parameter]])}*
[&allow-other-keys]]
[&aux {var | (var [init-form])}*])
SBCL清楚地检测到语法错误。那么SBCL文件编译和SBCL终端运行的差异是什么statement@PP_700:我不知道你在做什么,但你给出的函数是错误的,因为它包含语法错误。SBCL编译器将始终检测到它。我看不出有什么区别。那么sbcl文件编译和sbcl终端运行的区别是什么statement@PP_700:我不知道你在做什么,但你给出的函数是错误的,因为它包含语法错误。SBCL编译器将始终检测到它。我看不出有什么不同。