30 minutes ago, Markku Rontu wrote: > Well one problem is that all these syntax objects have introduced a > new language, with accessors and functions that are completely new > that must be learnt. And programs using these new functions look > quite different to standard data structure (i.e., cons cell) > manipulation. [...]
Ah, but it's not a new language -- just a new type. It's a good hook to explain it in a different way -- it's as if you had this: (provide syntax? syntax-e syntax->datum) (struct syntax (e)) ;; a wrapper for syntax values, holding a single value which is a ;; plain sexpr -- don't give out the `syntax' constructor. (define (syntax->datum stx) (unless (syntax? stx) (raise-type-error 'syntax->datum "syntax" stx)) (let loop ([d stx]) (cond [(syntax? d) (loop (syntax-e d))] [(pair? d) (cons (loop (car d) (cdr d)))] [(vector? d) ...] ... [else d]))) and then extended it with some opaque lexical context field: (provide syntax? syntax-e syntax->datum datum->syntax) (struct syntax (e ctx)) ;; but don't provide `syntax-ctx', instead have a function that ;; creates a syntax using the context of another: (define (datum->syntax c dtm) (syntax (syntax-ctx c) dtm)) and this goes on. (This is a nice way to explain it, since many explanations take `syntax-case' as the primitive and the rest is derived from it.) -- ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: http://barzilay.org/ Maze is Life! _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users