나는 clo jure를 처음 사용했습니다. (3)
과 단지 3
의 차이점은 무엇입니까? 내가 (3)
일 경우이 예외가 발생합니다.Clojure의 (3)과 (3)의 차이
java.lang.ClassCastException : java.lang.Long을 clojure.lang.IFn으로 캐스팅 할 수 없습니다.
나는 clo jure를 처음 사용했습니다. (3)
과 단지 3
의 차이점은 무엇입니까? 내가 (3)
일 경우이 예외가 발생합니다.Clojure의 (3)과 (3)의 차이
java.lang.ClassCastException : java.lang.Long을 clojure.lang.IFn으로 캐스팅 할 수 없습니다.
3
3.(3)
는, 당신은 매개 변수없이 기능 3
를 호출하는 함수의 응용하려고하는 것입니다 문자 수를합니다. (그러한 기능은 없으므로 정의 할 수없는 것으로 보입니다.)'(3)
은 하나의 목록 인 3
입니다. 함수 응용 프로그램 인 (list 3)
과 동일합니다. 여기 는 REPL 세션입니다 :
repl=> 3
3
repl=> (3)
ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn repl/eval1388 (NO_SOURCE_FILE:1)
repl=> '(3)
(3)
repl=> (list 3)
(3)
repl=> => (defn 3 [] 3)
ClassCastException java.lang.Long cannot be cast to clojure.lang.IObj clojure.core/with-meta (core.clj:211)
Clojure에서 괄호는 함수 적용을 의미합니다. (3)
은 존재하지 않는 3
이라는 함수를 호출하려고합니다.
에서 괄호 기능 응용 프로그램을 의미 lisps, 그래서이 :
(a b c d)
수단 인수에 a
을 적용 b c d
당신은 함수가 아닙니다 3
을 적용하려는 않으며 변환 할 수 있습니다 하나에.
당신은 괄호 표시하는 사실에 익숙해 져야 리스프로 시작합니다. 운영자 우선 순위를 명확히하기 위해 괄호를 더 추가 할 수는 없지만 모든 것이 접두어 형식이므로 연산자 모호성이 없습니다.
모든 parenethesis가 중요하다는 사실에 익숙해지면 오프닝 하나의 항목을 정신적으로 오른쪽으로 옮깁니다. (println "hello")
은 println("hello")
이됩니다.
언어가 매우 규칙적이어서 (3)
은 3()
으로 읽어야합니다. 3
은 함수가 아니므로 호출 할 수 없습니다.
+1 좋은 답변이지만 괄호를 움직이는 것이 유용한 이유는 무엇입니까? – fastcodejava
중요한 점은 여는 괄호의 위치보다는 표기법의 규칙 성 (선행 규칙 없음, 매크로/메타 프로그래밍과 함께 작업하기가 더 쉽다)입니다. 새벽에, 학부모 님들은 거기 머물 계획이 없습니다 : http://en.wikipedia.org/wiki/M-expression – cgrand
3이 유일한 요소이므로 목록에 인용 부호가 필요합니다. – soulcheck