2013-08-11 7 views
0

저는 웹 배경에서 Erlang으로 시작하기 때문에 몇 가지 매우 기본적인 튜토리얼을 살펴 보겠습니다. 그러나, 나는 예상되는 결과를 얻을 수없는변수를 바인딩하지 않습니까?

-module(calc). 

-export([test/0]). 

test() -> 
    X = io:get_line('X: '). 

: 나는 다음과 같은 파일 this forum post을 기반으로 한

1> c(calc). 
calc.erl:7: Warning: variable 'X' is unused 
{ok,calc} 
2> calc:test(). 
X: test 
"test\n" 
3> X. 
* 1: variable 'X' is unbound 

해서는 안 사용자 입력에 X = io:get_line('X: '). 바인드 X?

답변

2

Xtest 함수에서만 볼 수 있으며 얼랭에는 전역 변수가 없습니다. 함수 외부에서 사용될 모든 값은 함수 호출자에게 리턴되어야합니다.

test 함수는 X의 값을 함수 결과로 반환합니다. 할당은 표현식 => 바운드 값이 결과이고 함수의 마지막 표현식이 함수 결과로 반환됩니다. 따라서 셸에서 X=calc:test().을 수행하면 X을 결과에 바인딩 할 수 있습니다.

변수가있는 잡아 당김은 특히 쉘로 작업 할 때 단일 대입입니다. 셸에서 X=calc:test().을 두 번 실행했지만 다른 데이터를 입력하면 두 번째 오류가 발생합니다! 셸에서 f(X).을 사용하여 X을 다시 바인딩 해제합니다.

+0

두 번째 코드 블록의'test \ n "'줄은 X의 값을 반환하는 test()이며, 그 시점에서 프로그램 실행이 중단되므로 X는 더 이상 3>에서 오류가 없어진다. –

+1

@Phillip'test()'는'X'의 값을 반환하지만 변수 이름'X'는 쉘에서 사용할 수 없습니다. 이것은'test()'에서만 사용할 수 있습니다. 그래서 3에 에러가 생기는 것입니다. 2에서'X = calc : test()'를 할 필요가 있습니다. – johlo