본문 바로가기

프로그래밍 언어 노트/Clojure

[Clojure] read-line을 통하여 값을 읽을때 print보다 먼저 불리는 현상

해결방안: https://stackoverflow.com/questions/388057/clojure-side-effects-happening-out-of-order  (flush 를 이용)


(defn input []
(print "Type! :")
(let [x (read-line)]
(println (str "InputValue is:" x))
))

(input)

이런상황에서

보통의 C++ C# java ...기타등등 언어라면


당연히 Type: 이 출력되고

그다음 x를 입력받고

그다음

InputValue is : 10" 이런식으로 출력되어야하는데


실행시키면 read-line이 먼저실행되고

그다음 Type!: InputValue is 10 이런식으로 출력이된다.

 aaaaa
Type! :InputValue is:aaaaa


그런데

(defn input []
(println "Type! :")
(let [x (read-line)]
(println (str "InputValue is:" x))
))

(input)

근데 print 가 아닌 printIn 을 사용하면 정상적으로 작동한다.

다만 당연히 Type!: 하고 띄어쓰기가 생긴다


Type! :
 aaaaa
InputValue is:aaaaa


아무리 생각해도 먼저 불릴이유가 없는데

망할 이거 하루종일 궁금하다가 찾아보았다.


println은 라인이끝나고 flush 가 포함되어있지만


그냥 print는 플러시가 없어서 flush가 나올때까지 기다리다가 flush가 끝나야 출력이 되는거 같은데

아마 함수가 끝나면 자동적으로 flush가 되는듯하다.


따라서 먼저 불리는거는 아니고 버퍼에는 쓰여져 있지만 함수가 끝날때까지 출력되지 않다가 후에 출력되는것으로 예상된다.

(defn input []
(print "Type! :")
(flush)
(let [x (read-line)]
(println (str "InputValue is:" x))
))

(input)
Type! : aaaaa
InputValue is:aaaaa

flush를 해주면 정상적으로 동작한다.

728x90