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
?
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:
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
, defmacro
s, s, s gövdesinin lambda
tü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 lambda
olduğunu sen neden var, aslında, s bir alıntı ve sizin alıntı asla lambda
s .
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.
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 .