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 使用 defstruct
和 defgeneic
制作了 monad implementation。
当然 defstruct
和 defgeneric
可能会使用宏来实现它的魔力,但实际上并不需要它来实现 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.
中的函数执行相同的操作
我目前的理解是,宏可以实现任何可以想象的概念,包括 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 使用 defstruct
和 defgeneic
制作了 monad implementation。
当然 defstruct
和 defgeneric
可能会使用宏来实现它的魔力,但实际上并不需要它来实现 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.