我已经习惯了Haskell的惰性求值,现在使用默认为急切求值的语言时会感到很烦恼。这实际上是非常有害的,因为我使用的其他语言通常使惰性求值变得非常麻烦,通常需要编写自定义迭代器等等。所以仅仅通过获取一些知识,我实际上使自己在原来的语言中效率更低了。唉。
但是我听说AST宏提供了另一种干净的方式来完成相同的事情。我经常听到像“惰性求值使宏变得多余”之类的声明,反之亦然,主要来自Lisp和Haskell社区。
我尝试过在各种Lisp变体中使用宏。它们似乎只是一种有组织地将代码块复制和粘贴到编译时处理的方法。它们肯定不是Lispers认为的圣杯。但几乎肯定是因为我无法正确使用它们。当然,使宏系统在与语言本身组装的相同核心数据结构上工作确实很有用,但它仍然基本上是一种组织代码的方式,就像复制和粘贴代码一样。我认识到,基于与允许完全运行时修改的语言相同的AST的宏系统是强大的。
我想知道的是,宏如何被用来简明扼要地做惰性求值?如果我想逐行处理文件而不将整个文件读入内存,我只需返回已将读取行例程映射到其上的列表。这是DWIM(我所想的)的完美例子。我甚至不必考虑它。
我显然不懂宏。我使用过它们,但鉴于炒作,没有特别印象深刻。因此,有些东西我在网上阅读文档时没有理解。有人能向我解释所有这些吗?