FUNCTION 특수 연산자
FUNCTION 특수 연산자 (function)
function은 Common Lisp의 특수 연산자로, 이름이나 람다 표현식을 받아 **함수 객체(function object)**를 돌려줘요. 함수를 값으로 다루고 싶을 때 쓰는 핵심 수단이에요. 축약 표기인 #'name으로 자주 쓰이죠.
문법 (Syntax)
function name => function
인자와 값 (Arguments and Values)
name— 함수 이름(function name) 또는 람다 표현식이에요.function— 함수 객체예요.
설명 (Description)
function의 값은 현재 어휘 환경에서 name의 **함수 값(functional value)**이에요.
name이 함수 이름이면, 그 이름의 함수적 정의는 가장 안쪽의 어휘적으로 둘러싸는 flet, labels, macrolet 폼이 세운 것(있을 경우)이에요. 그렇지 않으면 함수 이름의 전역 함수적 정의가 반환돼요.
name이 람다 표현식이면 **어휘 클로저(lexical closure)**가 반환돼요. 같은 바인딩 집합을 닫는 클로저가 두 번 이상 만들어질 수 있는 상황이라면, 그 결과 클로저들은 eq일 수도 있고 아닐 수도 있어요.
function을, 함수가 나타나는 어휘 환경에서 함수를 가리키지 않는 함수 이름에 쓰는 것은 오류예요. 구체적으로, 매크로나 특수 폼을 가리키는 기호에 function을 쓰는 것은 오류예요. 구현체는 성능상 이 오류를 신호하지 않기로 선택할 수 있지만, 오류를 신호하지 않는 것을 유용한 동작으로 정의하는 것은 금지돼요.
예제 (Examples)
(defun adder (x) (function (lambda (y) (+ x y))))
(adder 3)의 결과는 인수에 3을 더하는 함수예요.
(setq add3 (adder 3))
(funcall add3 5) => 8
이것이 동작하는 이유는 function이 람다 표현식의 클로저를 만들어, 함수 adder에서 제어가 돌아온 뒤에도 변수 x의 값 3을 참조할 수 있게 하기 때문이에요.
부수 효과 (Side Effects)
없음.
영향 (Affected By)
없음.
예외 상황 (Exceptional Situations)
없음.
함께 보기 (See Also)
defun,fdefinition,flet,labels,symbol-function- Section 3.1.2.1.1 (Symbols as Forms)
- Section 2.4.8.2 (Sharpsign Single-Quote)
- Section 22.1.3.13 (Printing Other Objects)
참고 (Notes)
#'name 표기법은 (function name)의 축약으로 쓰일 수 있어요.