728x90
'함수를 만들고 그것에 심볼을 할당하고 그 함수를 호출한다.'
defn 은 def 와 비슷하지만, 함수를 위한 var 를 만든다.
defn 은 함수이름, 함수 인수들의 벡터, 함수 본문을 인수로 받는다 (빈벡터를 사용하여 함수를 인수없이 호출할 수도 있다)
함수를 호출하려면 함수를 괄호로 둘러싸서 사용하면 된다. 함수를 호출하면 클로져는 그 함수를 평가한 후 결과를 반환한다.
인수없이 정의한 예
1 2 3 4 5 6 7 | user=> (defn follow-the-rabbit [] "Off we go!") #'user/follow-the-rabbit user=> (follow-the-rabbit) "Off we go!" user=> | cs |
인수로 2개의 잼을 받고 그 잼들을 포함하는 맵을 반환하는 예
1 2 3 4 5 6 7 8 9 10 | user=> (defn shop-for-jams [jam1 jam2] #_=> {:name "jam-basket" #_=> :jam1 jam1 #_=> :jam2 jam2}) #'user/shop-for-jams user=> (shop-for-jams "strawberry" "marmalade") {:name "jam-basket", :jam1 "strawberry", :jam2 "marmalade"} | cs |
클로져에서는 무명함수는 fn 연산자를 통해 만든다.
fn 은 인수들의 벡터와 함수 본문을 받는다.
괄호로 감싸서 호출하면 된다.
1 2 3 4 5 6 7 8 9 | user=> (fn [] (str "Off we go" "!")) #object[user$eval1736$fn__1737 0x1e374af4 "user$eval1736$fn__1737@1e374af4"] user=> user=> ((fn [] (str "Off we go" "!"))) "Off we go!" user=> | cs |
defn 은 def 로 무명함수에 이름을 바인딩하는 것과 같다.
1 2 3 4 5 6 7 8 9 | user=> (def follow-again (fn [] (str "Off we go" "!"))) #'user/follow-again user=> user=> (follow-again) "Off we go!" user=> | cs |
다음과 같이 무명함수를 만들 수도 있다.
괄호 앞에 #을 붙이면 된다. 인수가 있다면 % 를, 인수가 여러개라면 아래처럼 %1 %2 로 %에 숫자를 붙여 표시하면 된다.
1 2 3 4 5 6 7 8 9 | user=> (#(str "Off we go" "!")) "Off we go!" user=> (#(str "Off we go" "!" " - " %) "again") "Off we go! - again" user=> (#(str "Off we go" "!" " - " %1 %2) "again" "?") "Off we go! - again?" user=> | cs |
728x90
'프로그래밍 Programming' 카테고리의 다른 글
클로저 11. 함수 만들기 - 이름공간에서 심볼 관리 (2) require (0) | 2018.08.18 |
---|---|
클로저 10. 함수 만들기 - 이름공간에서 심볼 관리 (1) (0) | 2018.08.18 |
클로저 08. 심볼과 바인딩 - def, var, let (0) | 2018.08.17 |
클로저 07. 데이터 컬렉션 - 리스트가 핵심 (0) | 2018.08.17 |
클로저 06. 데이터 컬렉션 - 집합 (0) | 2018.08.17 |