Clojure Repl에 "Hello, World"를 입력하면 왜 'Nil'이라고 말합니까?
-
06-07-2019 - |
문제
나는 이것을 Clojure Repl에 입력했다 (Enclojure netbeans 플러그인 사용) :
user=> "hello, world"
"hello, world"
nil
Nil은 무엇입니까?
해결책
모든 기능 또는 매크로 호출은 Clojure에서 값을 반환합니다. if
다른 언어로 "진술"인 진술 또는 루핑 구성 또는 조정 기능 정의 또는 인쇄 문. LISP에는 진술/표현 이분법이 없습니다. 모든 것이 표현입니다.
그래서 println
그리고 친구는 부작용으로 표준 출력으로 인쇄하고 반환 nil
, 반품에 유용한 것이없는 대부분의 기능과 마찬가지로.
그러나 REPL에 문자 그대로 문자열을 입력하면 문자열 자체를 반환해야합니다. DigitalRoss ' 게시하다.
user> (println "hello world")
hello world
nil
user> "hello world"
"hello world"
user>
첫 번째 경우 hello world
라인은 표준 출력에 인쇄 된 것입니다 println
. nil
반환 된 값입니다 println
. 두 번째 경우, "hello world"
반환 된 값입니다 "hello world"
문자열이 스스로 평가되므로. 이 경우 표준 출력에 인쇄되지 않은 것은 없습니다.
(점액 및 기타 대체 인터페이스는 표준 출력을 색상으로 hello world
위의 줄)은 REPL에서 입력 한 반환 된 값과 다르게 (nil
위), 다른 방법으로 혼란 스러울 수 있습니다.)
이것이 당신이 대체에서 볼 수있는 것입니다. 당신이 게시 한 것은 enclojure의 인공물이어야합니다.
다른 팁
재현 할 수 없습니다 ...
Clojure 1.0.0에서 나를 위해 그렇게하지 않습니다.
$ java -cp clo*.jar clojure.lang.Repl
Clojure 1.0.0-
user=> "hello, world"
"hello, world"
user=>
CRLF 라인 시퀀스를 Windows에서 두 가지 다른 표현으로 해석하는 것과 관련된 최근 버그가 있습니다. Clojure에서 문자열의 반환 값은 자체 문자열이어야합니다.
나는 그것이 당신의 표현의 반환 가치라고 생각합니다. Ruby의 경우 Puts Method가 있습니다.