使用相同变量定义函数的最优雅/有效方式

时间:2015-03-29 09:40:05

标签: function common-lisp redundancy keyword-argument

我使用一些变量定义了多个函数,通常可以在更多函数中计算。所以我使用关键字参数,默认情况下计算所需的值。

示例:

(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))

应该能够单独调用每个函数,而无需指定关键字参数。

但现在我还必须在每个函数中定义关键字参数的计算。

有更优雅/更有效的方法来做这样的事情吗? (我考虑过懒惰评估和动态编程)

2 个答案:

答案 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))))