"Şeffaf" düz geçişli "işlev sarmalayıcı" ile kastettiğim, bir işlevdir, diyelim wrapperki, tüm argümanını başka bir işleve geçirmekten sonuç döndürür, diyelim wrappee.
Emacs Lisp'de bu nasıl yapılır?
Dikkat: İdeal wrapperişlev, işlevin imzası hakkında agnostiktirwrappee ; yani wrappeeargümanlarının sayısı, pozisyonları, isimleri vb. hakkında hiçbir şey bilmiyor ; tüm argümanlarını wrappeetıpkı wrappeebaşlangıçta çağrılmış gibi geçirir . (Ancak, çağrıyı yerine wrapperbir çağrıyla değiştirmek için çağrı yığınıyla uğraşmanıza gerek yoktur wrappee.)
Soruma kısmi bir cevap gönderdim :
(defun wrapper (&rest args) (apply 'wrappee args))
Bu sadece çalışır wrappeeolduğunu değil interaktif. Görünüşe göre, etkileşimli işlevlerin argümanlarını alma şekli, (&rest args)büyünün kapsadığı şeyden farklı bir "kanalı" temsil eder . Bu yüzden hala ihtiyacım olan şey, etkileşimli bir işlevin olduğu durumun imzasının eşit wrappeederecede agnostik bir karşılığıdır .(&rest args)wrappee
(Bu soru, bu önceki soruda açıklanan bir sorunla motive edildi .)
İstediğim şeyin daha fazla açıklanması gerekirse, aşağıda Python ve JavaScript eşdeğerlerini gösteren birkaç örnek verilmiştir.
Python'da böyle bir ambalajı uygulamak için birkaç standart yol aşağıda gösterilmiştir:
def wrapper(*args, **kwargs):
return wrappee(*args, **kwargs)
# or
wrapper = lambda *args, **kwargs: wrappee(*args, **kwargs)
(Burada *args"tüm konumsal bağımsız değişkenler", **kwargs"tüm anahtar kelime bağımsız değişkenleri" anlamına gelir.)
JavaScript eşdeğeri şuna benzer:
function wrapper () { return wrappee.apply(this, arguments); }
// or
wrapper = function () { return wrappee.apply(this, arguments); }
Kayıt için, bu sorunun Mapcar'ı birden çok argümanı olan bir işleve nasıl uygulayacağının bir kopyası olduğunu kabul etmiyorum . Nedenini açıklamakta zorlanıyorum, çünkü iki soru benim için çok farklı görünüyor. "Bir elmanın neden bir portakal ile eşdeğer sayılmaması gerektiğini açıklamak" gibi bir soru soruluyor. Sadece o kadar çılgınca bir soru ki, kişinin soran kişiyi tatmin edecek bir cevap bulabileceğinden şüphe ediyor.
adviceonlardan uzak durmayı tercih edeceğim kadar sorunlu buluyorum . Aslında, bu sorunun motivasyonu tavsiye edilen bir işlevle karşılaştığım başka türlü zor bir soruna bir çözüm bulmaya çalışıyordu ...
interactiveşartname sağlamanız gerekiyor .