我目前的理解是宏可以实现任何可以想象的概念,包括monad,因为它们“手头有编译器”。这是真的?例如,我遇到了这个link
请给我一些事实和例子,没有热情的答案。谢谢。
答案 0 :(得分:7)
这是一种奇怪的比较。这有点像要问柴油发电机不能用汽油车做什么?"呃,那些并不属于同一类......
Lisp宏[我几乎一无所知]允许你进行编译时元编程。您可以使用它来实现各种有用的东西,从消除一些样板代码到虚拟定义一种全新的编程语言。
Haskell monads是构造某些类型计算的有用方法。他们可以轻松地做某些本来有点繁琐的事情。 (例如,在运行下一个函数之前检查每个函数的结果以确保它成功。)所有这些都是运行时的东西;它与编译时代码生成无关。
答案 1 :(得分:3)
如果你可以用Lisp实现一些东西,你可以用宏来改进它的语法。因此宏部分只是为了让它看起来更好或/和减少代码大小。
您不需要宏来实现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中的函数执行相同的操作。