95 lines
1.8 KiB
Plaintext
95 lines
1.8 KiB
Plaintext
|
|
(display "define-syntax...")
|
|
|
|
(define-macro define-syntax
|
|
(lambda (form expander)
|
|
(expander `(define-macro ,(cadr form)
|
|
(let ((transformer ,(caddr form)))
|
|
(lambda (form expander)
|
|
(expander (transformer form
|
|
(lambda (x) x)
|
|
eq?)
|
|
expander))))
|
|
expander)))
|
|
|
|
(newline)
|
|
|
|
(display "define-syntax when...")
|
|
|
|
;; (define-syntax when
|
|
;; (syntax-rules ()
|
|
;; ((when condition exp ...)
|
|
;; (if condition
|
|
;; (begin exp ...)))))
|
|
|
|
;; (define-macro (when cond exp . rest)
|
|
;; `(if ,cond
|
|
;; (begin ,exp . ,rest)))
|
|
|
|
|
|
(define-macro (when clause . rest)
|
|
(cond
|
|
((not (eq? clause #f)) (cons 'let (cons '() rest)))))
|
|
|
|
(define-macro (ifwhen clause . rest)
|
|
(if (not (eq? clause #f)) (cons 'let (cons '() rest))))
|
|
|
|
(define-macro my-when
|
|
(lambda (test . branch)
|
|
(list 'if test (cons 'begin branch))))
|
|
|
|
;; (define-macro (q-when test . branch)
|
|
;; `(if ,test
|
|
;; (begin ,@branch)))
|
|
|
|
;; (define-macro (when clause exp . rest)
|
|
;; (display "all=")
|
|
;; (display (cons exp rest))
|
|
;; (newline)
|
|
;; `(if ,clause
|
|
;; (begin ,(cons exp rest))))
|
|
|
|
;; (define-macro (when clause . rest)
|
|
;; (cond
|
|
;; ((not (eq? clause #f)) (cons 'let (cons '() rest)))))
|
|
|
|
(newline)
|
|
|
|
(ifwhen #t
|
|
(display "true")
|
|
(newline))
|
|
|
|
(ifwhen #f
|
|
(display "false")
|
|
(newline)
|
|
'())
|
|
|
|
(my-when #t
|
|
(display "my-when")
|
|
(newline)
|
|
'())
|
|
|
|
|
|
;; (q-when #t
|
|
;; (display "q-when")
|
|
;; (newline)
|
|
;; '())
|
|
|
|
|
|
(define *gensym* 0)
|
|
(define (gensym)
|
|
(set! *gensym* (+ *gensym* 1))
|
|
(string->symbol (string-append "g" (number->string *gensym*))))
|
|
|
|
(define-macro bla (gensym))
|
|
|
|
(display bla) (newline)
|
|
(display bla) (newline)
|
|
(display bla) (newline)
|
|
|
|
(newline)
|
|
'()
|
|
|
|
;;EOF
|
|
EOF2
|