fixing identifier comparison bugs

This commit is contained in:
Derick Eddington 2009-12-06 21:34:30 -08:00
parent f969364176
commit 14c99c4729
3 changed files with 24 additions and 9 deletions

View file

@ -124,11 +124,11 @@
(if (null? (cdr expr)) (if (null? (cdr expr))
#f #f
((lambda (cl) ((lambda (cl)
(if (compare 'else (car cl)) (if (compare (rename 'else) (car cl))
(if (pair? (cddr expr)) (if (pair? (cddr expr))
(error "non-final else in cond" expr) (error "non-final else in cond" expr)
(cons (rename 'begin) (cdr cl))) (cons (rename 'begin) (cdr cl)))
(if (if (null? (cdr cl)) #t (compare '=> (cadr cl))) (if (if (null? (cdr cl)) #t (compare (rename '=>) (cadr cl)))
(list (list (rename 'lambda) (list (rename 'tmp)) (list (list (rename 'lambda) (list (rename 'tmp))
(list (rename 'if) (rename 'tmp) (list (rename 'if) (rename 'tmp)
(if (null? (cdr cl)) (if (null? (cdr cl))
@ -169,20 +169,20 @@
(cond (cond
((pair? x) ((pair? x)
(cond (cond
((eq? 'unquote (car x)) ((compare (rename 'unquote) (car x))
(if (<= d 0) (if (<= d 0)
(cadr x) (cadr x)
(list (rename 'list) (list (rename 'quote) 'unquote) (list (rename 'list) (list (rename 'quote) 'unquote)
(qq (cadr x) (- d 1))))) (qq (cadr x) (- d 1)))))
((eq? 'unquote-splicing (car x)) ((compare (rename 'unquote-splicing) (car x))
(if (<= d 0) (if (<= d 0)
(list (rename 'cons) (qq (car x) d) (qq (cdr x) d)) (list (rename 'cons) (qq (car x) d) (qq (cdr x) d))
(list (rename 'list) (list (rename 'quote) 'unquote-splicing) (list (rename 'list) (list (rename 'quote) 'unquote-splicing)
(qq (cadr x) (- d 1))))) (qq (cadr x) (- d 1)))))
((eq? 'quasiquote (car x)) ((compare (rename 'quasiquote) (car x))
(list (rename 'list) (list (rename 'quote) 'quasiquote) (list (rename 'list) (list (rename 'quote) 'quasiquote)
(qq (cadr x) (+ d 1)))) (qq (cadr x) (+ d 1))))
((and (<= d 0) (pair? (car x)) (eq? 'unquote-splicing (caar x))) ((and (<= d 0) (pair? (car x)) (compare (rename 'unquote-splicing) (caar x)))
(if (null? (cdr x)) (if (null? (cdr x))
(cadar x) (cadar x)
(list (rename 'append) (cadar x) (qq (cdr x) d)))) (list (rename 'append) (cadar x) (qq (cdr x) d))))
@ -243,7 +243,7 @@
(define (clause ls) (define (clause ls)
(cond (cond
((null? ls) #f) ((null? ls) #f)
((compare 'else (caar ls)) ((compare (rename 'else) (caar ls))
`(,(rename 'begin) ,@(cdar ls))) `(,(rename 'begin) ,@(cdar ls)))
(else (else
(if (and (pair? (caar ls)) (null? (cdaar ls))) (if (and (pair? (caar ls)) (null? (cdaar ls)))
@ -669,7 +669,7 @@
((null? p) (list _and (list _null? v) (k vars))) ((null? p) (list _and (list _null? v) (k vars)))
(else (list _and (list _equal? v p) (k vars)))))))) (else (list _and (list _equal? v p) (k vars))))))))
(define (ellipse? x) (define (ellipse? x)
(and (pair? x) (pair? (cdr x)) (compare '... (cadr x)))) (and (pair? x) (pair? (cdr x)) (compare (rename '...) (cadr x))))
(define (ellipse-depth x) (define (ellipse-depth x)
(if (ellipse? x) (if (ellipse? x)
(+ 1 (ellipse-depth (cdr x))) (+ 1 (ellipse-depth (cdr x)))

View file

@ -69,7 +69,7 @@
;; (er-macro-transformer ;; (er-macro-transformer
;; (lambda (expr rename compare) ;; (lambda (expr rename compare)
;; (receive (named posns) ;; (receive (named posns)
;; (partition (lambda (x) (and (list? x) (compare (car x) '=>))) ;; (partition (lambda (x) (and (list? x) (compare (car x) (rename '=>))))
;; (cdr expr)) ;; (cdr expr))
;; (let lp ((ls '((arg default) ...)) (posns posns) (args '())) ;; (let lp ((ls '((arg default) ...)) (posns posns) (args '()))
;; (cond ;; (cond

View file

@ -386,6 +386,21 @@
(test '(3 3) (let ((p (delay (+ 1 2)))) (list (force p) (force p)))) (test '(3 3) (let ((p (delay (+ 1 2)))) (list (force p) (force p))))
(test 'ok (let ((else 1)) (cond (else 'ok) (#t 'bad))))
(test 'ok (let ((=> 1)) (cond (#t => 'ok))))
(test '(,foo) (let ((unquote 1)) `(,foo)))
(test '(,@foo) (let ((unquote-splicing 1)) `(,@foo)))
(test 'ok
(let ((... 2))
(let-syntax ((s (syntax-rules ()
((_ x ...) 'bad)
((_ . r) 'ok))))
(s a b c))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(test-report) (test-report)