mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 05:39:18 +02:00
Move datum->syntax back to init-7.scm. Don't crash when renamer not present in syntactic closure.
This commit is contained in:
parent
081a2a7b3f
commit
5c963df96f
2 changed files with 27 additions and 23 deletions
|
@ -46,28 +46,6 @@
|
||||||
(define (syntax->datum stx)
|
(define (syntax->datum stx)
|
||||||
(strip-syntactic-closures stx))
|
(strip-syntactic-closures stx))
|
||||||
|
|
||||||
(define (symbol->identifier id symbol)
|
|
||||||
(if (symbol? id)
|
|
||||||
symbol
|
|
||||||
((syntactic-closure-rename id)
|
|
||||||
symbol)))
|
|
||||||
|
|
||||||
;; TODO: Handle cycles in datum.
|
|
||||||
(define (datum->syntax id datum)
|
|
||||||
(let loop ((datum datum))
|
|
||||||
(cond ((pair? datum)
|
|
||||||
(cons (loop (car datum))
|
|
||||||
(loop (cdr datum))))
|
|
||||||
((vector? datum)
|
|
||||||
(do ((res (make-vector (vector-length datum)))
|
|
||||||
(i 0 (+ i 1)))
|
|
||||||
((= i (vector-length datum)) res)
|
|
||||||
(vector-set! res i (loop (vector-ref datum i)))))
|
|
||||||
((symbol? datum)
|
|
||||||
(symbol->identifier id datum))
|
|
||||||
(else
|
|
||||||
datum))))
|
|
||||||
|
|
||||||
(define-syntax syntax (syntax-transformer #f))
|
(define-syntax syntax (syntax-transformer #f))
|
||||||
(define-syntax quasisyntax (syntax-transformer 0))
|
(define-syntax quasisyntax (syntax-transformer 0))
|
||||||
(define-auxiliary-syntax unsyntax)
|
(define-auxiliary-syntax unsyntax)
|
||||||
|
|
|
@ -976,7 +976,7 @@
|
||||||
(syntax-rules-transformer expr rename compare))))
|
(syntax-rules-transformer expr rename compare))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; let(rec)-syntax
|
;; let(rec)-syntax and datum->syntax
|
||||||
|
|
||||||
(define-syntax let-syntax
|
(define-syntax let-syntax
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
|
@ -988,6 +988,32 @@
|
||||||
((letrec-syntax ((keyword transformer) ...) . body)
|
((letrec-syntax ((keyword transformer) ...) . body)
|
||||||
(%letrec-syntax ((keyword (make-transformer transformer)) ...) . body))))
|
(%letrec-syntax ((keyword (make-transformer transformer)) ...) . body))))
|
||||||
|
|
||||||
|
(define (symbol->identifier id symbol)
|
||||||
|
(cond
|
||||||
|
((symbol? id)
|
||||||
|
symbol)
|
||||||
|
((syntactic-closure-rename id)
|
||||||
|
=> (lambda (renamer)
|
||||||
|
(renamer symbol)))
|
||||||
|
(else
|
||||||
|
symbol)))
|
||||||
|
|
||||||
|
;; TODO: Handle cycles in datum.
|
||||||
|
(define (datum->syntax id datum)
|
||||||
|
(let loop ((datum datum))
|
||||||
|
(cond ((pair? datum)
|
||||||
|
(cons (loop (car datum))
|
||||||
|
(loop (cdr datum))))
|
||||||
|
((vector? datum)
|
||||||
|
(do ((res (make-vector (vector-length datum)))
|
||||||
|
(i 0 (+ i 1)))
|
||||||
|
((= i (vector-length datum)) res)
|
||||||
|
(vector-set! res i (loop (vector-ref datum i)))))
|
||||||
|
((symbol? datum)
|
||||||
|
(symbol->identifier id datum))
|
||||||
|
(else
|
||||||
|
datum))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; additional syntax
|
;; additional syntax
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue