定义语义的常用方法是(例如):
return v if [some other condition]
otherwise, return error
例如,考虑
(define-language simple-dispatch
(e ::= v (+ e e))
(v ::= number string)
(res ::= e err)
(E ::= hole (+ E e) (+ v E)))
然后我们可以定义归约关系
(define s-> (reduction-relation simple-dispatch
#:domain res
(--> (in-hole E (+ number_1 number_2))
(in-hole E ,(+ number_1 number_2)))
(--> (in-hole E (+ any any))
err)))
这是执行此操作的自然方式,因为它避免了必须为 3 个失败案例(数字字符串、字符串编号、字符串字符串)中的每一个编写单独的匹配器。但是,它会产生像这样运行它的问题:
(apply-reduction-relation s-> (term (+ 2 2)))
(正确地)显示它可以让你减少到错误或数字 4。有没有办法制作一个“例外”模式来避免必须检查所有组成案例?