我真的试着让自己的头脑围绕着理解策略/XT的第一步。我已经用谷歌搜索了很多,我找到的所有网络资源似乎在一开始就有了足够大的飞跃,以至于我无法建立联系。让我解释一下。
我对抽象语法树的理解如下:
Minus(Call(Var("f"),[Plus(Var("a"),Int("10"))]),Int("3"))但是,文档似乎(甚至在下一句中)实现了这样的飞跃:
LetSplit :
Let([d1, d2 | d*], e*) ->
Let([d1], Let([d2 | d*], e*))这对我来说毫无意义。有人能解释一下LetSplit是怎么回事吗?
另外,有没有一个很好的资源,可以让你更容易地阅读《战略/XT》网站上那本庞大而复杂的官方“教程”,从而更好地加深对《战略/XT》的理解?
谢谢!
发布于 2011-07-26 21:27:48
LetSplit : Let(d1,d2 | d*,e*) -> Let(d1,Let(d2 | d*,e*))
这是一个名称为LetSplit的重写规则。
它等同于策略(语法糖)
LetSplit =
?Let([d1, d2 | d*], e*) ; // match
!Let([d1], Let([d2 | d*], e*)) // build当调用时,当左侧的Let([d1, d2 | d*], e*) (匹配部分)与当前术语匹配时,当前术语将被右侧的Let([d1], Let([d2 | d*], e*)) (构建部分)替换。当左侧不匹配时,规则失败,当前项保持不变。
d1、d2、d*、e*是绑定到在匹配期间在其各自位置找到的子项的项变量。然后在构建部分中使用这些名称,在该部分中,它们将展开到它们之前绑定到的子树。请注意,实际上,*和‘可能出现在术语变量名的末尾。单引号没有特殊含义,而*在列表构建操作中有特殊含义(这里不是这种情况)。
匹配部分中的语法[d1, d2 | d*]匹配任何至少包含两个元素的列表。这些元素将被绑定到d1和d2,列表中的其余元素将被绑定到d* (因此d*将是一个列表,并且可能是空的列表[])。
还有,有没有一个很好的资源,可以让你更容易阅读战略/XT网站上的庞大而复杂的官方“教程”,以加深对战略/XT的深入理解?
研究论文。虽然无可否认,它们并不是很容易阅读,但可以说,它们是解释一些更高级概念的唯一地方。
无论如何,请在stackoverflow上提出更多问题,我将尝试回答这些问题:-)
https://stackoverflow.com/questions/5768345
复制相似问题