Lisp 如何定义懒惰和懒惰

Lisp 如何定义懒惰和懒惰,lisp,common-lisp,lazy-evaluation,Lisp,Common Lisp,Lazy Evaluation,我定义了以下宏: (defmacro ~lazy (expression) `(lambda () ,@expression)) (defgeneric force~ (value) (:method (value) value) (:method ((value function)) (funcall value))) (defmacro ~~ (expression) `(~lazy (force~ ,expression))) [……] 下面

我定义了以下宏:

(defmacro ~lazy (expression)
  `(lambda ()
     ,@expression))

(defgeneric force~ (value)
  (:method (value)
    value)
  (:method ((value function))
    (funcall value)))

(defmacro ~~ (expression)
  `(~lazy (force~ ,expression)))
[……] 下面的宏定义了一个名为“name”的泛型函数,并定义了一些标准方法。这应该像“REDUCE”一样工作,并强制所有惰性值同时返回惰性值,否则即使遇到惰性值和非惰性值(由以“~”开头和结尾的宏表示)

现在我定义~_和~,如下所示:

(~lazy-reduce~ ~_and~ and (val vals)
   (((val null)
     vals)
    nil)
   ((val (vals null))
    val))
(:method (val (vals cons))
 (let ((first (first vals)))
   (if (functionp first)
       (~~ (and (force~ first)
                (force~ (~_and~ val (rest vals)))))
       (~_and~ (and val first)
               (rest vals)))))
召唤

(~_and~ t (list 2))
工作正常,返回“2”,与预期一样,但

(force~ ~_and~ t (list (~ 2)))
只返回“T”


我不知道这是为什么,这使我无法简洁地定义“~FIND-IF”。

我发现了我的错误:~\u和~的第一个方法如下所示:

(~lazy-reduce~ ~_and~ and (val vals)
   (((val null)
     vals)
    nil)
   ((val (vals null))
    val))
(:method (val (vals cons))
 (let ((first (first vals)))
   (if (functionp first)
       (~~ (and (force~ first)
                (force~ (~_and~ val (rest vals)))))
       (~_and~ (and val first)
               (rest vals)))))
(这可以通过给定的~_和~)定义上的MACROEXPAND-1看到)

这意味着所显示的调用(大致)被评估为


这将返回“T”,如图所示。

我认为代码看起来不便于维护。我建议去掉APPEND,创建一个谓词,根据arglist检测方法的存在,并为代码编写生成器函数。使用“功能抽象”。谢谢!我将对此进行研究,尤其是因为我更经常需要此功能。