5

関数をグローバルに定義するとします。

(defun x (y) (1+ y)) ;; Edit: my first example was too complicated

関数xを次のようなリストに「強制」することは可能ですか?

(x (y) (1+ y))

前もって感謝します!

PS-@Danleiの例はClozureCLで特別なフラグを使用して機能しますが、FUNCTION-LAMBDA-EXPRESSIONをSBCLで機能させる方法を知っている人はいますか?

4

3 に答える 3

8

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ため、パフォーマンスが低下する可能性があることに注意してください。

于 2011-04-30T21:49:55.203 に答える
2

Common Lispでは、(HyperSpecを参照)または一部の実装を使用して関数の定義を回復できる場合があります。function-lambda-expressionuncompile-function

于 2011-04-30T21:49:29.427 に答える
0

重要な関数操作を行うためにプロジェクトに時間を費やしていたとき、この種のことを行うのが最も簡単でした。

(defclass node ()
  (list-form
   compiled-obj))

最初に'(lambda foo(x)bar)で構成されるリスト形式が割り当てられ、次にFooをコンパイルしてcompiled-ojbスロットに割り当てます。

于 2011-05-03T00:31:48.833 に答える