심볼 바인딩 함수

클로저

심볼과 바인딩의 기술

클로저 심볼은 값을 가르킨다. 심볼이 평가되면 그 심볼이 가리키는 값을 반환한다

def 을 통해 심볼을 만들수 있는데(변수를 만든다는 의미랑 비슷) def는 심볼에 값을 직접 바인딩하지 않고, var를 통해서 한다

또한 심볼을 만들면 이름공간에 var 객체를 만든다는 뜻이기도 한데, 기본적으로 user 이름공간에 만든다

하지만 우리는 전역적인 var 객체를 만들고 싶지 않고, 특정 scope에서 유효한 var를 만들고 싶기 때문에 let울 사용하여 let 영역 안에서만 심볼에 값을 바인딩되게 할 수 있다.

함수 만들기

함수는 defn 으로 만드는데, def과 아주 비슷한데 함수를 위한 var을 만든다 defn은 함수 이름, 함수 인수들의 벡터, 함수 본문을 인수로 받는다, 함수를 호출할때 괄호를 쳐서 사용하면된다 함수를 호출하면 클로저는 그 함수를 평가한 후 결과를 반환한다.

익명함수(무명함수)

fn 을 통해 익명함수를 만들어 줄수 있다, 함수와 동일하게 괄호를 쳐서 호출해줄수 있고, def를 통해 익명함수를 심볼로 만들면 defn과 완벽하게 동일한 방식으로 함수를 선언하게 되는 것이다

이 익명함수 또한 더 단축해서 사용할수 있다 (#()를 통해 익명함수 만들수 있음) 그리고 단축형일 때의 인자로는 %, %1, %2 등 숫자를 써가면서 인자를 불러올수 있다

이름공간 사용

보통 clojure.set은 REPL이 시작될때 같이 로딩이 되기때문에 이름공간 선언 없이 바로 (clojure.set/union #{} #{}) 과 같이 사용할 수 있는데 같이 로딩이 안되서 사용이 안된다면 require 'clojure.set 으로 이름공간을 로딩해 줄 수 있다 여기서 clojure.set 앞에 '는 왜 붙을까 찾아봤는데 '는 클로저에서 표현식이 평가받지 않도록 만든다고 한다 그래서 원래형태 그대로 전달이 된다고 한다 (정확하게는 모르겠음)

별칭 사용

다른 언어와 비슷하게 각 이름공간에 대한 별칭을 해줄수 있는데 전역공간에서 별칭을 만드는 것과 특정 이름공간에서 별칭을 만드는게 사뭇 다르다

전역공간에서 별칭은

(require '[alice.favfoods :as aq])

위와 같이 정해줄수 있지만 보통은 ns의 속성으로 :require를 많이쓴다

(ns wonderland
	(:require [alice.favfoods :as af])
)

그리고 해당 별칭들은 해당 이름공간에서만 유효한 별칭들이다(벗어나면 유효하지 않음)