Ruby实现stream的方法对于我们刚刚学习Ruby语言的人来说是比较容易掌握的一个方法。那么我们就一起来看看这方面的相关知识。

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

Ruby实现stream具体方法介绍(javascript stream)  Ruby实现stream 第1张

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

  1. defmem_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. defforce(delayed_object)
  15. delayed_object.call
  16. end
  17. defdelay(exp)
  18. mem_proc(lambda{exp})
  19. end

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

  1. defcons_stream(a,b)
  2. returna,delay(b)
  3. end
  4. defstream_car(s)
  5. s[0]
  6. end
  7. defstream_cdr(s)
  8. force(s[1])
  9. end
  10. defstream_null?(s)
  11. s.nil?ors==[]
  12. end 

用Ruby中的数组充当“粘合剂”,stream_car直接返回***个元素,而stream_cdr需要用force求值表达式,履行承诺。另外,将空数组[]作为the-empty-stream。再定义几个高阶函数,map和foreach,其他如filter与此类似:

  1. defstream_enumerate_interval(low,high)
  2.  iflow>high
  3.   return[]
  4.  else
  5.   cons_stream(low,stream_enumerate
    _interval(low.succ,high))  
  6.  end
  7. end
  8. defstream_ref(s,n)
  9.  ifn==0
  10.   stream_car(s)
  11.  else
  12.   stream_ref(stream_cdr(s),(n-1))  
  13. end
  14. end
  15. defstream_map(proc,s)
  16. ifstream_null?(s)
  17. []
  18. else
  19. cons_stream(proc.call(stream_car(s))
    ,stream_map(proc,(stream_cdr(s))))  
  20. end
  21. end
  22. defstream_for_each(proc,s)
  23. ifstream_null?(s)
  24. :done
  25. else
  26. proc.call(stream_car(s))
  27. stream_for_each(proc,stream_cdr(s))  
  28. end
  29. end
  30. defdisplay_stream(s)
  31. stream_for_each(lambda{|item|putsitem},s)
  32. end
  33. defstream_filter(pred,s)
  34. ifstream_null?(s)
  35. []
  36. elsifpred.call(stream_car(s))
  37. cons_stream(stream_car(s),stream_
    filter(pred,stream_cdr(s)))
  38. else
  39. stream_filter(pred,stream_cdr(s)) 
  40. end
  41. end

***,看下Ruby实现stream例子:

  1. puts"s:"
  2. s=stream_enumerate_interval(1,5)
  3. display_stream(s)
  4. puts"odd_s:"
  5. odd_s=stream_filter
    (lambda{|x|x%2==1},s)
  6. display_stream(odd_s)
  7. puts"ss:"
  8. ss=stream_map(lambda{|x|x*x},s)
  9. display_stream(ss)

转载请说明出处
知优网 » Ruby实现stream具体方法介绍(javascript stream)

发表评论

您需要后才能发表评论