Common Lisp에서 전역 함수를 정의할 때는 defun 표현식을 사용해요.
이 표현식은 첫 번째 인자로 매개변수 목록을 받아요. 빈 목록이면 함수에 매개변수가 없다는 뜻이에요.
그다음에는 선택적인 문서 문자열(아래를 참고하세요)이 오고, 이어서 함수의 "본문"을 이루는 0개 이상의 표현식이 와요.
함수는 매개변수를 0개 이상 가질 수 있어요.
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
함수를 호출할 때는 함수를 가리키는 심볼을 표현식의 첫 번째 요소로 두고, 함수에 전달할 인자(있다면)를 표현식의 나머지 요소로 두어 표현식을 평가해요.
함수가 평가되어 나오는 값은 함수 본문에서 마지막으로 평가된 표현식의 값이에요. 모든 함수는 어떤 값으로 평가돼요.
(add-nums 2 2) ;; => 4
함수는 선택적으로 문서 문자열('독스트링'이라고도 해요)을 가질 수도 있어요.
문서 문자열을 제공한다면 인자 목록 뒤, 함수 본문 앞에 와요.
문서 문자열은 documentation으로 접근할 수 있어요.
(defun add-nums (x y) "Add X and Y together" (+ x y))
(documentation 'add-nums 'function) ;; => "Add X and Y together"
;; Note that if one provides a docstring but fails to provide a body
;; then the docstring is interpreted by Common Lisp as the body, not
;; the docstring
(defun no-body ())
(no-body) ;; => NIL
(defun mistake () "This is not a docstring")
(mistake) ;; => "This is not a docstring"
(documentation 'mistake 'function) ;; => NIL
Lisp 외계인 Lilly가 돌아왔어요. 이번에는 요리를 더 많이 하려고 해요! 이번에 만들 요리는 Lisp 외계인 라자냐인데, 인간이 먹는 라자냐와 아주 다르지는 않아요.
Lilly는 라자냐 조리 시간을 맞추는 데 도움이 될 함수 몇 개를 만들어야 해요. 그리고 각 함수가 무엇을 하는지 Lilly가 잊지 않도록, 함수마다 설명도 잘 달아 두어야 해요.
Lilly가 라자냐 조리 시간을 맞출 수 있도록 함수를 작성하는 걸 도와줄래요?
매개변수를 받지 않고, 라자냐를 오븐에 몇 분 동안 넣어 두어야 하는지 반환하는 expected-time-in-oven 함수를 정의해요. Lisp 외계인의 전통에 따르면(Lilly의 부모님이 요리하시던 것과 똑같이), 오븐에서의 예상 조리 시간은 337분이에요:
(expected-time-in-oven) ;; => 337
라자냐가 오븐에 들어가 있던 실제 시간(분)을 매개변수로 받아서, 이전 단계에서 구한 오븐 예상 시간을 기준으로 라자냐가 오븐에 몇 분 더 있어야 하는지 반환하는 remaining-minutes-in-oven 함수를 정의해요.
(remaining-minutes-in-oven 100) ;; => 237
Lilly가 라자냐에 넣은 층 수를 매개변수로 받아서, 각 층을 준비하는 데 19분이 걸린다고 가정했을 때 Lilly가 라자냐를 준비하는 데 몇 분을 썼는지 반환하는 preparation-time-in-minutes 함수를 정의해요.
(preparation-time-in-minutes 3) ;; => 57
매개변수 두 개를 받는 elapsed-time-in-minutes 함수를 정의해요. 첫 번째 매개변수는 Lilly가 라자냐에 넣은 층 수이고, 두 번째 매개변수는 라자냐가 오븐에 들어가 있던 시간(분)이에요. 이 함수는 Lilly가 라자냐 요리에 쓴 시간(분)을 반환해야 하는데, 이는 준비 시간(분)과 현재까지 라자냐가 오븐에 있던 시간(분)을 더한 값이에요.
(elapsed-time-in-minutes 3 100) ;; => 157
Exercism에 가입하고 Common Lisp 트랙을 개념 27개연습 문제 92개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.