Clojure에서 이름에 값을 바인딩하는 것을 _var_라고 해요. 최상위(전역) var는 다른 언어의 상수와 비슷해요.
최상위 var는 def로 정의해요:
(def fingers 10)
fingers
;;=> 10
defn을 사용하면 인자를 0개 이상 받는 함수를 정의할 수 있어요. 다음은 두 수를 더하는 함수예요:
(defn add [x y]
(+ x y))
이 함수는 [x y] 벡터에 담긴 인자 2개를 받고, 그 뒤에 여러 표현식을 담을 수 있는 함수의 본문이 와요. 반환값은 항상 본문의 마지막 표현식인 (+ x y)를 평가한 결과예요. 이 표현식은 함수 호출을 나타내는 리스트예요. 리스트의 첫 번째 항목은 + 함수이고, 그다음 항목인 x와 y를 인자로 사용해 평가해요.
위에서 정의한 add 함수도 같은 방식으로 호출해요:
(add 2 3)
;;=> 5
Clojure에서 함수와 값은 정의된 후에야 사용할 수 있어요. 즉, 폼은 항상 나타나는 순서대로 평가돼요.
Clojure에서 공백은 서식 외에는 아무런 의미가 없어요.
Clojure의 함수와 var는 네임스페이스로 구성돼요. 네임스페이스는 관련된 기능을 묶어 주고, ns 매크로로 정의해요:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure는 두 가지 종류의 주석을 지원해요. 한 줄 주석은 ;로 시작하고, comment 폼은 (comment와 ) 사이의 모든 것이 평가되지 않도록 막는 데 사용해요.
이번 연습 문제에서는 좋아하는 요리책에 나오는 근사한 라자냐를 만들 수 있도록 코드를 작성해요.
라자냐를 조리하는 데 걸리는 시간과 관련된 네 가지 과제가 있어요.
expected-time 변수를 정의해서 라자냐를 오븐에 몇 분 동안 넣어 두어야 하는지 확인해요. 요리책에 따르면 예상 오븐 시간은 40분이에요.
expected-time
;;=> 40
remaining-time 함수를 정의해요. 이 함수는 라자냐가 지금까지 오븐에 있던 실제 시간을 분 단위로 인자로 받아서, 앞 과제에서 구한 예상 오븐 시간을 기준으로 라자냐가 오븐에 더 있어야 할 시간이 몇 분인지 반환해요.
(remaining-time 30)
;;=> 10
prep-time 함수를 정의해요. 이 함수는 라자냐에 올린 층 수를 인자로 받아서, 각 층을 준비하는 데 2분이 걸린다고 가정했을 때 라자냐를 준비하는 데 몇 분을 썼는지 반환해요.
(prep-time 2)
;;=> 4
total-time 함수를 정의해요. 이 함수는 두 개의 인자를 받아요. 첫 번째 인자는 라자냐에 올린 층 수이고, 두 번째 인자는 라자냐가 오븐에 있던 시간이 몇 분인지예요. 이 함수는 라자냐를 조리하는 데 총 몇 분을 썼는지, 즉 준비 시간(분)과 현재까지 라자냐가 오븐에서 보낸 시간(분)을 더한 값을 반환해야 해요.
(total-time 3 20)
;;=> 26
Exercism에 가입하고 Clojure 트랙을 개념 12개연습 문제 105개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.