mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-07-07 13:16:36 +02:00
better source preservation from syntax-rules on restructured ellipsis patterns
This commit is contained in:
parent
5013c0fdcb
commit
38144adfc5
1 changed files with 37 additions and 22 deletions
|
@ -1,5 +1,5 @@
|
||||||
;; init.scm -- R5RS library procedures
|
;; init-7.scm -- core library procedures for R7RS
|
||||||
;; Copyright (c) 2009-2011 Alex Shinn. All rights reserved.
|
;; Copyright (c) 2009-2012 Alex Shinn. All rights reserved.
|
||||||
;; BSD-style license: http://synthcode.com/license.txt
|
;; BSD-style license: http://synthcode.com/license.txt
|
||||||
|
|
||||||
(define (caar x) (car (car x)))
|
(define (caar x) (car (car x)))
|
||||||
|
@ -7,6 +7,13 @@
|
||||||
(define (cdar x) (cdr (car x)))
|
(define (cdar x) (cdr (car x)))
|
||||||
(define (cddr x) (cdr (cdr x)))
|
(define (cddr x) (cdr (cdr x)))
|
||||||
|
|
||||||
|
(define (cons-source kar kdr source)
|
||||||
|
((lambda (pair)
|
||||||
|
(if (pair? source)
|
||||||
|
(pair-source-set! pair (pair-source source)))
|
||||||
|
pair)
|
||||||
|
(cons kar kdr)))
|
||||||
|
|
||||||
;; basic utils
|
;; basic utils
|
||||||
|
|
||||||
(define (procedure? x) (if (closure? x) #t (opcode? x)))
|
(define (procedure? x) (if (closure? x) #t (opcode? x)))
|
||||||
|
@ -612,7 +619,8 @@
|
||||||
(_ls (rename 'ls)) (_res (rename 'res)) (_i (rename 'i))
|
(_ls (rename 'ls)) (_res (rename 'res)) (_i (rename 'i))
|
||||||
(_reverse (rename 'reverse))
|
(_reverse (rename 'reverse))
|
||||||
(_vector->list (rename 'vector->list))
|
(_vector->list (rename 'vector->list))
|
||||||
(_list->vector (rename 'list->vector)))
|
(_list->vector (rename 'list->vector))
|
||||||
|
(_cons3 (rename 'cons-source)))
|
||||||
(define ellipsis (rename (if ellipsis-specified? (cadr expr) '...)))
|
(define ellipsis (rename (if ellipsis-specified? (cadr expr) '...)))
|
||||||
(define lits (if ellipsis-specified? (car (cddr expr)) (cadr expr)))
|
(define lits (if ellipsis-specified? (car (cddr expr)) (cadr expr)))
|
||||||
(define forms (if ellipsis-specified? (cdr (cddr expr)) (cddr expr)))
|
(define forms (if ellipsis-specified? (cdr (cddr expr)) (cddr expr)))
|
||||||
|
@ -662,7 +670,9 @@
|
||||||
k)
|
k)
|
||||||
(,_lp (,_cdr ,_ls)
|
(,_lp (,_cdr ,_ls)
|
||||||
(,_- ,_i 1)
|
(,_- ,_i 1)
|
||||||
(,_cons (,_car ,_ls) ,_res))))))))))
|
(,_cons3 (,_car ,_ls)
|
||||||
|
,_res
|
||||||
|
,_ls))))))))))
|
||||||
((identifier? (car p))
|
((identifier? (car p))
|
||||||
(list _and (list _list? v)
|
(list _and (list _list? v)
|
||||||
(list _let (list (list (car p) v))
|
(list _let (list (list (car p) v))
|
||||||
|
@ -770,8 +780,13 @@
|
||||||
(let* ((depth (ellipsis-depth t))
|
(let* ((depth (ellipsis-depth t))
|
||||||
(ell-dim (+ dim depth))
|
(ell-dim (+ dim depth))
|
||||||
(ell-vars (free-vars (car t) vars ell-dim)))
|
(ell-vars (free-vars (car t) vars ell-dim)))
|
||||||
(if (null? ell-vars)
|
(cond
|
||||||
(error "too many ...'s")
|
((null? ell-vars)
|
||||||
|
(error "too many ...'s"))
|
||||||
|
((and (null? (cdr (cdr t))) (identifier? (car t)))
|
||||||
|
;; shortcut for (var ...)
|
||||||
|
(lp (car t) depth))
|
||||||
|
(else
|
||||||
(let* ((once (lp (car t) ell-dim))
|
(let* ((once (lp (car t) ell-dim))
|
||||||
(nest (if (and (null? (cdr ell-vars))
|
(nest (if (and (null? (cdr ell-vars))
|
||||||
(identifier? once)
|
(identifier? once)
|
||||||
|
@ -786,8 +801,8 @@
|
||||||
((= d 1) many))))
|
((= d 1) many))))
|
||||||
(if (null? (ellipsis-tail t))
|
(if (null? (ellipsis-tail t))
|
||||||
many ;; shortcut
|
many ;; shortcut
|
||||||
(list _append many (lp (ellipsis-tail t) dim)))))))
|
(list _append many (lp (ellipsis-tail t) dim))))))))
|
||||||
(else (list _cons (lp (car t) dim) (lp (cdr t) dim)))))
|
(else (list _cons3 (lp (car t) dim) (lp (cdr t) dim) (list _quote t)))))
|
||||||
((vector? t) (list _list->vector (lp (vector->list t) dim)))
|
((vector? t) (list _list->vector (lp (vector->list t) dim)))
|
||||||
((null? t) (list _quote '()))
|
((null? t) (list _quote '()))
|
||||||
(else t))))
|
(else t))))
|
||||||
|
|
Loading…
Add table
Reference in a new issue