stream失败

来源:互联网 发布:面试 为什么选择java 编辑:程序博客网 时间:2024/04/28 07:59

看到SICP中在scheme上做了个很漂亮而且很可爱的stream,实在痒痒,准备用C++/Java来做一个。结果失败,实在郁闷。

C++自然免不了试试templates,虽然平时很讨厌这个东西——变异错误老长不说,没用到的函数还不检查,实在很烦人,不过做做玩具还是可以用用的。用C++的template之后,发现整个stream做完后,求值被分为两个阶段:先由comipler编译(部分求值,确定所有需要的计算),再运行程序,从而要取得stream中的第n个元素,前n个元素,这个n都必须是编译期给定的。这让我极为不快。后来又由于不能直接推导返回类型,一怒之下不做了。实在是做出来都没用的东西……(虽说本来就是玩具)

试试看Java吧,最初感觉挺好做,但有一个难点:delay(proc, arg1, arg2, ...)返回一个Promise,对这个Promise实用promise.eval()要得到proc(arg1, arg2, ...),但arg数目又是不定的……用讨厌的枚举(没参数到n参数)??然后proc又是一个Interface Functor然后一个个派生??太messy了吧!虽说C++就是这么做的,不过现成有个boost::function可用,倒也不费事,更好的是,delay可以用boost::bind来做,实在省力。这里倒好,都要重头来……可变参数在Java 1.5才有,我也懒得弄,况且要每个proc都自己处理检查argument types也不是什么很优雅的事情……不过至少这里是可行的,但由于太丑,也没做下去。

有朝一日可能会用C#/Java1.5来做吧,C++心血来潮也可能继续,再议再议,今天就到此为止了。

?

附录:有关上面提到的stream:

首先介绍一下scheme的基本语法:(proc arg1 arg2)就是以proc为函数名,arg1, arg2分别为参数,调用这个函数,表达式的值就是proc返回的值。(cons x y)就是返回一个(x, y)的二元组,而分别可用(car (cons x y))取得x, (cdr (cons x y))取得y。就这么多了,下面是原书关于stream的连接。

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5