Common lisp sbcl终端和sbcl文件

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

定义局部变量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 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编译器将始终检测到它。我看不出有什么不同。