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检测方法的存在,并为代码编写生成器函数。使用“功能抽象”。谢谢!我将对此进行研究,尤其是因为我更经常需要此功能。