diff --git a/lib/chibi/syntax-case.scm b/lib/chibi/syntax-case.scm index bee7ccf1..92c3b74d 100644 --- a/lib/chibi/syntax-case.scm +++ b/lib/chibi/syntax-case.scm @@ -46,28 +46,6 @@ (define (syntax->datum 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 quasisyntax (syntax-transformer 0)) (define-auxiliary-syntax unsyntax) diff --git a/lib/init-7.scm b/lib/init-7.scm index f243cb0a..a3bc89b9 100644 --- a/lib/init-7.scm +++ b/lib/init-7.scm @@ -976,7 +976,7 @@ (syntax-rules-transformer expr rename compare)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; let(rec)-syntax +;; let(rec)-syntax and datum->syntax (define-syntax let-syntax (syntax-rules () @@ -988,6 +988,32 @@ ((letrec-syntax ((keyword 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