갈루아의 반서재

'함수를 만들고 그것에 심볼을 할당하고 그 함수를 호출한다.'


defndef 와 비슷하지만, 함수를 위한 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