Bagaimana penentuan variabel variabel untuk makro?

11

Ambil contoh makro berikut, didefinisikan dalam macro.el.

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

Dan mengambil fungsi berikut, didefinisikan dalam file yang berbeda , function.el.

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

Kapan function.elbyte-dikompilasi, apakah some-variableakan terikat di bawah lexical atau dynamic binding?

Saya mengerti ini tergantung pada apakah file digunakan -*- lexical-binding: t; -*-, jadi pertanyaan saya secara khusus berkaitan dengan situasi berikut:

  1. Jika function.elmenggunakan pengikatan leksikal, tetapi macro.eltidak.
  2. Jika macro.elmenggunakan pengikatan leksikal, tetapi function.eltidak.

Apakah ada bedanya jika some-vartelah dinyatakan global (dengan defvar) di dalamnya function.el? Jika ya, saya secara khusus tertarik pada kasus di mana tidak .

Malabarba
sumber
Saya pikir Jisang Yoo membahas ini secara rinci di yoo2080.wordpress.com/2013/08/14/…
phils
Saya tidak tahu pasti, tetapi saya berani bertaruh bahwa ekspansi makro mewarisi semantik yang mengikat dari situs ekspansi, bukan dari definisi makro. Itu masuk akal karena ekspansi sebenarnya diganti di situs panggilan. Tetapi: Mengapa Anda ingin tahu? Apakah Anda bermaksud menulis kode yang benar-benar mengandalkan perincian ini ?!
lunaryorn
@Lunaryorn makro tidak sepenuhnya bergantung pada ini, tetapi mungkin menghasilkan bug yang mengejutkan bagi pengguna jika tidak menghormati pengikatan file yang digunakan.
Malabarba
@ Malabarba Tulis makro Anda dengan cara yang tidak bergantung pada pengikatan di buffer target, lalu. Atau bahkan lebih baik, jangan gunakan makro sama sekali.
lunaryorn
@Lunaryorn saya tidak begitu jelas. Makro hanyalah formulir let, dan berfungsi seperti yang diiklankan. Saya hanya ingin memastikan bentuk let ini mengikuti pelingkupan yang ditentukan dalam file itu diperluas. Pertanyaan ini adalah bagian dari mencari tahu apakah itu terjadi secara otomatis atau jika saya perlu kode itu di makro.
Malabarba

Jawaban:

9

Jenis pelingkupan aktif untuk (let ((some-variable ..)) ...)dalam contoh Anda, adalah yang aktif di situs panggilan makro (yaitu yang berlaku untuk some-function).

Makro dapat mengetahui jenis pelingkupan mana yang akan digunakan untuk kode yang dikembalikan dengan memeriksa nilai lexical-bindingvariabel.

Stefan
sumber