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

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

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

    莊周夢蝶

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

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

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



    主站蜘蛛池模板: 亚洲av片不卡无码久久| 亚洲av无码专区在线观看下载 | 最近中文字幕无免费视频| 13小箩利洗澡无码视频网站免费| 久久免费国产精品一区二区| 国产成人一区二区三区视频免费 | 亚洲精品国产手机| 99久久人妻精品免费一区| 亚洲国产精品不卡在线电影| 99久久99久久精品免费观看| 激情五月亚洲色图| 午夜视频免费观看| 国产亚洲人成网站在线观看不卡| 精品亚洲成AV人在线观看| 亚洲午夜精品第一区二区8050| 免费国产美女爽到喷出水来视频| 亚洲人成网站色在线入口| 国产禁女女网站免费看| 亚洲av日韩av无码av| 亚洲∧v久久久无码精品| 亚洲国产婷婷香蕉久久久久久| 中文字幕亚洲激情| 久久精品国产亚洲77777| 亚洲码和欧洲码一码二码三码| 色www免费视频| 亚洲免费福利视频| 中文字幕人成人乱码亚洲电影 | 亚洲大尺码专区影院| 爱丫爱丫影院在线观看免费| 国产在线观看免费视频播放器| 亚洲AV区无码字幕中文色| 中文字幕永久免费| 亚洲精品国产高清嫩草影院| 黄色网页免费观看| 亚洲国产婷婷综合在线精品| 国产天堂亚洲精品| 亚洲一级片内射网站在线观看| 亚洲一本到无码av中文字幕| 国产成在线观看免费视频| 亚洲黄色在线播放| 亚洲人成在线免费观看|