#lang scheme ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Lecture 7 examples ;;; Yilan Gu ;;; Oct. 22, 2009 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; simple examples (define-syntax SQUARE (syntax-rules () ((_ x) ; the same as (SQ x) or (SQUARE x) (* x x)))) (define-syntax let* (syntax-rules () ((_ () e1 e2 ...) (let () e1 e2 ...)) ((_ ((i1 v1) (i2 v2) ...) e1 e2 ...) (let ((i1 v1)) (let* ((i2 v2) ...) e1 e2 ...))))) (define-syntax cond (syntax-rules (else) ((_ (else e1 e2 ...)) (begin e1 e2 ...)) ((_ (e0 e1 e2 ...)) (if e0 (begin e1 e2 ...))) ((_ (e0 e1 e2 ...) c1 c2 ...) (if e0 (begin e1 e2 ...) (cond c1 c2 ...))))) ;; patten of improper list (define-syntax d1 (syntax-rules () ((_ (fun ... . rest) pgm ...) (display (quote rest)) ) )) (define-syntax d2 (syntax-rules () ((_ (fun . rest) pgm ...) (display (quote rest)) ) )) ;; example of (... ...) (define-syntax be-like-begin (syntax-rules () ((_ name) (define-syntax name (syntax-rules () ((_ e0 e1 (... ...)) (begin e0 e1 (... ...)))))))) ;;hygienic transformation (define-syntax swap (syntax-rules () ((_ v1 v2) (let ((t v1)) (set! v1 v2) (set! v2 t))))) ;; example of simplifying syntax format (define-syntax named-left (syntax-rules () ((named-let (( ) ...) ...) (letrec (( (lambda ( ...) ...))) ( ...))))) ;; example of redefine evaluation rules (let ((x #t) (y #f) ) (define-syntax and (syntax-rules () ((_) #f) ((_ e) e) ((_ e1 e2 e3 ...) (let ((t e1)) (if t t (and e2 e3 ...)))))) (and x y)) (let ((x #t) (y #f) ) (and x y)) ;; example of helper macro (define-syntax rec (syntax-rules () ((_ x e) (letrec ((x e)) x)))) (define example_rec (map (rec sum (lambda (x) (if (= x 0) 0 (+ x (sum (- x 1)))))) '(0 1 2 3 4 5))) (define-syntax let (syntax-rules () ((_ ((x v) ...) e1 e2 ...) ((lambda (x ...) e1 e2 ...) v ...)) ((_ f ((x v) ...) e1 e2 ...) ((rec f (lambda (x ...) e1 e2 ...)) v ...))))