40 lines
603 B
Racket
40 lines
603 B
Racket
#lang racket
|
|
|
|
|
|
|
|
(define-syntax let*
|
|
(syntax-rules () ;; special tokens
|
|
[(let* () body ...)
|
|
(let () body ...)]
|
|
[(let* ((x v) (xs vs) ...) body ...)
|
|
(let ((x v)) (let* ((xs vs) ...) body ...))]))
|
|
|
|
|
|
|
|
(let* [(x 5)
|
|
(y (+ x 2))]
|
|
y)
|
|
;; ->
|
|
(let ((x 5))
|
|
(let* ((y (+ x 2)))
|
|
y))
|
|
;; ->
|
|
(let ((x 5))
|
|
(let ((y (+ x 2)))
|
|
(let* ()
|
|
y)))
|
|
;; ->
|
|
(let ((x 5))
|
|
(let ((y (+ x 2)))
|
|
(let ()
|
|
y)))
|
|
|
|
(define-syntax annd
|
|
(syntax-rules ()
|
|
[(annd) #t]
|
|
[(annd x) (if x x #f)]
|
|
[(annd x y ...) (if x (annd y ...) #f)]))
|
|
|
|
(annd #f (/ 5 0))
|
|
(and 5 2 3)
|
|
(annd 5 2 3) |