DEFCONSTANT — 상수 정의하기
DEFCONSTANT — 상수 정의하기 (매크로)
전역 상수를 정의하는 매크로예요. defconstant로 이름을 정하고 값을 주면, 프로그램 어디에서나 그 값을 바꾸지 않고 그대로 쓸 수 있는 상수가 생겨요. 값이 절대 변하지 않는다고 컴파일러에 약속하는 셈이라, 코드가 더 안전하고 이해하기도 좋아져요.
시그니처 (Syntax)
defconstant name initial-value [documentation] => name
name—symbol. 평가되지 않아요.initial-value—form. 평가돼요.documentation—string. 평가되지 않아요.
본문 (Description)
defconstant는 name이 가리키는 전역 변수에 initial-value를 평가한 결과값을 부여해요.
defconstant로 정의한 상수는 다시 defconstant로 재정의할 수 있어요. 다만 다른 연산자로 그 symbol에 값을 할당하려 하거나, 이후의 defconstant로 다른 값을 주려고 하면 결과는 정의되지 않아요(undefined).
documentation이 주어지면 name에 variable 종류의 documentation string으로 붙어요.
defconstant는 보통 top level form으로 나타나지만, non-top-level form으로 나타나도 의미는 있어요. 다만 아래에 설명하는 컴파일 타임 부수효과는 defconstant가 top level form으로 나타날 때만 일어나요.
defconstant가 실행되는 시점에 name이 가리키는 변수의 binding이 있거나, 값이 initial-value의 값과 eql이 아니면 결과는 정의되지 않아요.
상수 symbol을 lexcial 변수나 dynamic 변수로 rebind하는 것도 결과가 정의되지 않아요. 다시 말해 defconstant로 선언한 symbol을 참조하면 항상 그 전역 값을 가리켜요.
defconstant 실행의 부수효과는 최소한 다음 코드의 부수효과와 동등해야 해요:
(setf (symbol-value 'name) initial-value)
(setf (documentation 'name 'variable) 'documentation)
defconstant form이 top level form으로 나타나면 compiler는 name이 constant variable을 가리킨다는 것을 반드시 알아야 해요. 구현은 값-form을 컴파일 시점·로드 시점·둘 다 중 아무 때나 평가할 수 있어요. 따라서 사용자는 initial-value가 컴파일 시점에 evaluate될 수 있고(파일에 name에 대한 참조가 있든 없든), 항상 같은 값으로 evaluate되도록 보장해야 해요.
예제 (Examples)
(defconstant this-is-a-constant 'never-changing "for a test") => THIS-IS-A-CONSTANT
this-is-a-constant => NEVER-CHANGING
(documentation 'this-is-a-constant 'variable) => "for a test"
(constantp 'this-is-a-constant) => true
더 알아보기 (See Also)
declaim, defparameter, defvar, documentation, proclaim, Section 3.1.2.1.1.3 (Constant Variables), Section 3.2 (Compilation)
Notes
없음.