매크로의 변수 범위는 어떻게 결정됩니까?


11

에 정의 된 다음 예제 매크로를 사용하십시오 macro.el.

(defmacro some-macro (&rest body)
  `(let ((some-variable 1))
     ,@body))

그리고 다음과 같은 기능을 가지고 다른 파일에 정의를 , function.el.

(defun some-function ()
  (some-macro (do-something)))

경우 function.el바이트가 컴파일되어 것이다 some-variable어휘 또는 동적 바인딩 하에서 구속?

파일 사용 여부에 따라 달라 -*- lexical-binding: t; -*-지므로 내 질문은 특히 다음 상황과 관련이 있습니다.

  1. 경우 function.el바인딩 만 사용하는 어휘 macro.el하지 않습니다.
  2. 경우 macro.el바인딩 만 사용하는 어휘 function.el하지 않습니다.

some-var내부 (defvar 포함)로 선언 된 경우 차이 가 function.el있습니까? 그렇다면, 그렇지 않은 경우에 특히 관심 있습니다.



확실하지는 않지만 매크로 확장은 매크로 정의가 아닌 확장 사이트에서 바인딩 의미를 상속한다고 확신합니다. 확장은 실제로 호출 사이트에서 대체되므로 의미가 있습니다. 그러나 : 왜 알고 싶습니까? 실제로 이러한 세부 사항에 의존 하는 코드를 작성 하시겠습니까 ?!
lunaryorn

@lunaryorn 매크로 는 이것에 전적으로 의존하지는 않지만, 사용 된 파일의 바인딩을 존중하지 않으면 사용자에게 놀라운 버그를 생성 할 수 있습니다.
Malabarba

@Malabarba 타겟 버퍼의 바인딩에 의존하지 않는 방식으로 매크로를 작성하십시오. 또는 매크로를 전혀 사용하지 마십시오.
lunaryorn

@lunaryorn 명확하지 않았습니다. 매크로는 let 형식 일 뿐이며 어느 쪽이든 광고 된대로 작동합니다. 이 let 형식이 확장 된 파일에 지정된 범위를 따르는 지 확인하고 싶습니다.이 질문은 자동으로 발생하는지 또는 매크로에서 코드를 작성해야하는지 여부의 일부입니다.
Malabarba

답변:


9

(let ((some-variable ..)) ...)귀하의 예에서 활성화 된 범위 지정 유형은 매크로 호출 사이트에서 활성화 된 범위입니다 (예 :에 적용되는 범위 some-function).

매크로는 lexical-binding변수 값을 확인하여 반환되는 코드에 어떤 종류의 범위 지정이 사용 될지 알 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.