fixes quasisyntax bugs, making them more conforming to the r6rs test
suite.
This commit is contained in:
		
							parent
							
								
									b3d8a8f9fd
								
							
						
					
					
						commit
						4ee88498a9
					
				| 
						 | 
				
			
			@ -68,9 +68,7 @@
 | 
			
		|||
         (make-error)
 | 
			
		||||
         (if who (make-who-condition who) (condition))
 | 
			
		||||
         (make-message-condition msg)
 | 
			
		||||
         (if (null? irritants) 
 | 
			
		||||
             (condition)
 | 
			
		||||
             (make-irritants-condition irritants)))))
 | 
			
		||||
         (make-irritants-condition irritants))))
 | 
			
		||||
 | 
			
		||||
  (define (assertion-violation who msg . irritants) 
 | 
			
		||||
    (unless (string? msg) 
 | 
			
		||||
| 
						 | 
				
			
			@ -80,9 +78,7 @@
 | 
			
		|||
         (make-assertion-violation)
 | 
			
		||||
         (if who (make-who-condition who) (condition))
 | 
			
		||||
         (make-message-condition msg)
 | 
			
		||||
         (if (null? irritants) 
 | 
			
		||||
             (condition)
 | 
			
		||||
             (make-irritants-condition irritants)))))
 | 
			
		||||
         (make-irritants-condition irritants))))
 | 
			
		||||
 | 
			
		||||
  (define die assertion-violation)
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -340,9 +340,7 @@
 | 
			
		|||
 | 
			
		||||
  (define (fllog x)
 | 
			
		||||
    (if (flonum? x)
 | 
			
		||||
        (if ($fl>= x 0.0) 
 | 
			
		||||
            (foreign-call "ikrt_fl_log" x)
 | 
			
		||||
            (die 'fllog "argument should not be negative" x))
 | 
			
		||||
        (foreign-call "ikrt_fl_log" x)
 | 
			
		||||
        (die 'fllog "not a flonum" x)))
 | 
			
		||||
 | 
			
		||||
  (define (flexpt x y)
 | 
			
		||||
| 
						 | 
				
			
			@ -2379,7 +2377,10 @@
 | 
			
		|||
               [(ratnum? n) 
 | 
			
		||||
                ($make-ratnum (expt ($ratnum-n n) m) (expt ($ratnum-d n) m))]
 | 
			
		||||
               [else (fxexpt n m)])
 | 
			
		||||
             (/ 1 (expt n (- m))))]
 | 
			
		||||
             (let ([v (expt n (- m))])
 | 
			
		||||
               (if (eq? v 0)
 | 
			
		||||
                   0
 | 
			
		||||
                   (/ 1 v))))]
 | 
			
		||||
        [(bignum? m) 
 | 
			
		||||
         (cond
 | 
			
		||||
           [(eq? n 0) 0]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
1555
 | 
			
		||||
1556
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1718,19 +1718,37 @@
 | 
			
		|||
                   (values lhs* rhs* (list 'unsyntax p)))))
 | 
			
		||||
            (unsyntax (= lev 0)
 | 
			
		||||
             (stx-error p "incorrect use of unsyntax"))
 | 
			
		||||
            (((unsyntax-splicing p) . q)
 | 
			
		||||
            (((unsyntax p* ...) . q)
 | 
			
		||||
             (let-values (((lhs* rhs* q) (quasi q lev)))
 | 
			
		||||
               (if (= lev 0)
 | 
			
		||||
                   (let ((g (gensym)))
 | 
			
		||||
                   (let ((g* (map (lambda (x) (gensym)) p*)))
 | 
			
		||||
                     (values 
 | 
			
		||||
                       (cons `(,g ...) lhs*)
 | 
			
		||||
                       (cons p rhs*)
 | 
			
		||||
                       `(,g ... . ,q)))
 | 
			
		||||
                   (let-values (((lhs2* rhs2* p) (quasi p (- lev 1))))
 | 
			
		||||
                       (append g* lhs*)
 | 
			
		||||
                       (append p* rhs*)
 | 
			
		||||
                       (append g* q)))
 | 
			
		||||
                   (let-values (((lhs2* rhs2* p*) (quasi p* (- lev 1))))
 | 
			
		||||
                     (values 
 | 
			
		||||
                       (append lhs2* lhs*)
 | 
			
		||||
                       (append rhs2* rhs*)
 | 
			
		||||
                       `((unsyntax-splicing ,p) . ,q))))))
 | 
			
		||||
                       `((unsyntax . ,p*) . ,q))))))
 | 
			
		||||
            (((unsyntax-splicing p* ...) . q)
 | 
			
		||||
             (let-values (((lhs* rhs* q) (quasi q lev)))
 | 
			
		||||
               (if (= lev 0)
 | 
			
		||||
                   (let ((g* (map (lambda (x) (gensym)) p*)))
 | 
			
		||||
                     (values 
 | 
			
		||||
                       (append 
 | 
			
		||||
                         (map (lambda (g) `(,g ...)) g*)
 | 
			
		||||
                         lhs*)
 | 
			
		||||
                       (append p* rhs*)
 | 
			
		||||
                       (append
 | 
			
		||||
                         (apply append 
 | 
			
		||||
                           (map (lambda (g) `(,g ...)) g*))
 | 
			
		||||
                         q)))
 | 
			
		||||
                   (let-values (((lhs2* rhs2* p*) (quasi p* (- lev 1))))
 | 
			
		||||
                     (values 
 | 
			
		||||
                       (append lhs2* lhs*)
 | 
			
		||||
                       (append rhs2* rhs*)
 | 
			
		||||
                       `((unsyntax-splicing . ,p*) . ,q))))))
 | 
			
		||||
            (unsyntax-splicing (= lev 0)
 | 
			
		||||
             (stx-error p "incorrect use of unsyntax-splicing"))
 | 
			
		||||
            ((quasisyntax p)
 | 
			
		||||
| 
						 | 
				
			
			@ -1742,18 +1760,9 @@
 | 
			
		|||
                (values (append lhs2* lhs*)
 | 
			
		||||
                        (append rhs2* rhs*)
 | 
			
		||||
                        (cons p q))))
 | 
			
		||||
            (#(x ...) (not (stx? p))
 | 
			
		||||
             (let-values (((lhs* rhs* x*)
 | 
			
		||||
                           (let f ((x x))
 | 
			
		||||
                             (cond
 | 
			
		||||
                               ((null? x) (values '() '() '()))
 | 
			
		||||
                               (else
 | 
			
		||||
                                (let-values (((lhs* rhs* a) (quasi (car x) lev)))
 | 
			
		||||
                                  (let-values (((lhs2* rhs2* d) (f (cdr x))))
 | 
			
		||||
                                     (values (append lhs* lhs2*)
 | 
			
		||||
                                             (append rhs* rhs2*)
 | 
			
		||||
                                             (cons a d)))))))))
 | 
			
		||||
                (values lhs* rhs* (list->vector x*))))
 | 
			
		||||
            (#(x* ...) 
 | 
			
		||||
             (let-values (((lhs* rhs* x*) (quasi x* lev)))
 | 
			
		||||
               (values lhs* rhs* (list->vector x*))))
 | 
			
		||||
            (_ (values '() '() p)))))
 | 
			
		||||
      (lambda (x)
 | 
			
		||||
        (syntax-match x ()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue