我真的试图了解了解Stratego / XT的第一步。我已经google了很多,我发现的所有网络资源似乎都在一开始就有了足够大的飞跃,我无法建立连接。让我解释一下。
我理解这样的抽象语法树:
Minus(Call(Var("f"),[Plus(Var("a"),Int("10"))]),Int("3"))
然而,似乎(在下一句话中)文件实现了这一点:
LetSplit :
Let([d1, d2 | d*], e*) ->
Let([d1], Let([d2 | d*], e*))
这对我没有意义。有人可以用LetSplit
来解释这里发生了什么吗?
此外,是否有一个很好的资源可以让您更深入地了解Stratego / XT,这些内容更易于阅读Stratego / XT网站上的garganutan和复杂官方“教程”?
谢谢!
答案 0 :(得分:3)
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*))
( build 部分)。当左侧不匹配时,规则失败,当前术语保持不变。
d1,d2,d *,e *是与在比赛期间在各自位置找到的子项绑定的术语变量。然后在构建部分中使用这些名称,然后将它们扩展到之前绑定的子树。请注意,确实,*和'可能出现在术语变量名称的末尾。单引号没有特殊含义,而*在列表构建操作中具有特殊含义(这里不是这种情况)。
匹配部分中的语法[d1, d2 | d*]
匹配具有至少两个元素的任何列表。这些元素将绑定到d1和d2,列表中的其余元素将绑定到d *(因此d *将是一个列表,可能是空列表[]
)。
此外,是否有足够的资源来进一步深入了解 Stratego / XT更容易阅读garganutan和复杂 Stratego / XT网站上的官方“教程”?
研究论文。虽然不可否认它们并不是很容易阅读,但可以说它们是解释一些更高级概念的唯一地方。
无论如何,请随时在stackoverflow上提出更多问题,我会尽力回答: - )