Ruby实现stream具体方法介绍

Ruby语言在编程界可以说是一个后起之秀,出现的目的就是帮助编程人员更简便灵活的去编写代码程序,完成自己的功能需求。比如在Ruby实现stream方面。

按照sicp,首要的是两个函数:delay和force:

  1. def mem_proc(exp)  
  2. alread_run=false 
  3. result=false 
  4. lambda{  
  5. if !alread_run  
  6. result=exp.call  
  7. alread_run=true 
  8. result  
  9. else  
  10. result  
  11. end  
  12. }  
  13. end  
  14. def force(delayed_object)  
  15. delayed_object.call  
  16. end  
  17. def delay(exp)  
  18. mem_proc(lambda{exp})  
  19. end 

delay函数返回延时对象,就是对于未来某个时间求值表达式的承诺;force函数以延时对象为参数,进行相应的求值工作,这里的mem_proc用于记忆已经求值过的表达式。Ruby实现stream的constructor和selector函数:

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中的数组充当“粘合剂”,stream_car直接返回第一个元素,而stream_cdr需要用force求值表达式,履行承诺。另外,将空数组[]作为the-empty-stream。再定义几个高阶函数,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 

相关推荐