Làm thế nào là phạm vi biến cho các macro được xác định?


11

Lấy macro ví dụ sau, được định nghĩa trong macro.el.

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

Và mất chức năng sau đây, được định nghĩa trong một tập tin khác nhau , function.el.

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

Khi function.elđược biên dịch byte, sẽ some-variablebị ràng buộc theo ràng buộc từ vựng hoặc động?

Tôi hiểu điều này phụ thuộc vào việc tệp có sử dụng hay không -*- lexical-binding: t; -*-, vì vậy câu hỏi của tôi liên quan cụ thể đến các tình huống sau:

  1. Nếu function.elsử dụng ràng buộc từ vựng, nhưng macro.elkhông.
  2. Nếu macro.elsử dụng ràng buộc từ vựng, nhưng function.elkhông.

Liệu nó có làm nên sự khác biệt nếu some-varđã được tuyên bố toàn cầu (với một defvar) bên trong function.elkhông? Nếu có, tôi đặc biệt quan tâm đến trường hợp không có .


Tôi nghĩ Jisang Yoo phủ này ở một số chi tiết tại yoo2080.wordpress.com/2013/08/14/...
Phils

Tôi không biết chắc chắn, nhưng tôi cá rằng việc mở rộng macro kế thừa ngữ nghĩa ràng buộc từ trang mở rộng, chứ không phải từ định nghĩa vĩ mô. Điều đó có ý nghĩa vì việc mở rộng thực sự được thay thế tại trang web cuộc gọi. Nhưng: Tại sao bạn muốn biết? Bạn có định viết mã thực sự dựa vào những chi tiết này không?!
lunaryorn

@lunaryorn macro không hoàn toàn dựa vào điều này, nhưng nó có thể tạo ra các lỗi đáng ngạc nhiên cho người dùng nếu nó không tôn trọng sự ràng buộc của tệp mà nó được sử dụng.
Malabarba

@Malabarba Viết macro của bạn theo cách không phụ thuộc vào liên kết trong bộ đệm đích. Hoặc thậm chí tốt hơn, không sử dụng một macro nào cả.
lunaryorn

@lunaryorn Tôi không rõ lắm. Macro chỉ là một hình thức cho phép và nó hoạt động như được quảng cáo theo một trong hai cách. Tôi chỉ muốn đảm bảo rằng biểu mẫu này cho phép theo phạm vi được chỉ định trong tệp mà nó được mở rộng. Câu hỏi này là một phần của việc tìm hiểu xem điều đó có tự động xảy ra hay không nếu tôi cần mã hóa trong macro.
Malabarba

Câu trả lời:


9

Loại phạm vi hoạt động cho (let ((some-variable ..)) ...)ví dụ của bạn, là loại hoạt động tại trang web của lệnh gọi macro (nghĩa là phạm vi áp dụng cho some-function).

Một macro có thể biết loại phạm vi nào sẽ được sử dụng cho mã mà nó trả về bằng cách kiểm tra giá trị của lexical-bindingbiến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.