hi
I believe there might be a problem with gambit-c's write function, gambit-c seem to treat the word "syntax" with special meaning, (I'm not entirely sure about this) or that this is a problem with inner defines? I was testing some transformations and ran into this problem:
cat z.scm | mzscheme -m -f zzz.scm
(define %syntax (lambda (exp cur-env stx-env) (define syntax (lambda (exp cur-env stx-env) (if (eq? stx-env cur-env) (%wrap-syntax exp stx-env 1) (%wrap-syntax (syntax exp (cdr cur-env) stx-env) cur-env 1)))) (%wrap-syntax (syntax exp cur-env stx-env) cur-env -1)))
cat z.scm | /usr/gambitc/bin/gsi zzz.scm
(define %syntax (lambda (exp cur-env stx-env) (define . #'(lambda (exp cur-env stx-env) (if (eq? stx-env cur-env) (%wrap-syntax exp stx-env 1) (%wrap-syntax (syntax exp (cdr cur-env) stx-env) cur-env 1)))) (%wrap-syntax (syntax exp cur-env stx-env) cur-env -1)))
the word "syntax" got translated into ". #'", which is incorrect.
# cat z.scm (define (%syntax exp cur-env stx-env) (define (syntax exp cur-env stx-env) (if (eq? stx-env cur-env) (%wrap-syntax exp stx-env 1) (%wrap-syntax (syntax exp (cdr cur-env) stx-env) cur-env 1))) (%wrap-syntax (syntax exp cur-env stx-env) cur-env -1))
# cat zzz.scm (define (pretty-print x)(write x)(newline)) (define trans-define (lambda (l) (if (symbol? (cadr l)) `(define ,(cadr l) ,@(transform (cddr l))) (let ((procname (caadr l)) (formals (cdadr l)) (exps (transform (cddr l)))) `(define ,procname (lambda ,formals ,@exps)))))) (define (transform exp) (cond ((not (pair? exp)) exp) ((and (list? exp) (eq? 'quote (car exp))) exp) ((and (list? exp) (eq? 'define (car exp))) (trans-define exp)) ((list? exp) (map transform exp)) ((pair? exp) (cons (transform (car exp)) (transform (cdr exp)))) (else (begin (pretty-print (list "Which is not entirely unlike tea. " exp))(exit))))) (define (loop) (let ((text (read))) (if (eof-object? text) (exit) (begin (pretty-print (transform text)) (newline) (loop))))) (newline) (loop)