phoe / destructuring-bind-star

DESTRUCTURING-BIND with proper error signaling
13 stars 1 forks source link

DESTRUCTURING-BIND* is broken in sbcl 2.1.4 #1

Open shamazmazum opened 3 years ago

shamazmazum commented 3 years ago
CL-USER> (destructuring-bind-star:destructuring-bind* (a b (c d &rest e) &rest f)
      '(1 2 ("a" "b" "c" "d") 3 4) (values b c e)))
; in:
;      DESTRUCTURING-BIND-STAR:DESTRUCTURING-BIND* (A B (C D &REST E) &REST F)
;     (DESTRUCTURING-BIND
;         (A B (C (PROG2 (SETF #) D (SETF #)) &REST E) &REST F)
;         #:VALUE629
;       (SETF #:IN-BODY626 T)
;       (LOCALLY (VALUES B C E)))
; --> SB-INT:BINDING*
; ==>
;   (LET* ((#:G0 (SB-C::CHECK-DS-LIST/&REST #:VALUE629 3 3 '(A B # &REST F)))
;          (A (POP #:G0))
;          (B (POP #:G0))
;          (#:G1 (SB-C::CHECK-DS-LIST/&REST (POP #:G0) 2 2 '(C # &REST E)))
;          (C (POP #:G1))
;          (#:G2 (SB-C::CHECK-DS-LIST (POP #:G1) 4 4 '(PROG2 # D #)))
;          (PROG2 (POP #:G2))
;          (#:G3 (SB-C::CHECK-DS-LIST (POP #:G2) 3 3 '(SETF #)))
;          (SETF (POP #:G3))
;          (#:IN-BODY626 (POP #:G3))
;          (T (POP #:G3))
;          (D (POP #:G2))
;          ...)
;     (DECLARE (IGNORABLE #:G5))
;     (SETF #:IN-BODY626 T)
;     (LOCALLY (VALUES B C E)))
;
; caught ERROR:
;   COMMON-LISP:T names a defined constant, and cannot be used in LET*.

;     (LET ((#:VALUE629 '(1 2 ("a" "b" "c" "d") 3 4)))
;       (HANDLER-BIND ((ERROR #'#:HANDLE627))
;         (DESTRUCTURING-BIND
;             (A B (C # &REST E) &REST F)
;             #:VALUE629
;           (SETF #:IN-BODY626 T)
;           (LOCALLY (VALUES B C E)))))
;
; caught STYLE-WARNING:
;   The variable #:VALUE629 is defined but never used.
;
; compilation unit finished
;   caught 1 ERROR condition
;   caught 1 STYLE-WARNING condition

Macroexpansion doesn't seem to be legit (prog2 leaked in destructuring-bind's lambda-list):

(LET (#:IN-BODY630)
  (FLET ((#:HANDLE631 (#:CONDITION632)
           (UNLESS #:IN-BODY630
             (ERROR
              (MAKE-CONDITION 'DESTRUCTURING-BIND-STAR:DESTRUCTURING-ERROR
                              :LAMBDA-LIST '(A B (C D &REST E) &REST F)
                              :EXPRESSION ''(1 2 ("a" "b" "c" "d") 3 4) :REASON
                              #:CONDITION632)))))
    (DECLARE (IGNORABLE (FUNCTION #:HANDLE631)))
    (LET ((#:VALUE633 '(1 2 ("a" "b" "c" "d") 3 4)))
      (HANDLER-BIND ((ERROR #'#:HANDLE631))
        (DESTRUCTURING-BIND
            (A B
             (C
              (PROG2 (SETF #:IN-BODY630 T) D (SETF #:IN-BODY630 NIL))
              &REST
              E)
             &REST F)
            #:VALUE633
          (SETF #:IN-BODY630 T)
          (LOCALLY (VALUES B C E)))))))
phoe commented 3 years ago

This isn't just SBCL 2.1.4, it's the fact that my destructuring-lambda-list logic is broken. Thanks for letting me know, I'll fix this eventually!