;; Normal evaluation (define (f x) (+ x 1)) (f 3) ;; Constants ,(define f 3) (list ,f 5) ;; Separate namespaces (f ,f) ;; Macros ,(define (inc! x) `(set! ,x (+ ,x 1))) (define x 1) ,(inc! `x) x ;; See what gets evaluated (,inc! `x) ;; Local macro ,(let ((inc! (lambda (x) `(set! ,x (+ ,x 10))))) `(begin ,(inc! `x) x)) ,(inc! `x) x ;; Meta-meta-level simple game ,,(define (inc! x) ``(set! ,,x (+ ,,x 1))) (,,inc! ``x) ,(,inc! ``x) ,,(inc! ``x) ;; Example from "Run-time Code Generation and Modal-ML" (define poly1 '(1 2 3 4)) (define (eval-poly x p) (if (null? p) 0 (+ (car p) (* x (eval-poly x (cdr p)))))) (eval-poly 2 poly1) (define (spec-poly p) (if (null? p) (lambda (x) 0) (let ((polyp (spec-poly (cdr p)))) (lambda (x) (+ (car p) (* x (polyp x))))))) ((spec-poly poly1) 2) ,(define (comp-poly p) (if (null? p) (lambda (x) `0) (let ((polyp (comp-poly (cdr p)))) (lambda (x) `(+ ,(car p) (* ,x ,(polyp x))))))) ((,comp-poly poly1) 2) (,(comp-poly `(1 2 3 4)) 2) ,((comp-poly `(1 2 3 4)) 2) ,(define (comp-poly p x) (if (null? p) `0 (let ((polyp (comp-poly (cdr p) x))) `(+ ,(car p) (* ,x ,polyp))))) (,comp-poly poly1 2) ,(comp-poly `(1 2 3 4) 2) (define-macro make-inc-n (lambda (n) (list 'lambda (list 'x) (list 'list ''set! 'x (list 'list ''+ 'x n))))) (define-macro make-inc-n (lambda (n) `(lambda (x) `(set! ,x (+ ,x ,,n))))) (define-macro inc3! (make-inc-n 3)) (define x 3) (inc3! x) ;; Constant definition ,(define c 3) (list ,c 5) ;; Macro definition & usage ,(define inc! (lambda (x) `(set! ,x (+ ,x 1)))) ,(inc! `x) ;; this applies the `macro' function on some syntax (,inc! `x) --> (set! x (+ x 1)) ;; Local macro ,(let ((inc! (lambda (x) `(set! ,x (+ ,x 10))))) (inc! `x)) ;; Meta-meta-level simple game ,,(define inc! (lambda (x) ``(set! ,,x (+ ,,x 1)))) (,,inc! ``x) --> `(set! ,`x (+ ,`x 1)) ,(,inc! ``x) --> (set! x (+ x 1)) ,,(inc! ``x) ; actually incrementing x ;; A simple meta-meta macro ,,(define make-inc-n (lambda (n) `(lambda (x) `(set! ,x (+ ,x ,,n))))) ,(define inc3! ,(make-inc-n ``3)) (define x 3) ,(inc3! `x) ;;Local variables: ;;hide-local-variable-section: t ;;enable-local-eval: t ;;eval:(autoload 'meta-highlight "meta") ;;eval:(make-local-hook 'find-file-hooks) ;;eval:(add-hook 'find-file-hooks '(lambda () (local-set-key [f9] 'meta-highlight) (local-set-key [(control f9)] 'meta-print)) t t) ;;End: