我使用一些变量定义了多个函数,通常可以在更多函数中计算。所以我使用关键字参数,默认情况下计算所需的值。
示例:
(defun f (a b &key (distance (distance a b))) (c a b distance))
(defun g (a b &key (distance (distance a b))) (if (< distance (r a b))
(f a b :distance distance)))
(defun h (a b &key (distance (distance a b))) (d a b distance))
(defun i (a b &key (distance (distance a b))) (g a b :distance distance)
(h a b :distance distance))
应该能够单独调用每个函数,而无需指定关键字参数。
但现在我还必须在每个函数中定义关键字参数的计算。
有更优雅/更有效的方法来做这样的事情吗? (我考虑过懒惰评估和动态编程)
答案 0 :(得分:2)
您可以使用#=
:
(defun foo (a b &key #1=(distance (distance a b))) #|...|#)
(defun bar (a b &key #1#) #|... |#)
答案 1 :(得分:0)
我可能已经陷入了一个宏观。 e.g。
(defmacro def-distance-fun (name &body body)
`(defun ,name (a b &key (distance (distance a b))) ,@body))
(def-distance-fun foo
… blah )
如果“a”和“b”的名称是可变的,你可以通过向宏提供变量符号来获得更多的动画,并且宏可以很容易 足够包括仅绑定到您命名的关键字参数; e.g。
(when (member 'distance lambda-list)
`(distance (distance ,(first lambda-list) ,(second lambda-list))))