2013-08-31 1 views
1

나는 clo jure를 처음 사용했습니다. (​3​)과 단지 3의 차이점은 무엇입니까? 내가 ​(3) 일 경우이 예외가 발생합니다.Clojure의 (3)과 (3)의 차이

java.lang.ClassCastException : java.lang.Long을 clojure.lang.IFn으로 캐스팅 할 수 없습니다.

답변

11
  • 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) 
6

Clojure에서 괄호는 함수 적용을 의미합니다. (3)은 존재하지 않는 3이라는 함수를 호출하려고합니다.

8

에서 괄호 기능 응용 프로그램을 의미 lisps, 그래서이 :

(a b c d) 

수단 인수에 a을 적용 b c d

당신은 함수가 아닙니다 3을 적용하려는 않으며 변환 할 수 있습니다 하나에.

+5

3이 유일한 요소이므로 목록에 인용 부호가 필요합니다. – soulcheck

3

당신은 괄호 표시하는 사실에 익숙해 져야 리스프로 시작합니다. 운영자 우선 순위를 명확히하기 위해 괄호를 더 추가 할 수는 없지만 모든 것이 접두어 형식이므로 연산자 모호성이 없습니다.

모든 parenethesis가 중요하다는 사실에 익숙해지면 오프닝 하나의 항목을 정신적으로 오른쪽으로 옮깁니다. (println "hello")println("hello")이됩니다.

언어가 매우 규칙적이어서 (3)3()으로 읽어야합니다. 3은 함수가 아니므로 호출 할 수 없습니다.

+1

+1 좋은 답변이지만 괄호를 움직이는 것이 유용한 이유는 무엇입니까? – fastcodejava

+2

중요한 점은 여는 괄호의 위치보다는 표기법의 규칙 성 (선행 규칙 없음, 매크로/메타 프로그래밍과 함께 작업하기가 더 쉽다)입니다. 새벽에, 학부모 님들은 거기 머물 계획이 없습니다 : http://en.wikipedia.org/wiki/M-expression – cgrand