2013-08-03 2 views
0

표현식을 평가 한 후 특정 변수가 바인드되었는지 여부를 알 수있는 방법이 있습니까?Erlang - 언 바운드 변수 확인

내 코드 : 나는 어떤 "후"또는하지 작업이 있는지 여부를 알고 필요한

{ok, After} = ts_dynvars:lookup(last, DynVars), 

. 아마도 "ok"를 내 목적으로 사용할 수 있을까요?

감사합니다.

+0

어떤 상황에서'After'는이 경우에 바인딩되지 않습니까? – kjw0188

답변

1

표현식에서 언 바운드 변수를 참조하려는 경우 컴파일 오류입니다. 특히

{ok, After} = ts_dynvars:lookup(last, DynVars), 

후 2 가능성은있다 : 패턴이 일치하는 경우, After바인딩이고, 사용될 수있다 그렇지 않은 경우 예외가 throw되고 After과 작동하려고하는 코드는 절대로 실행되지 않습니다.

UPDATE :

당신이 패턴은 물론이

일치하지 않는 상황에서 지점 코드 실행하는 방법은 없습니다 나에게 말하고있다 :

case ts_dynvars:lookup(last, DynVars) of 
    {ok, After} -> ...; 
    _ -> ... %% or other patterns 
end 

하지만 컴파일러에서는 다른 분기에서 After을 사용할 수 없으며 case 이후에는 사용할 수 없습니다 (모두 브랜치 바인딩 After).

모든

에서이 예외를 잡을 수없는 때문이다 :

try 
    {ok, After} = ts_dynvars:lookup(last, DynVars), 
    ... 
catch 
    _:_ -> ... 
end 

그러나 다시, 당신은 catch 섹션 또는 try이 끝난 후 After를 사용할 수 없습니다 (당신 변수를 After이라는 변수에 바인딩 할 수 있습니다.

+0

패턴이 일치하지 않는 상황에서 코드 실행을 분기 할 수있는 방법이 없다고 말하고 있습니까? 즉이 예외는 전혀 포착 할 수없는 것입니까? – kellogs

+0

@kellogs 업데이트 된 답변보기. –

1

3의 가능성 :

  • After이 미 바인드하고 ts_dynvars:lookup/2이 다음 After이 (사본 제조) Value에 바인딩 {ok,Value} 형태 의 결과를 반환하고 프로그램이 다음 행으로 이동 .
  • After은 이미 바인드되어 있으며 ts_dynvars:lookup/2은 정확하게 {ok,After}을 반환합니다. 패턴은 일치합니다. After은 그 값을 유지합니다. 프로그램은 다음 줄로갑니다.
  • ts_dynvars:lookup/2{ok,After}과 일치하지 않으며 이전 줄 2에 설명 된 과 같습니다. 그런 다음 실행이 중지되고 VM이 예외 {badmatch,Ret}을 발생시킵니다.회선이 catch 또는 try 섹션에 있으면 프로세스가 계속 진행되고 그렇지 않으면 프로세스가 중단됩니다. 다음 코드 행 (있는 경우)은 절대로 실행되지 않습니다.