【问题标题】:Most elegant/efficient way to define functions using the same variables使用相同变量定义函数的最优雅/最有效的方法
【发布时间】:2015-03-29 09:40:04
【问题描述】:

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

例子:

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

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

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

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

【问题讨论】:

  • 您能举一个例子,“惰性评估”或“动态编程”如何帮助您解决问题吗?
  • 我不确定这是否有帮助。如果我以这种方式找到了解决方案,我就不会问了。如果我可以正常编写函数,但在调用某些函数时只评估一次,我认为会更优雅

标签: function common-lisp redundancy keyword-argument


【解决方案1】:

你可以使用#=:

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

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

【讨论】:

    【解决方案2】:

    我可能会陷入宏中。例如

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

    如果“a”和“b”的名称是可变的,你可以通过将变量的符号提供给宏来获得一点幻想,并且宏可以很容易地 仅包含与您命名的关键字参数的绑定;例如

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

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 2012-03-08
      • 2021-08-11
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2020-03-29
      相关资源
      最近更新 更多