การกำหนดขอบเขตตัวแปรสำหรับมาโครเป็นอย่างไร


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? ถ้าไม่ฉันสนใจโดยเฉพาะในกรณีที่มันไม่ได้


ฉันคิดว่า Jisang Yoo พูดถึงเรื่องนี้อย่างละเอียดในyoo2080.wordpress.com/2013/08/14/…
phils

ฉันไม่รู้แน่ชัด แต่ฉันพนันได้เลยว่าการขยายมาโครสืบทอดความหมายการเชื่อมโยงจากไซต์ส่วนขยายไม่ใช่จากคำจำกัดความของแมโคร ที่เหมาะสมเนื่องจากการขยายตัวถูกแทนที่จริงที่ไซต์การโทร แต่: ทำไมคุณถึงอยากรู้? คุณตั้งใจจะเขียนรหัสที่ใช้รายละเอียดเหล่านี้จริงหรือ!
Lunaryorn

@lunaryorn มาโครไม่ได้ใช้สิ่งนี้อย่างสมบูรณ์ แต่มันอาจสร้างข้อผิดพลาดที่น่าประหลาดใจแก่ผู้ใช้หากไม่เคารพการเชื่อมโยงของไฟล์ที่ใช้มา
Malabarba

@Malabarba เขียนแมโครของคุณในแบบที่ไม่ต้องพึ่งพาการเชื่อมโยงในบัฟเฟอร์เป้าหมายแล้ว หรือดีกว่านั้นอย่าใช้มาโครเลย
Lunaryorn

@ Lunaryorn ฉันไม่ค่อยชัดเจน มาโครเป็นเพียงรูปแบบให้และทำงานตามที่โฆษณาไว้อย่างใดอย่างหนึ่ง ฉันต้องการตรวจสอบให้แน่ใจว่าแบบฟอร์มการอนุญาตนี้เป็นไปตามการกำหนดขอบเขตที่ระบุในไฟล์ที่ถูกขยายคำถามนี้เป็นส่วนหนึ่งของการค้นหาว่าเกิดขึ้นโดยอัตโนมัติหรือหากฉันต้องการรหัสในแมโคร
Malabarba

คำตอบ:


9

ชนิดของการกำหนดขอบเขตที่แอ็คทีฟสำหรับ(let ((some-variable ..)) ...)ในตัวอย่างของคุณคือแอ็คทีฟที่ไซต์ของการเรียกมาโคร (เช่นที่ใช้กับsome-function)

แมโครสามารถทราบว่าจะใช้การกำหนดขอบเขตชนิดใดสำหรับโค้ดที่ส่งคืนโดยการตรวจสอบค่าของlexical-bindingตัวแปร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.