2015-01-20 2 views
1
(defun foo (&aux (defvar x 10)) 
    (print x)) 

은 LET과 마찬가지로 로컬 변수 X를 정의합니다. 파일에 기록 된 다음과 같이 SBCL에 컴파일 된 경우 동일한 기능 : SBCL --script file.lisp 제공 오류 :sbcl 터미널 및 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 

변수 & 보조를 할당하는 이전 버전의 문제점은 무엇인가? 우리가 syntax of lambda lists 보면

답변

4

, 우리는이를 참조하십시오

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])}*]) 

위가 정상적인 기능에 대한 인수 목록 선언 구문입니다.

당신이 양식을 보면이 람다 목록에있는 의미가 있다면, 당신은 기호 DEFVAR는 어떻게해야되고 있는지 확인하고자하고 있습니다 ...

의이 REPL

에서 그것을 시도 실행하자
* (defun foo (&aux (defvar x 10)) 
    (print x)) 
; in: DEFUN FOO 
;  (SB-INT:NAMED-LAMBDA FOO 
;   (&AUX (DEFVAR X 10)) 
;  (BLOCK FOO (PRINT X))) 
; 
; caught ERROR: 
; malformed &AUX binding specifier: (DEFVAR X 10) 

debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR: 
    malformed &AUX binding specifier: (DEFVAR X 10) 

SBCL이 구문 오류를 분명히 감지했습니다.

+0

다음은 diff 베닛 sbcl 파일 컴파일 및 sbcl 터미널 실행 명령문 –

+2

@ PP_700 : 사용자가 수행하는 작업을 알지 못합니다. 그러나 구문 오류가있어 잘못 입력했습니다. SBCL 컴파일러는 항상이를 감지합니다. 나는 어떤 차이도 보이지 않는다. –

관련 문제