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

Function 使用相同变量定义函数的最优雅/有效的方法,function,common-lisp,redundancy,keyword-argument,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))

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

例如:

(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))
(定义f(a b键和b键(距离a b))(c a b距离))
(定义g(a b和键(距离a b))(如果(<距离r a b))
(f a b:距离)
(定义h(a b和键(距离a b))(d a b距离))
(defun i(a b和键(距离a b))(g a b:距离)
(h a b:距离)
每个函数都应该能够单独调用,而无需指定关键字参数

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

有没有更优雅/高效的方法来做这样的事情? (我想到了惰性评估和动态编程)

您可以使用
#=


我可能已经陷入了一个宏观。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))))

你能举例说明“惰性评估”或“动态规划”对你的问题有什么帮助吗?我不确定,这是否有帮助。如果我用这种方法找到了解决办法,我就不会问了。如果我可以正常编写函数,但调用某些函数时只对它们求值一次,我认为这会更优雅
  (when (member 'distance lambda-list)
      `(distance (distance ,(first lambda-list) ,(second lambda-list))))