莊周夢(mèng)蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Ruby中實(shí)現(xiàn)stream

          Posted on 2008-05-08 22:32 dennis 閱讀(1253) 評(píng)論(0)  編輯  收藏 所屬分類: 動(dòng)態(tài)語言
              流是通過延時(shí)求值實(shí)現(xiàn)的,Ruby中實(shí)現(xiàn)stream也是可以做到,可惜就是沒有尾遞歸優(yōu)化。按照sicp,首要的是兩個(gè)函數(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ù)返回延時(shí)對(duì)象,就是對(duì)于未來某個(gè)時(shí)間求值表達(dá)式的承諾;force函數(shù)以延時(shí)對(duì)象為參數(shù),進(jìn)行相應(yīng)的求值工作,這里的mem_proc用于記憶已經(jīng)求值過的表達(dá)式。定義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直接返回第一個(gè)元素,而stream_cdr需要用force求值表達(dá)式,履行承諾。另外,將空數(shù)組[]作為the-empty-stream。再定義幾個(gè)高階函數(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

              最后,看下例子:
          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)



          主站蜘蛛池模板: 湖口县| 龙山县| 拉萨市| 潜江市| 天柱县| 胶州市| 汕尾市| 英吉沙县| 轮台县| 高密市| 郑州市| 海丰县| 阜康市| 元阳县| 东乡县| 无棣县| 寿光市| 全南县| 司法| 西青区| 乌兰县| 文山县| 揭东县| 平度市| 文安县| 班戈县| 虹口区| 大方县| 怀宁县| 三都| 珠海市| 新疆| 武冈市| 湖南省| 克拉玛依市| 商水县| 三台县| 岑巩县| 沾益县| 皋兰县| 专栏|