stream失败

看到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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值