* 함수 정의하는 형태
* 파라미터 리스트 : 함수에 전달되는 인자를 받을 변수를 정의한다.
- 필수 파라미터 : 변수 이름의 리스트
- 옵션 파라미터
옵션 파라미터에 디폴트 값을 넣고 싶다면 다음과 같이 사용한다.
만약 주어진 옵션 파라미터에 값이 등록되었는지를 알고 싶다면 "-supplied-p" 변수를 이용할 수 있다. 해당하는 변수가 등록되었다면 T, 그렇지 않다면 NIL 이다.
- Keyword 파라미터 : 어떤 인수가 어떤 변수로 매핑될지 일일이 정하고 싶다면 사용한다. 또한 &optional 에서 처럼 기본값과 등록되었는지 확인하는 변수 모두 사용이 가능하다.
* Return 값 강제하기
- RETURN-FROM, BLOCK
BLOCK으로 해당 블록의 이름을 정한 후 RETURN-FROM을 이용해 해당 블록에서 탈출한다. 기본적으로 함수정의안에서는 함수 이름자체가 하나의 블록으로 취급된다.
- LAMBDA, FUNCALL, APPLY
일반적으로 함수를 사용한다는 것은 다음과 같다.
apply는 funcall과 유사하지만 개별 인자들을 일일이 가져오는 형식이 아니고, 리스트 자체를 받아오는 경우에 사용한다.
lambda는 이름없는 함수를 만들 수 있다.

<blockquote>(defun name (parameters)
"Optional document string"
bodyform)
</blockquote>
* 파라미터 리스트 : 함수에 전달되는 인자를 받을 변수를 정의한다.
- 필수 파라미터 : 변수 이름의 리스트
- 옵션 파라미터
<blockquote>(defun foo (a b &optional c) ... )<br /></blockquote>
- a, b 두 인자는 필수 파라미터이다. 따라서 먼저 두 변수에 값이 할당된다.
- 이후에도 남은 값이 있다면 그때 c에 할당된다.
옵션 파라미터에 디폴트 값을 넣고 싶다면 다음과 같이 사용한다.
<blockquote>(defun foo (a b &optional (c 10)) ... )</blockquote>
만약 주어진 옵션 파라미터에 값이 등록되었는지를 알고 싶다면 "-supplied-p" 변수를 이용할 수 있다. 해당하는 변수가 등록되었다면 T, 그렇지 않다면 NIL 이다.
<blockquote>(defun foo (a b &optional (c 0 c-supplied-p)) <br /> (list a b c c-supplied-p))</blockquote>- Rest 파라미터 : 여러 개의 인수를 받고자할 때 사용한다.
<blockquote>(defun foo (a b &rest c) ... )</blockquote>
- Keyword 파라미터 : 어떤 인수가 어떤 변수로 매핑될지 일일이 정하고 싶다면 사용한다. 또한 &optional 에서 처럼 기본값과 등록되었는지 확인하는 변수 모두 사용이 가능하다.
<blockquote>(defun foo (&keyword a b (c 0) (d 0 d-supplied-p)) (list a b c d d-supplied-p)) </blockquote>해당하는 값을 등록하고 싶다면 :a :b 식으로 :을 변수명 앞에 붙여 값을 가져올 수 있다.
* Return 값 강제하기
- RETURN-FROM, BLOCK
BLOCK으로 해당 블록의 이름을 정한 후 RETURN-FROM을 이용해 해당 블록에서 탈출한다. 기본적으로 함수정의안에서는 함수 이름자체가 하나의 블록으로 취급된다.
<blockquote>(defun foo (n)<br /> (dotimes (i 10)<br /> (dotimes (j 10)<br /> (when (> (* i j) n)<br /> (return-from foo (list i j))))))</blockquote>* 고차 함수 (Higher-order function)
- LAMBDA, FUNCALL, APPLY
일반적으로 함수를 사용한다는 것은 다음과 같다.
<blockquote>(foo 1 2 3) == (funcall #'foo 1 2 3) </blockquote>이때 #'는 해당하는 함수를 찾아오는 함수이다. 일종의 함수 포인터 연산이라고 생각해도 되겠다. (Scheme과는 달리 LISP은 변수공간과 함수 공간이 구분되어있다.)
apply는 funcall과 유사하지만 개별 인자들을 일일이 가져오는 형식이 아니고, 리스트 자체를 받아오는 경우에 사용한다.
lambda는 이름없는 함수를 만들 수 있다.
<blockquote>(funcall #'(lambda (x y) (+ x y)) 3 5) ==> 8</blockquote>

댓글 없음:
댓글 쓰기