FFL的where子句是否允许引用前置定义的变量?
在Frogatto公式语言(FFL)的where子句中实现变量间引用的方法
我之前也踩过FFL里where子句这个变量引用的坑——目前它在同一条where语句里,不支持后定义的变量引用先定义的变量,哪怕你调整变量顺序也没用,就像你测试的这段代码显示的那样:
EVALUATING: [a,b] where b=a+1, a=1 ASSERTION FAILED: Unknown symbol 'a' [a,b] where b=a+1, a=1 ^^
这是因为FFL处理where子句的多变量赋值时,是同时解析所有赋值表达式的,不是按顺序逐个执行。所以不管你把a=1放在前面还是后面,b=a+1里的a都还没完成初始化,自然会抛出“未知符号”的错误。
要实现后一个变量引用前一个变量的效果,你需要把赋值拆分成嵌套的where子句,让变量按顺序逐个赋值,这样后面的变量就能引用前面已经定义好的变量了。
举个例子,你想要实现a=1、b=a+1的效果,应该写成:
[a,b] where a=1 where b=a+1
或者带括号的嵌套写法(可读性更强):
([a,b] where a=1) where b=a+1
这样FFL会先处理最内层的a=1,完成赋值后再处理外层的b=a+1,这时候a已经是有效定义的变量,就能正常计算出b=2的结果。
如果有更多变量需要依次引用,比如a=1、b=a+1、c=b*2,同样可以逐层嵌套:
[a,b,c] where a=1 where b=a+1 where c=b*2
这种写法能保证每个变量都能正确引用前面已经赋值完成的变量,完美解决你想要的简化写法需求。
内容的提问来源于stack exchange,提问作者Patrick Parker
相关产品推荐
相关产品推荐

