4

一般的な Lisp では、次のように書けることに気付きました。

(defun foo (&key (a 1) (b 2) (c (+ a b))) (print (+ a b c)))

そして、私が呼び出すと(foo)6が印刷されます。したがって、引数はおよびcに設定された値を参照できます。しかし、 で同様のことを行う方法が見つからないようです。何かのようなもの:abdefstruct

CL-USER> (defstruct thing a b c)
THING
CL-USER> (setq q (make-thing :a 1 :b 2 :c (+ a b)))
; Evaluation aborted
CL-USER> (setq q (make-thing :a 1 :b 2 :c (+ :a :b)))
; Evaluation aborted

これを行う方法はありますか?

4

2 に答える 2

3

そうじゃない。しかし、Lisp リーダーのトリックを使用すると、次のことができます。

(make-thing :a #1=1 :b #2=2 :c (+ #1# #2#))

defclassそれ以外の場合は、ジェネリック関数を使用して特殊化しますshared-initialize

これらのリーダー マクロは、フォームの評価結果ではなく、フォームを参照することに注意してください。したがって

(make-thing :id #1=(generate-unique-id) :my-id-is #1#)

は、thingへの2 つの異なる呼び出しで を作成しgenerate-unique-idます。

于 2009-02-08T14:36:47.230 に答える