在 Scheme 语言中(让我们将 R5RS 作为语言参考)卫生宏可以使用结构
(define-syntax <keyword> <transformer>)
定义,其中 <keyword>
是宏的名称,<transformer>
描述宏将匹配的 <pattern>
<template>
描述了应该如何转换该模式。 <transformer>
有以下形式:
例如:
(syntax-rules <literals> <syntax-rule> ...)
但是,也允许指定一些
<syntax-rule>
作为(<pattern> <template>)
(define-syntax swap
(syntax-rules ()
(; pattern to be matched:
(swap x y)
; template the pattern will get replaced by:
(let ((tmp x))
(set! x y)
(set! y tmp)))))
的<literals>
中的任何标识符都是模式变量,除非它是开始模式的
syntax-rules
,或者在
<pattern>
中列出,或者是标识符
<syntax-rule>
。模式变量匹配任意输入元素,并用于在模板中返回与模式匹配的输入元素。然而,出现在
<keyword>
中的标识符被解释为要与输入的相应子形式匹配的文字标识符。
实际上,在几乎所有的例子中,人们都可以找到这个文字列表
<literals>
保持为空(如上例所示)。有人可以为我提供一个简单的例子来说明具有此类文字的相关性。在什么样的实际用例中使用这样的文字才有意义?一个具体而简单的例子会有所帮助。