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

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

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

    莊周夢(mèng)蝶

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

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

    Posted on 2008-05-08 22:32 dennis 閱讀(1256) 評(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)



    主站蜘蛛池模板: 亚洲成a人片在线观看久| 亚洲av无码国产精品色午夜字幕| 一级大黄美女免费播放| 亚洲AV无码乱码在线观看富二代 | 国产亚洲精品精品精品| 伊人亚洲综合青草青草久热| 1000部国产成人免费视频| 国产午夜亚洲精品不卡电影| 亚洲va国产va天堂va久久| 成年女人18级毛片毛片免费| 久久免费99精品国产自在现线| 精品亚洲成在人线AV无码| 亚洲日韩精品无码专区网站| 2021久久精品免费观看| 丰满少妇作爱视频免费观看| 亚洲丝袜中文字幕| 亚洲色大成网站www永久一区| 国产香蕉九九久久精品免费| 免费国产午夜高清在线视频| 亚洲AV色欲色欲WWW| 久久国产亚洲高清观看| 亚洲AⅤ永久无码精品AA| 精品香蕉在线观看免费| 成在线人视频免费视频| 亚洲精品9999久久久久无码| 久久精品国产亚洲AV麻豆网站| 亚洲精品tv久久久久久久久久| A级毛片内射免费视频| 无码精品国产一区二区三区免费 | 吃奶摸下高潮60分钟免费视频| 182tv免费视视频线路一二三| 一本久久A久久免费精品不卡| 亚洲精品自偷自拍无码| 色噜噜综合亚洲av中文无码| 久久国产成人精品国产成人亚洲| 在线jlzzjlzz免费播放| 免费A级毛片无码无遮挡内射| 久久国产精品免费网站| 中文字幕免费在线看线人动作大片| 精品国产日韩亚洲一区91| 亚洲乱码一二三四区乱码|