Was ich mit einem "transparenten 'Pass-Through'-Funktions-Wrapper" meine, ist eine Funktion, nennen wir sie wrapper
, die das Ergebnis aus der Übergabe aller Argumente an eine andere Funktion zurückgibt, nennen wir sie wrappee
.
Wie geht das in Emacs Lisp?
NB: Die ideale wrapper
Funktion ist unabhängig von der wrappee
Signatur der Funktion. dh es weiß nichts über die Anzahl, Positionen, Namen usw. der wrappee
Argumente; es gibt einfach alle seine Argumente an weiter wrappee
, als wäre wrappee
es das ursprünglich genannte gewesen. (Es ist jedoch nicht erforderlich, sich mit dem Aufrufstapel herumzuschlagen, um den Aufruf von wrapper
durch einen Aufruf von zu ersetzen wrappee
.)
Ich habe eine teilweise Antwort auf meine Frage gepostet :
(defun wrapper (&rest args) (apply 'wrappee args))
Dies funktioniert nur, wenn wrappee
es nicht interaktiv ist. Anscheinend stellt die Art und Weise, wie interaktive Funktionen ihre Argumente erhalten, einen anderen "Kanal" dar als die (&rest args)
Beschwörung. Was ich daher noch brauche, ist ein ebenso wrappee
-agnostisches Gegenstück zur (&rest args)
Signatur für den Fall, dass wrappee
es sich um eine interaktive Funktion handelt.
(Diese Frage wurde durch ein in dieser früheren Frage beschriebenes Problem motiviert .)
Für den Fall, dass weitere Erläuterungen zu dem, wonach ich frage, erforderlich sind, finden Sie nachfolgend einige Beispiele, die die Python- und JavaScript-Entsprechungen dessen zeigen, wonach ich suche.
In Python werden im Folgenden einige Standardmethoden zum Implementieren eines solchen Wrappers gezeigt:
def wrapper(*args, **kwargs):
return wrappee(*args, **kwargs)
# or
wrapper = lambda *args, **kwargs: wrappee(*args, **kwargs)
(Hier *args
steht für "alle Positionsargumente" und **kwargs
für "alle Schlüsselwortargumente".)
Das JavaScript-Äquivalent wäre ungefähr so:
function wrapper () { return wrappee.apply(this, arguments); }
// or
wrapper = function () { return wrappee.apply(this, arguments); }
Ich bin nicht der Meinung, dass diese Frage ein Duplikat von Wie man Mapcar auf eine Funktion mit mehreren Argumenten anwendet . Ich kann nicht erklären, warum, da die beiden Fragen für mich so offensichtlich unterschiedlich aussehen. Es ist, als würde man gefragt, "warum ein Apfel nicht als gleichwertig mit einer Orange angesehen werden sollte". Die bloße Frage ist so verrückt, dass man bezweifelt, jemals eine Antwort finden zu können, die die fragende Person zufriedenstellt.
advice
Zeug problematisch genug, dass ich mich lieber davon fernhalten möchte. Tatsächlich bestand die Motivation für diese Frage darin, eine Lösung für ein ansonsten unlösbares Problem zu finden, das ich mit einer empfohlenen Funktion habe ...
interactive
Spezifikation angeben.