Files
kite/examples/macros.scm
T

50 lines
1023 B
Scheme

; User-defined macros via define-syntax / syntax-rules.
(define-syntax swap!
(syntax-rules ()
((_ a b)
(let ((tmp a))
(set! a b)
(set! b tmp)))))
(define x 1)
(define y 2)
(swap! x y)
(display "swap x y -> ")
(display (list x y))
(newline)
; Hygiene: a user variable literally named tmp must not be captured
; by the tmp introduced inside the macro template.
(define tmp 10)
(define other 20)
(swap! tmp other)
(display "swap tmp other -> ")
(display (list tmp other))
(newline)
; Ellipsis patterns.
(define-syntax my-list
(syntax-rules ()
((_ e ...) (list e ...))))
(display "my-list -> ")
(display (my-list 1 2 3 4 5))
(newline)
; Recursive macro.
(define-syntax my-or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e rest ...) (let ((t e)) (if t t (my-or rest ...))))))
(display "my-or -> ")
(display (my-or #f #f 7 8))
(newline)
; when / unless come from the prelude.
(when (> 5 3)
(display "when fired")
(newline))
(unless (> 3 5)
(display "unless fired")
(newline))