使用相同变量定义函数的大多数 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))))
我使用一些变量定义了多个函数,这些函数通常会在更多函数中计算。所以我使用关键字参数,默认计算所需的值。
示例:
(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))))