Ruby实现stream的方法对于我们刚刚学习Ruby语言的人来说是比较容易掌握的一个方法。那么我们就一起来看看这方面的相关知识。
Ruby语言在编程界可以说是一个后起之秀,出现的目的就是帮助编程人员更简便灵活的去编写代码程序,完成自己的功能需求。比如在Ruby实现stream方面。#t#
按照sicp,首要的是两个函数:delay和force:
- defmem_proc(exp)
- alread_run=false
- result=false
- lambda{
- if!alread_run
- result=exp.call
- alread_run=true
- result
- else
- result
- end
- }
- end
- defforce(delayed_object)
- delayed_object.call
- end
- defdelay(exp)
- mem_proc(lambda{exp})
- end
delay函数返回延时对象,就是对于未来某个时间求值表达式的承诺;force函数以延时对象为参数,进行相应的求值工作,这里的mem_proc用于记忆已经求值过的表达式。Ruby实现stream的constructor和selector函数:
- defcons_stream(a,b)
- returna,delay(b)
- end
- defstream_car(s)
- s[0]
- end
- defstream_cdr(s)
- force(s[1])
- end
- defstream_null?(s)
- s.nil?ors==[]
- end
用Ruby中的数组充当“粘合剂”,stream_car直接返回***个元素,而stream_cdr需要用force求值表达式,履行承诺。另外,将空数组[]作为the-empty-stream。再定义几个高阶函数,map和foreach,其他如filter与此类似:
- defstream_enumerate_interval(low,high)
- iflow>high
- return[]
- else
- cons_stream(low,stream_enumerate
_interval(low.succ,high))- end
- end
- defstream_ref(s,n)
- ifn==0
- stream_car(s)
- else
- stream_ref(stream_cdr(s),(n-1))
- end
- end
- defstream_map(proc,s)
- ifstream_null?(s)
- []
- else
- cons_stream(proc.call(stream_car(s))
,stream_map(proc,(stream_cdr(s))))- end
- end
- defstream_for_each(proc,s)
- ifstream_null?(s)
- :done
- else
- proc.call(stream_car(s))
- stream_for_each(proc,stream_cdr(s))
- end
- end
- defdisplay_stream(s)
- stream_for_each(lambda{|item|putsitem},s)
- end
- defstream_filter(pred,s)
- ifstream_null?(s)
- []
- elsifpred.call(stream_car(s))
- cons_stream(stream_car(s),stream_
filter(pred,stream_cdr(s)))- else
- stream_filter(pred,stream_cdr(s))
- end
- end
***,看下Ruby实现stream例子:
- puts"s:"
- s=stream_enumerate_interval(1,5)
- display_stream(s)
- puts"odd_s:"
- odd_s=stream_filter
(lambda{|x|x%2==1},s)- display_stream(odd_s)
- puts"ss:"
- ss=stream_map(lambda{|x|x*x},s)
- display_stream(ss)
转载请说明出处
知优网 » Ruby实现stream具体方法介绍(javascript stream)
知优网 » Ruby实现stream具体方法介绍(javascript stream)