Dosya derlendiğinde makrolar genişletiliyor mu?


13

Kullanım derleme zamanı her örneğinde genişletilmesi gereken bir makro var. Ben kod üssü geçmeden ve dikkatle her çağrı ile sarma olmadan böyle belirtmek için bir yolu var mı eval-when-compile?

Yanıtlar:


13

Bayt derleyici tarafından erişilebilen tüm makrolar derleme sırasında genişletilir. "Ulaşılabilir" temelde alıntı yapılmaması anlamına gelir.

Bunları içeren kaynak dosya bayt derlendiğinde defun, defmacros, s, s gövdesinin lambdatümü bayt olarak derlenir. Evet, içerisindeki herhangi bir makro, bir teklifin içinde olmadığı sürece genişletilecektir ( '). Bir çok ortak hata sarma etmektir lambdaolduğunu sen neden var, aslında, s bir alıntı ve sizin alıntı asla lambdas .

Bu, makroların büyük avantajlarından biridir, iyi yazılmış oldukları sürece, çalışma zamanı performansı üzerinde hiçbir etkisi yoktur. Diğer avantaj, elbette güçleri ve çok yönlülüğüdür. Dezavantajı, sözdizimini nesneler değil, manipüle etmenizdir, bu nedenle bazıları beklenmedik, bazıları kaçınılmaz olan problemler için çok fazla alan vardır.


7

Malabarba'nın daha önce açıkladığı gibi, bayt derlemesi sırasında makrolar genişletilir. Bir dosya derlenmezse, dosya yüklendiğinde makrolar genişletilir (istekli makro genişletmesi).

Yine de buna güvenmeyin. Çok kötü bir tarz. Genelde makronuzu kullanan kodun gerçekten derlenmesini bekleyemezsiniz ve genellikle derleme sırasında mümkün olduğunca az kod çalıştırmalısınız . Özellikle, makroları nadiren ve sadece başka bir yol yoksa kullanın . Genel bir kural olarak, makroları yalnızca sözdizimi için kullanın , asla anlambilim (veya işlevsellik) için kullanmayın.

Makrolar sızdıran bir soyutlamadır. Genişletmeleri derleme zamanında hedef koda sabit olarak kodlanır ve geriye dönük olarak değiştirilemez. Hedef kod sonradan bağlıdır üzerinde özel uygulama genişletme zamanda makro. Özellikle, makro gövdesinde kullanılan tüm dahili API'lere bağlıdır .

Sonuç olarak, bu API'dan herhangi birini veya makronuzla derlenmiş herhangi bir kodu bozmadan makro genişletmenin dayandığı hiçbir şeyi değiştiremezsiniz.

Makroların işlevsellik için liberal kullanımı bağımlılık cehennemine giden yolu açar .


Makro yazarken veya kullanırken çok iyi noktalar.
Sean Allred

"İşlevsellik için makroların liberal kullanımı bağımlılık cehennemine giden yolu açar." Bir hafta öncesine kadar package.el, tamamen meşru makro bağımlılık durumlarında paket kurulumunu tamamen bozan bir hataya sahipti.
Malabarba

@Malabarba Detay vermek ister misiniz?
lunaryorn

@lunaryorn İşte . Kötü küçük sorun.
Malabarba

1
@lunaryorn Makroların tehlikeli olduğunu kabul ediyorum. Bu böceğin hiç makro içermeyen başka (daha az rahatsız edici) tezahürleri vardı. Ayrıca işlev bağımlılıklarıyla ilgili sorunlara da neden oldu.
Malabarba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.