関数をグローバルに定義するとします。
(defun x (y) (1+ y)) ;; Edit: my first example was too complicated
関数xを次のようなリストに「強制」することは可能ですか?
(x (y) (1+ y))
前もって感謝します!
PS-@Danleiの例はClozureCLで特別なフラグを使用して機能しますが、FUNCTION-LAMBDA-EXPRESSIONをSBCLで機能させる方法を知っている人はいますか?
関数をグローバルに定義するとします。
(defun x (y) (1+ y)) ;; Edit: my first example was too complicated
関数xを次のようなリストに「強制」することは可能ですか?
(x (y) (1+ y))
前もって感謝します!
PS-@Danleiの例はClozureCLで特別なフラグを使用して機能しますが、FUNCTION-LAMBDA-EXPRESSIONをSBCLで機能させる方法を知っている人はいますか?
FUNCTION-LAMBDA-EXPRESSIONを試すことができます:
(function-lambda-expression #'foo)
ただし、動作が保証されているわけではありません(「…実装は、すべての場合に「nil、true、nil」を自由に返すことができます…」)。
たとえば、CCLでは次のようになります。
CL-USER> (setq ccl:*save-definitions* t)
T
CL-USER> (defun x (x y) (+ x y))
X
CL-USER> (function-lambda-expression #'x)
(LAMBDA (X Y) (DECLARE (CCL::GLOBAL-FUNCTION-NAME X)) (BLOCK X (+ X Y)))
NIL
X
SBCLでは、(setq sb-ext:*evaluator-mode* :interpret)
(テストされていない)試してみることができます。SBCLでこれを実現する方法は他にもあるかもしれませんが(類似の設定を探す*save-definitions*
か、別の設定を試すこともできOPTIMIZE
ます)、私はそれらについて知りません。REPLに入力された関数は、に設定*evaluator-mode*
した後はコンパイルされない:interpret
ため、パフォーマンスが低下する可能性があることに注意してください。
Common Lispでは、(HyperSpecを参照)または一部の実装を使用して関数の定義を回復できる場合があります。function-lambda-expression
uncompile-function
重要な関数操作を行うためにプロジェクトに時間を費やしていたとき、この種のことを行うのが最も簡単でした。
(defclass node ()
(list-form
compiled-obj))
最初に'(lambda foo(x)bar)で構成されるリスト形式が割り当てられ、次にFooをコンパイルしてcompiled-ojbスロットに割り当てます。