기능하지 않은 위치에있는 기호는 변수의 이름으로 취급됩니다. 이어 (function variable)
function
(개구 괄호 후) 함수 위치에 존재하고 variable
아니다. 명시 적으로 인용 된 변수가 해당 값으로 대체되지 않는 한.
작성한다면 (boundp my-variable)
"변수로 my-variable
바인드 된 변수의 값에 저장된 기호"를 의미하고 "변수로 바인드 된 기호가 아닙니다"를 의미합니다 my-variable
.
그렇다면 왜 bound-and-truep
다르게 행동합니까?
이것은 매크로이며 일반적인 (함수) 평가 규칙은 여기에 적용되지 않으며 매크로는 인수의 평가 여부와시기를 자유롭게 결정할 수 있습니다. 실제로 매크로가하는 일은 어떻게 든 인수를 변환하고 결과를 목록으로 반환 한 다음 평가됩니다. 변환 및 최종 평가는 매크로 확장 시간과 평가 시간이라고하는 다른 시간에 발생합니다.
정의는 bound-and-true-p
다음과 같습니다.
(defmacro bound-and-true-p (var)
"Return the value of symbol VAR if it is bound, else nil."
`(and (boundp (quote ,var)) ,var))
이것은 lisp 매크로와 다른 리더 매크로를 사용합니다 (아래에서 더 자세히 설명). 이것을 복잡하게하지 않기 위해 독자 매크로를 사용하지 마십시오.
(defmacro bound-and-true-p (var)
"Return the value of symbol VAR if it is bound, else nil."
(list 'and (list 'boundp (list 'quote var)) var))
당신이 쓰는 경우
(bound-and-true-p my-variable)
처음으로 "번역"됩니다
(and (boundp 'my-variable) my-variable)
그리고 그렇지 않은 nil
경우 또는 그렇지 my-variable
않은 경우 (물론) boundp
값을 반환하여 평가 됩니다 .my-variable
nil
확장이 아닌 것을 알았을 것입니다
(and (boundp (quote my-variable)) my-variable)
우리가 예상했던대로. quote
매크로 나 함수가 아닌 특수한 형식입니다. 매크로와 마찬가지로 특수 형식은 인수로 무엇이든 할 수 있습니다. 이 특별한 특수 형식은 단순히 기호의 변수 값 대신 인수, 여기서 기호를 반환합니다. 이것이 실제로이 특별한 형태의 유일한 목적입니다 : 평가 방지! 매크로는 스스로 그렇게 할 수 없으므로 그렇게해야합니다 quote
.
무슨 일이야 '
? 그것은 인 리더 매크로 위에서 언급 같은 아니다 LISP 매크로 . 매크로는 코드 / 데이터를 변환하는 데 사용되는 반면, 텍스트를 코드 / 데이터로 변환하기 위해 텍스트를 읽을 때 이전에 리더 매크로가 사용됩니다.
'something
짧은 형식입니다
(quote something)
`
bound-and-true-p
또한 실제 정의에 사용되는 것은 리더 매크로입니다. 같이이 기호를 인용하는 경우 `symbol
는 동일합니다 'symbol
,하지만 같이 목록을 인용하는 데 사용되는 경우 `(foo bar ,baz)
가로 시작되는 형태로 다르게 작동 ,
평가된다.
`(constant ,variable)
에 해당
(list (quote constant) variable))
인용되지 않은 기호가 때때로 평가되고 (값으로 대체 됨) 때로는 그렇지 않은 이유에 대한 질문에 답해야합니다. 매크로는 quote
심볼 평가를 막기 위해 사용할 수 있습니다 .
그러나 왜 bound-and-true-p
매크로 boundp
가 아닌가? 런타임까지 알려지지 않은 임의의 심볼이 심볼로 묶여 있는지 확인할 수 있어야합니다. boundp
인수가 자동으로 인용 되면 불가능합니다 .
bound-and-true-p
알려진 변수가 정의되어 있는지 확인하고 해당 변수를 사용하는 경우 해당 값을 사용합니다. 라이브러리가 다음과 같이 타사 라이브러리에 대한 선택적 종속성 이있는 경우 유용합니다 .
(defun foo-get-value ()
(or (bound-and-true-p bar-value)
;; we have to calculate the value ourselves
(our own inefficient or otherwise undesirable variant)))
bound-and-true-p
함수로 정의 할 수 있고 인수를 인용해야하지만 매크로에 대해 관심있는 변수를 미리 알고있는 경우를 위해을 입력하지 않아도됩니다 '
.
setq
의미set quoted
, 원래로 확장하는 매크로이었다(set 'some-variable "less")
. 일반적으로 Elisp는 인용 된 인수와 인용되지 않은 인수에 대해 일관되게 일치하지 않지만 값 대신 변수와 상호 작용 해야하는 함수 (매크로가 아닌)는 인용 된 인수를 취합니다 (setq
주요 예외).