2014-10-04 18 views
2

내가 얼랑 아닌 다른 언어로 REPL을 구현하고 싶습니다, 정말 대화 형 erl (Eshell) 프롬프트의이 기능에 흥미 오전 :Erlang의 Eshell은 비동기 출력에 영향을받지 않는 입력 라인을 어떻게 유지합니까?

1> spawn(fun() -> timer:sleep(5000), io:format("~p~n", ["later"]) end). 
<0.34.0> 
2> i can ty 

여기 행한 결국 일부 백그라운드 프로세스를 생성한다 그래서 터미널에 씁니다. 오초에 의해 통과하고 "later"2> 위에 삽입됩니다대로 그 동안 나는 결과 i can ty를 입력 한 : 같은 배쉬 나 Node.js를 다른 언어로

1> spawn(fun() -> timer:sleep(5000), io:format("~p~n", ["later"]) end). 
<0.34.0> 
"later"  
2> i can type... 

이 오히려 이어질 것 예를 들면 다음과 같습니다 :

2> i can ty"later" 
pe... 

Erlang은 어떻게합니까? 인터넷 검색을 시도하고 소스 코드를 간략하게 살펴 보았지만 이것이 어떻게 성취되는지를 알 수 없었습니다. 나는 그것이 몇 가지 터미널 제어 시퀀스를 포함해야한다고 가정한다.

+0

이것은 쉬운 질문은 아니며 솔직히 대답을 찾을 수 없습니다. 정말로 관심이 있다면 erlang mailig list를 치고, 멋진 고양이는 모두 놀 수 있습니다 :'erlang-questions @ erlang.org' – mpm

+0

stdout에 쓰는 것은 프로세스에 의해 수행됩니다. 보낸 메시지는 셸에서 가로 챌 수 있습니다. – rightfold

답변

4

Erlang 셸은 많은 프로세스가있는 분산 시스템에서 작동해야하기 때문에 다른 언어보다 복잡합니다. Fred Hebert는 "As bad as anything else"이라는 Erlang 셸에 대한 기사를 썼습니다.

기본적으로 io:format을 호출하면 그룹 리더에게 메시지가 전송됩니다. "Learn you some Erlang/Building OTP applications"(다시 Fred)에 그룹 리더에 관한 메모가 있고 io protocol입니다.

@rightfold는 자신의 의견에 언급 된대로 io_protocol은 메시지를 보내는 것과 관련이 있습니다. 즉, 콘솔에 순차적으로 기록됩니다. 다른 언어로, 동시에 작성하는 프로세스가 더 많은 경우 Erlang이 아닌 메시지의 일부를 인터리브 할 수 있습니다. 프로토콜은 또한 응답을 기다리는 것을 포함합니다. 예를 들어, io:execute_requeston github을 확인하십시오.

user_drv 실제 tty에 메시지를 작성하기위한 책임이하고 싶은 곳은 넣어 ncurses을 사용하기 때문에 당신이 깨끗한 역사를 잎, 이는 쓰기 시작 명령 전에 메시지를 삽입 할 수 있습니다.

+0

감사합니다. 나는'ncurses '의 사용이 여기에서 중요한 통찰력이라고 생각합니다. –