使用相同变量定义函数的大多数 elegant/efficient 方式

Most elegant/efficient way to define functions using the same variables

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

示例:

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

每个函数都应该能够在不指定关键字参数的情况下单独调用。

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

有没有更多的elegant/efficient方法来做这样的事情? (想到了惰性求值和动态规划)

你可以使用 #=:

(defun foo (a b &key #1=(distance (distance a b))) #|...|#)

(defun bar (a b &key #1#) #|... |#)

我可能已经陷入了宏。例如

 (defmacro def-distance-fun (name &body body)
     `(defun ,name (a b &key (distance (distance a b))) ,@body))

 (def-distance-fun foo
       … blah )

如果 "a" 和 "b" 的名称是可变的,你可以通过将变量的符号提供给宏来变得更有趣,并且宏可以很容易地 enough include 仅绑定到您指定的关键字参数;例如

  (when (member 'distance lambda-list)
      `(distance (distance ,(first lambda-list) ,(second lambda-list))))