2015-10-24 2 views
3

С Pyret я не могу найти документацию на shadow. Вот блок кода, который я наткнулся на это:На языке Pyret, что делает «тень»?

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

Я не знаком с языком, но слежка обычно относится к тому, новую переменную с тем же именем, что и в видимой внешней области. Это может сбить с толку. Возможно, «тень» - это ключевое слово, которое вы используете, чтобы разрешить затенение? Если вы удалите его, компилятор жалуется на переопределение 's'? –

+0

@AlexanderTorstling Да !!! Вот и все, без «тени» компилятор жалуется на повторное объявление 's'. Я думаю, что тень означает «in-this-block-this-is-what-s-referes-to». Если вы передадите свой комментарий для ответа, я проголосую за него и отметю его правильно. – Ray

+0

Приятно слышать, что это сработало. –

ответ

1

Я не знаком с языком, но слежка обычно относится к тому, новую переменную с тем же именем, что и в видимой внешней области. Это может сбить с толку. Возможно, «тень» - это ключевое слово, которое вы используете, чтобы разрешить затенение? Если вы удалите его, компилятор жалуется на переопределение 's'?

+0

Язык был создан, чтобы имитировать форму python от людей в DrRacket, но включает в себя ряд дополнений, позволяющих более эффективно преподавать основы языка программирования. – Ray

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 = 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 
Смежные вопросы