懒惰的评价很棒。如果我们在所有数据类型都是惰性的情况下创建PL,该怎么办?
极端主义编程(与极限编程无关)是采取某种原则,将其提升到所有其他一切之上的行为。尘埃落定之后,人们经常看着这种极端主义,然后想:“好吧,这很有趣,但是在Y中使用X显然是不合适的。您需要使用正确的工具来完成工作!”
这很重要:有时您应该使用错误的工具来完成工作,因为它可能是正确的工具,而您还不知道。如果您不打算在所有地方都使用函数,则可能不会意识到以函数为参数[1]或廉价的lambda [2]的函数的效用。如果您不打算在任何地方使用对象,那么您可能不会意识到整数[3]和对象的类[4]也是对象。如果您不打算在所有地方都使用懒惰,那么您可能不会意识到纯洁是更重要的语言功能[5]。
在学习新原理时,请尝试将其应用于所有地方。这样一来,即使您最初对它的直觉是错误的,您也可以更快地了解它在哪些地方有效以及在哪些地方无效。 (另一方面,如果您不知道该原则适用于某些情况,那么正确的工作工具将使您错过机会。)
当试图阐明某些原则的实质时,极端主义制度最为清晰。如果您想了解使用惰性评估进行编程的感觉,请使用Haskell,而不是具有可选惰性的语言。即使极端主义制度不太实际,它也确实可以更快地到达问题的核心。
在很多情况下,极端主义是不合适的,但是对于有趣的项目,小型项目和研究而言,它确实可以教给您很多东西。去年,我与亚当·克利帕拉(Adam Chlipala)合作时,是我最难忘的互动之一。我们正在Coq中处理一些样张,我一直采取适当的方法先一步一步地制作样张,然后在我知道样张的形状之后再使用Ltac Automation。亚当告诉我:“您应该从一开始就使证明自动化,不要理会手动探索。” [6]明智的建议使我的生活更加美好:我想我还不够极端!
缺点细胞很棒。如果我们制作了一个由坏电池组成的PL怎么办?
[1]高阶函数和组合器:这些函数往往看不到太多的airplay,因为它们可能写起来很冗长,或者因为该语言没有很好的词汇来表达高阶函数的接口。 订单功能是。 (类型在这里有所帮助。) [2]廉价的lambda对于便利使用许多功能是必需的,这些功能包括:monad,作用域分配(和一般情况下的上下文),回调,高阶函数。 [3]在整数和其他原始类型的自动装箱之前,请考虑Java的早期版本。 [5]这是我最喜欢的关于Haskell的叙述之一,它来自西蒙·佩顿·琼斯(Simon Peyton Jones)的演讲,穿着发衫(在这种情况下为懒惰)。 [6]这是Coq的Chlipala学派证明的精髓,认识到诱使经验丰富的计算机科学家无需任何抽象就可以手工编写等效于直线程序的方法是多么的容易。