해결방안: 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
'프로그래밍 언어 노트 > Clojure' 카테고리의 다른 글
[Clojure] 좋은 사이트들 (0) | 2018.10.14 |
---|---|
[Clojure 연습] 4. 4Clojure Elementary 2 (0) | 2018.10.14 |
[Clojure 연습] 3. 4Clojure Elementary (0) | 2018.10.14 |
[Clojure 연습] 2. 기초 연습문제 (0) | 2018.10.13 |
[Clojure 연습] 1. 기초 연습문제 (0) | 2018.10.07 |