「透過的な「パススルー」関数ラッパー」とは、wrapper
すべての引数を他の関数に渡した結果を返す関数のことwrappee
です。
Emacs Lispではこれはどのように行われますか?
NB:理想的なwrapper
機能があるとらわれない程度wrappee
関数のシグネチャ。つまり、wrappee
の引数の数、位置、名前などは何も知りません。最初に呼び出されたwrappee
かのように、すべての引数をに渡しますwrappee
。(必要がへの呼び出しを置き換えるためにコールスタックを台無しに、しかし、ありませんwrapper
への呼び出しでwrappee
。)
私は私の質問に部分的な回答を投稿しました:
(defun wrapper (&rest args) (apply 'wrappee args))
これは、wrappee
がインタラクティブでない場合にのみ機能します。どうやら、インタラクティブ関数が引数を取得する方法は、(&rest args)
呪文の対象とは異なる「チャネル」を表します。したがって、私がまだ必要としているのは、が対話型の関数である場合のwrappee
、(&rest args)
署名に等しく不可知論的な対応物です。wrappee
(この質問は、この前の質問で説明されている問題によって動機付けられました。)
私が求めていることをさらに明確にする必要がある場合のために、以下にいくつかの例を示し、PythonとJavaScriptで同等のものを示します。
Pythonでは、このようなラッパーを実装するいくつかの標準的な方法を以下に示します。
def wrapper(*args, **kwargs):
return wrappee(*args, **kwargs)
# or
wrapper = lambda *args, **kwargs: wrappee(*args, **kwargs)
(ここで*args
は「すべての位置引数」を**kwargs
表し、「すべてのキーワード引数」を表します。)
同等のJavaScriptは次のようになります。
function wrapper () { return wrappee.apply(this, arguments); }
// or
wrapper = function () { return wrappee.apply(this, arguments); }
記録のために、私はこの質問が複数の引数を持つ関数にmapcarを適用する方法の複製であることには同意しません。2つの質問が私には明らかに異なって見えるので、私はその理由を説明するのに途方に暮れています。「リンゴがオレンジと同等と見なされるべきではない理由を説明してください」という質問のようなものです。ただの質問は非常にクレイジーであり、質問する人を満足させる答えを思い付くことができるかどうか疑わしいものです。
advice
はかなり問題があるので、それを避けたいと思います。実際、この質問の動機は、助言された関数で私が持っている他の方法では扱いにくい問題の解決策を見つけようとすることでした...
interactive
スペックを提供する必要があります。