<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    Ruby中實現stream

    Posted on 2008-05-08 22:32 dennis 閱讀(1256) 評論(0)  編輯  收藏 所屬分類: 動態語言
        流是通過延時求值實現的,Ruby中實現stream也是可以做到,可惜就是沒有尾遞歸優化。按照sicp,首要的是兩個函數: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函數返回延時對象,就是對于未來某個時間求值表達式的承諾;force函數以延時對象為參數,進行相應的求值工作,這里的mem_proc用于記憶已經求值過的表達式。定義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

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



    主站蜘蛛池模板: 免费人妻无码不卡中文字幕18禁| 中文字幕亚洲码在线| 国产不卡免费视频| 24小时日本韩国高清免费| 一级毛片在线完整免费观看| 亚洲一区二区三区久久| 亚洲成人激情在线| 国产综合精品久久亚洲| 日韩一级免费视频| 永久免费av无码不卡在线观看| 精品亚洲永久免费精品| 国产成人精品免费视频大全| 欧美日韩亚洲精品| 亚洲欧美日韩综合俺去了| 亚洲大片免费观看| 亚洲美女在线观看播放| 亚洲乱亚洲乱淫久久| 亚洲热妇无码AV在线播放| 中文字幕亚洲图片| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 免费高清A级毛片在线播放| 亚洲欧美一区二区三区日产| 亚洲色大成网站www永久男同| 亚洲成人福利在线| 666精品国产精品亚洲| 久久久久久亚洲Av无码精品专口| 亚洲成a人片在线观看日本| 亚洲动漫精品无码av天堂| 中文字幕精品亚洲无线码一区| 亚洲无线一二三四区手机| 亚洲午夜av影院| 亚洲精品乱码久久久久久久久久久久| 精品国产亚洲男女在线线电影| 亚洲国产精品毛片av不卡在线| 亚洲国产精品尤物yw在线| 哒哒哒免费视频观看在线www | 亚洲成_人网站图片| 久久综合久久综合亚洲| 亚洲精华国产精华精华液好用| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲狠狠婷婷综合久久|