对于Pyret,我找不到关于shadow
的任何文档。这是我遇到的代码块:
fun parse(s :: S.S-Exp) -> ArithC:
cases (S.S-Exp) s:
| s-num(n) => numC(n)
| s-list(shadow s) =>
cases (List) s:
| empty => raise("parse: unexpected empty list")
| link(op, args) =>
argL = L.index(args, 0)
argR = L.index(args, 1)
if op.s == "+":
plusC(parse(argL), parse(argR))
else if op.s == "*":
multC(parse(argL), parse(argR))
end
end
| else =>
raise("parse: not number or list")
end
end
答案 0 :(得分:2)
从Pyret中的阴影文档中可以找到here:
Pyret不允许程序隐式绑定相同的名称 在同一范围内多次,因为这可能令人困惑或 含糊不清:这个名字的意思是什么?
ans = 3 + 4 ans = true # did you mean to use a different name here? ans # which one was meant?
Pyret会在第二个时发出错误信号 上面的ans的绑定,说它影响了早先的定义。 同样的规则适用于嵌套作用域中定义的名称,例如 功能。阴影规则也不允许该程序:
ans = 3 + 4 fun oops(x): ans = x * 2 # Shadows the outer ans ans end fun another-oops(ans): # Also shadows the outer ans if ans: 3 else: 4 end end
阴影的一般规则是向上和向左看",即 从目前的范围向外看到任何封闭的范围,看 如果有任何现有的同名绑定。
但有时,重新定义相同名称最有意义。在这 例如,程序可以明确指定它意味着隐藏外部 定义,使用shadow关键字:
ans = 3 + 4 fun oops(x): shadow ans = x * 2 # <-------------------------+ ans # uses the ans defined the line above --+ end fun another-oops(shadow ans): if ans: 3 else: 3 end # uses the function's parameter end
答案 1 :(得分:1)
我不熟悉这种语言,但是阴影通常指的是一个新变量,其名称与可见外部范围中的变量相同。这可能令人困惑。也许'shadow'是一个用来允许阴影的关键字?如果你删除它,编译器是否会抱怨重新定义's'?