(let loop ((p p))
(case (car p)
((list dotted-list vector)
- (if (and (eq? 'dotted-list (car p))
- (special-dot-tail? p))
- (if (any segment? (cdr p))
- (syntax-error "No ellipses allowed in pattern:" pattern))
- (begin
- (if (fix:> (count segment? (cdr p)) 1)
- (syntax-error "Only one ellipsis allowed in pattern:" pattern))
- (if (any (lambda (elt) (fix:> (count-segments elt) 1)) (cdr p))
- (syntax-error "No nested ellipses allowed in pattern:"
- pattern))))
+ (if (fix:> (count segment? (cdr p)) 1)
+ (syntax-error "Only one ellipsis allowed in pattern:" pattern))
+ (if (any (lambda (elt) (fix:> (count-segments elt) 1)) (cdr p))
+ (syntax-error "No nested ellipses allowed in pattern:" pattern))
(for-each (lambda (elt)
(loop (strip-segments elt)))
(cdr p)))
(loop (segment-body elt) (fix:+ n 1))
n)))
-(define (special-dot-tail? p)
- (let ((tail-pat (last p)))
- (or (eq? 'var (car tail-pat))
- (eq? 'anon-var (car tail-pat)))))
-
;; Like quote but doesn't strip syntactic closures:
(define (syntax-quote expression)
`(,(classifier->keyword
(assert-pair (caddr x))
(assert-eq (car (caddr x)) 'c)
(assert-eq (cdr (caddr x)) (cadr x))
- (assert-eq (cadddr x) (caddr x)))))
\ No newline at end of file
+ (assert-eq (cadddr x) (caddr x)))))
+
+(define-test 'dotted-list
+ (lambda ()
+
+ ;; Dotted-list pattern without ellipsis acts like rest parameter of lambda:
+ (define-syntax foo
+ (syntax-rules ()
+ ((_ a b . c)
+ (quote (a b c)))))
+ (assert-equal (foo 1 2 3 4) '(1 2 (3 4)))
+
+ ;; Dotted-list pattern with ellipsis matches final cdr of input:
+ (define-syntax bar
+ (syntax-rules ()
+ ((_ a b ... . c)
+ (quote (a (b ...) c)))))
+ (assert-equal (bar 1 2 3 4) '(1 (2 3 4) ()))
+ (assert-equal (bar 1 2 3 . 4) '(1 (2 3) 4))))
\ No newline at end of file