"Şeffaf" düz geçişli "işlev sarmalayıcı" ile kastettiğim, bir işlevdir, diyelim wrapper
ki, 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 wrapper
işlev, işlevin imzası hakkında agnostiktirwrappee
; yani wrappee
argümanlarının sayısı, pozisyonları, isimleri vb. hakkında hiçbir şey bilmiyor ; tüm argümanlarını wrappee
tıpkı wrappee
başlangıçta çağrılmış gibi geçirir . (Ancak, çağrıyı yerine wrapper
bir ç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 wrappee
olduğ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 wrappee
derecede 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.
advice
onlardan 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 .