Lisp 宏不能用 Haskell monad 做什么,反之亦然?

What can be done with a Haskell monad that cannot be done with a Lisp macro, and vice-versa?

我目前的理解是,宏可以实现任何可以想象的概念,包括 monad,因为它们 "have the compiler at hands"。这是真的?例如,我遇到过这个 link

拜托,给我事实和例子,不要热情的回答。谢谢。

这是一种奇怪的比较。这有点像问 "what can a petrol car do that a diesel generator cannot?" 呃,好吧,那些东西真的不一样 class...

Lisp 宏 [我几乎一无所知] 允许您进行编译时元编程。您可以使用它来实现各种有用的事情,从消除一些样板代码到虚拟定义一种全新的编程语言。

Haskell monad 是构建某些类型计算的有用方法。它们使某些原本有点乏味的事情变得容易。 (例如,检查每个函数的结果以确保它在 运行 下一个函数之前成功。)所有这些都是 运行-time事情,虽然;它与编译时代码生成无关。

如果你能用 Lisp 实现一些东西,你就可以用宏改进它的语法。因此宏部分只是为了让它看起来更好 or/and 减少代码大小。

您不需要宏来实现 monad。 Marijn Haverbeke 使用 defstructdefgeneic 制作了 monad implementation

当然 defstructdefgeneric 可能会使用宏来实现它的魔力,但实际上并不需要它来实现 monad。您可以使用闭包实现 monad。在下面的代码中,它用作具有封装和消息传递的基本 OO。

(defun maybe (val)
  (lambda (msg &optional f m)
    (case msg
      ((bind) (if val (funcall f val) m))
      (otherwise val))))

(defun bind (m f)
  (funcall m 'bind f m)) ;message passing

(defun value (m)
  (funcall m 'value))    ; message passig

宏是作用于语法的函数。在像 Haskell 这样的惰性语言中,宏可以被函数替换,因为只有在需要时才计算参数。例如。在具有急切求值的 CL 中,您需要一个宏来创建您自己的 if,但您可以使用 Haskell.

中的函数执行相同的操作