第 2 部分 · 高级特性
宏系统
宏系统
理解 Racket 宏的工作原理,学习语法变换和卫生宏。
宏是什么
宏让你扩展语言本身——创造新的语法形式:
#lang racket ;; 定义一个简单的宏 (define-syntax-rule (when condition body ...) (if condition (begin body ...) (void))) (when (> 5 3) (displayln "yes") (displayln "5 is greater"))
卫生宏
Racket 的宏是卫生的——它们不会意外捕获变量名:
(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) x ; => 2 y ; => 1
syntax-case
(define-syntax my-let (lambda (stx) (syntax-case stx () [(_ ((id val) ...) body ...) #'((lambda (id ...) body ...) val ...)])))
小结
宏是 Racket 最强大的特性之一。它让你可以安全地扩展语言,而不需要修改编译器。