在Pyret语言中,“影子”有什么作用?

时间:2015-10-24 17:43:03

标签: programming-languages pyret

对于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

2 个答案:

答案 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'?