Pyret не допускает программу неявно связать то же самое имя несколько раз в той же области, так как это может привести к путанице или неоднозначное: какое название предназначалось?
ans = 3 + 4
ans = true # did you mean to use a different name here?
ans # which one was meant?
Pyret будет сигнализировать об ошибке на втором связывания АНС выше, говоря, что это тени ранее определение. То же правило применяется к именам, определенным в вложенных областях, например . Эта программа запрещена по правилу затенения, а также:
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
Общее правило для затенения, чтобы смотреть «вверх и влево», т.е. смотрит наружу из текущей области любых ограждающих областей, чтобы увидеть если существуют существующие привязки с тем же именем.
Но иногда переопределение с таким же именем имеет наибольший смысл. В этом случае программа может явно указать, что это значит, чтобы скрыть внешний определение, используя ключевое слово тень:
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
Я не знаком с языком, но слежка обычно относится к тому, новую переменную с тем же именем, что и в видимой внешней области. Это может сбить с толку. Возможно, «тень» - это ключевое слово, которое вы используете, чтобы разрешить затенение? Если вы удалите его, компилятор жалуется на переопределение 's'? –
@AlexanderTorstling Да !!! Вот и все, без «тени» компилятор жалуется на повторное объявление 's'. Я думаю, что тень означает «in-this-block-this-is-what-s-referes-to». Если вы передадите свой комментарий для ответа, я проголосую за него и отметю его правильно. – Ray
Приятно слышать, что это сработало. –