【发布时间】:2015-07-08 10:05:44
【问题描述】:
【问题讨论】:
标签: haskell macros lisp monads
【问题讨论】:
标签: haskell macros lisp monads
这是一种奇怪的比较。这有点像在问“汽油车能做什么柴油发电机不能做的事情?”呃,好吧,那些不是真正的同一类东西......
Lisp 宏 [我对此几乎一无所知] 允许您进行编译时元编程。您可以使用它来实现各种有用的事情,从消除一些样板代码到虚拟定义一种全新的编程语言。
Haskell monad 是构建某些类型计算的有用方法。它们使某些原本有点乏味的事情变得容易。 (例如,在运行下一个函数之前检查每个函数的结果以确保它成功。)不过,所有这些都是 run-time 的事情;它与编译时代码生成无关。
【讨论】:
如果你可以用 Lisp 实现某些东西,你可以用宏来改进它的语法。因此,宏部分只是为了让它看起来更好或/和减少代码大小。
您不需要宏来实现单子。 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 中的函数来做同样的事情。
【讨论】: