2012-03-09 4 views
7

나는 Intro to Functions 문제를 겪고 있는데, 무슨 일이 일어나고 있는지 잘 모르겠다. 아래의 4 가지 표현은 어떻게 다른가요? 그것들이 모두 같으면 왜 4 가지 구문이 있습니까?Clojure 함수 리터럴

(partial + 5) 
#(+ % 5) 
(fn [x] (+ x 5)) 
(fn add-five [x] (+ x 5)) 

답변

18
  • (fn [x] (+ x 5))#(+ % 5) -이 두 후자는 단지 코드를 좀 더 간결하게 만들기 위해 dispatch macro를 사용하여 완전히 동일합니다. 짧은 기능의 경우 일반적으로 #() 구문을 사용하고 조금 더 긴 기능의 경우 (fn [x]) 구문을 사용하는 것이 좋습니다. 또한 익명 함수를 중첩 한 경우이 두 가지 모두에 대해 #()을 사용할 수 없습니다. 이는 이러한 모호성 때문에 발생할 수 있습니다.

  • (fn add-five [x] (+ x 5)) - 이름이 : add-five 인 것을 제외하고는 위의 두 것과 같습니다. 함수에 대한 재귀 호출을해야하는 경우처럼 유용 할 수 있습니다. *

  • (partial + 5) - 클로이에서 +은 가변 함수입니다. 이는 여러 가지 인수를 허용 할 수 있음을 의미합니다. (+ 1 2)(+ 1 2 3 4 5 6)은 모두 유효한 양식입니다. partial+과 동일한 새로운 함수를 작성합니다. 단, 첫 번째 인수는 항상 5입니다.이 때문에 ((partial + 5) 3 3 3)이 유효합니다. 이 경우 다른 양식을 사용할 수 없습니다.

* 꼬리 위치에서 재귀 호출을 수행 할 때는 recur을 사용해야하지만 항상 가능한 것은 아닙니다.

관련 문제