<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)



    主站蜘蛛池模板: 亚洲免费观看视频| 污污污视频在线免费观看| 亚洲综合色自拍一区| 精品亚洲福利一区二区| 久久久久亚洲AV无码专区首JN| yy一级毛片免费视频| 国产亚洲大尺度无码无码专线 | 91黑丝国产线观看免费| 亚洲精品国产精品乱码不卡√ | 国产成人yy免费视频| 亚洲国产成人手机在线电影bd | 久久免费视频99| 亚洲午夜在线电影| 日本最新免费网站| 国产精品免费视频一区| 亚洲视频在线观看地址| 美女视频黄免费亚洲| 亚洲AV无码资源在线观看| 国产极品美女高潮抽搐免费网站| 国产精品久久久久久亚洲小说| 亚洲国产V高清在线观看| XXX2高清在线观看免费视频| 久久久无码精品亚洲日韩蜜桃 | 在线jlzzjlzz免费播放| 特级毛片全部免费播放| 国产亚洲精品xxx| 免费看片在线观看| 国产成人精品亚洲一区| 亚洲一区二区三区影院| 青青免费在线视频| 久久青青成人亚洲精品| 免费a级毛片高清视频不卡| 老子影院午夜伦不卡亚洲| 国产亚洲色视频在线| 黄床大片30分钟免费看| 国产精品亚洲а∨无码播放| 嫩草视频在线免费观看| 黄桃AV无码免费一区二区三区| 亚洲国产精品网站久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产精品免费看久久久无码|