Ruby實(shí)現(xiàn)stream具體方法介紹
Ruby語言在編程界可以說是一個后起之秀,出現(xiàn)的目的就是幫助編程人員更簡便靈活的去編寫代碼程序,完成自己的功能需求。比如在Ruby實(shí)現(xiàn)stream方面。#t#
按照sicp,首要的是兩個函數(shù):delay和force:
- def mem_proc(exp)
 - alread_run=false
 - result=false
 - lambda{
 - if !alread_run
 - result=exp.call
 - alread_run=true
 - result
 - else
 - result
 - end
 - }
 - end
 - def force(delayed_object)
 - delayed_object.call
 - end
 - def delay(exp)
 - mem_proc(lambda{exp})
 - end
 
delay函數(shù)返回延時對象,就是對于未來某個時間求值表達(dá)式的承諾;force函數(shù)以延時對象為參數(shù),進(jìn)行相應(yīng)的求值工作,這里的mem_proc用于記憶已經(jīng)求值過的表達(dá)式。Ruby實(shí)現(xiàn)stream的constructor和selector函數(shù):
- def cons_stream(a,b)
 - return a,delay(b)
 - end
 - def stream_car(s)
 - s[0]
 - end
 - def stream_cdr(s)
 - force(s[1])
 - end
 - def stream_null?(s)
 - s.nil? or s==[]
 - end
 
用Ruby中的數(shù)組充當(dāng)“粘合劑”,stream_car直接返回***個元素,而stream_cdr需要用force求值表達(dá)式,履行承諾。另外,將空數(shù)組[]作為the-empty-stream。再定義幾個高階函數(shù),map和foreach,其他如filter與此類似:
- def stream_enumerate_interval(low,high)
 - if low>high
 - return []
 - else
 - cons_stream(low,stream_enumerate
 
_interval(low.succ,high))- end
 - end
 - def stream_ref(s,n)
 - if n==0
 - stream_car(s)
 - else
 - stream_ref(stream_cdr(s),(n-1))
 - end
 - end
 - def stream_map(proc,s)
 - if stream_null?(s)
 - []
 - else
 - cons_stream(proc.call(stream_car(s))
 
,stream_map(proc,(stream_cdr(s))))- end
 - end
 - def stream_for_each(proc,s)
 - if stream_null?(s)
 - :done
 - else
 - proc.call(stream_car(s))
 - stream_for_each(proc,stream_cdr(s))
 - end
 - end
 - def display_stream(s)
 - stream_for_each(lambda{|item| puts item},s)
 - end
 - def stream_filter(pred,s)
 - if stream_null?(s)
 - []
 - elsif pred.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實(shí)現(xiàn)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)
 















 
 
 
 
 
 
 