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



    主站蜘蛛池模板: 美女免费视频一区二区三区| 国产在线观看无码免费视频| 免费一级毛片在级播放| 99re6在线精品免费观看| 久久亚洲精品无码aⅴ大香| 国产在线观看www鲁啊鲁免费| 光棍天堂免费手机观看在线观看| 亚洲第一页在线播放| 亚洲精品视频免费观看| 免费看片在线观看| 九九久久国产精品免费热6| 亚洲最大成人网色| 亚洲AV无码一区二三区| 亚洲黄色片免费看| 人体大胆做受免费视频| 亚洲国产精品无码久久久| 国产亚洲?V无码?V男人的天堂| 台湾一级毛片永久免费| h视频在线免费观看| 456亚洲人成在线播放网站| 国产亚洲人成网站在线观看不卡| 97无码免费人妻超级碰碰夜夜| 永久免费AV无码网站国产| 亚洲成av人片在线天堂无| 亚洲视频在线一区二区三区| 亚洲日本一区二区三区在线不卡| 久久久高清免费视频| 国产午夜精品久久久久免费视| 亚洲AV噜噜一区二区三区 | 亚洲高清在线播放| 国产一级高清免费观看| 国产成人精品免费午夜app | 国产成人精品免费午夜app| 中国精品一级毛片免费播放| 亚洲AV电影天堂男人的天堂| 亚洲乱码在线播放| 亚洲第一区香蕉_国产a| 亚洲精品卡2卡3卡4卡5卡区| 亚洲AV成人精品日韩一区18p| 成人免费看黄20分钟| 999国内精品永久免费观看|