
丰富的序列
|
37
在
match
语句中添加以下两行可以实现这种句法。
case ['define', [Symbol() as name, *parms], *body] if body:
env[name] = Procedure(parms, body, env)
我选择把这个
case
子句放在示例
2-12
中匹配其他
define
的
case
子句后面。在这个示例
中,
define
的不同情况以何种顺序放置其实无关紧要,因为没有哪个匹配对象能同时满足
所有模式:现有的
define
的
case
子句,第二个元素必须是
Symbol
实例;新增的快捷句法
用来定义函数,第二个元素必须是一个以
Symbol
实例开头的序列。
可以想象一下,如果按照示例
2-1
1
那样不使用模式匹配,为了支持新
define
句法需要多
少工作量。
match
语句做的事情比类
C
语言中的
switch
语句多出不少。
模式匹配是一种声明式编程风格,即描述你想匹配“什么”,而不是“如何”匹配,这样
写出的代码结构与数据结构是一致的,如表
2-2
所示。
表 2-2:一些 Scheme 句法形式和处理句法的
case
模式
Scheme
句法 序列模式
(quote exp) ['quote', exp]
(if test conseq alt) ['if', test, conseq, alt]
(lambda (parms...) body1 body2...) ['lambda', [*parms], *body] if body
(define name exp) ...