Racket 编程

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 最强大的特性之一。它让你可以安全地扩展语言,而不需要修改编译器。