流是通过延时求值实现的,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、filter和foreach等:
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_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
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
最后,看下例子:
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)
分享到:
- 2008-05-08 22:36
- 浏览 1325
- 评论(0)
- 论坛回复 / 浏览 (0 / 1883)
- 查看更多
相关推荐
Ruby-Http2是HTTP/2协议的一个纯Ruby实现,它为Ruby开发者提供了一种高效、安全的方式来处理HTTP通信。HTTP/2是HTTP协议的最新版本,相比于早期的HTTP/1.1,它引入了许多改进,旨在提高网络性能,降低延迟,并优化...
**Ruby-LiteCable:轻量级ActionCable实现免Rails** 在Ruby世界中,Rails框架以其强大的功能和丰富的生态系统闻名。ActionCable是Rails 5引入的一个特性,用于实现Websocket通信,允许实时双向通信,非常适合构建...
Streamio FFMPEG 是一个基于 Ruby 的库,它为 FFmpeg 提供了一个简洁而强大的接口,使得在 Ruby 开发环境中处理多媒体文件变得容易。FFmpeg 是一个广泛使用的跨平台工具集,用于处理音频和视频文件,包括转换、提取...
总结来说,实现"从FM网站获取音频并转换到MP3格式"的Ruby程序需要掌握网络请求、数据解析、文件操作以及音频处理等技能,涉及的库包括`HTTParty`、`Nokogiri`、`open-uri`和`streamio-ffmpeg`等。通过这些工具和技巧...
Ruby是一种动态、面向对象的编程语言,而ORM(Object-Relational Mapping)是将数据库中的数据与编程语言中的对象进行映射的技术,使得开发者可以使用面向对象的方式操作数据库,而无需关心底层SQL语句的编写。...
TensorStream TensorStream是用于Ruby机器学习的... 这些实现旨在协同工作,您可以在OpenCL实现(具有GPU)上进行训练,然后在Pure Ruby实现上运行生成的训练模型,您可以在其中部署可以在其上运行ruby的任何地方。 Te
在Ruby on Rails开发中,构建RESTful应用是标准实践,它提供了一种组织和管理Web应用资源的方法。然而,RESTful应用通常是基于HTTP协议的请求-响应模型,这限制了实时交互的能力。为了克服这个问题,我们可以引入...
在Ruby中,`REXML::Parsers::StreamParser`可以实现这个功能,但示例代码较长,这里不再详述。 总的来说,Ruby的`Builder`库和`ReXML`库提供了强大的XML处理能力,无论是在创建还是解析XML文件时,都能满足各种需求...
6. `XREAD`:消费Stream中的消息,可以设置为阻塞模式,当Stream无消息时等待新的消息。 Redis 5.0还引入了其他新特性: 1. 新的Redis模块API:包括Timers(定时器)和Cluster API,这使得开发者可以更方便地扩展...
到目前为止,存在以下Elixir模块的部分实现: 代理人 原子 根据 辞典 枚举 文件 漂浮 整数 列表 OptionParser 小路 范围 放 溪流 细绳 系统 任务 元组 版本 要求 Ruby 2.2+ 安装 gem install elixir.rb 例子 ...
Ruby是一种面向对象的、动态类型的编程语言,具有简洁的语法和强大的元编程能力,因此在Web开发和脚本编写中广泛使用。 "SCTP Ruby扩展"是将SCTP协议的功能引入到Ruby语言中的一个库或框架。这个实现使得Ruby开发者...
**Ruby管道**是一种在Ruby编程语言中实现数据处理和流操作的概念,它借鉴了Unix shell中的管道机制。在Unix shell中,管道允许我们把一个命令的输出作为另一个命令的输入,形成一个连续的数据处理链。在Ruby中,虽然...
`ruby_bosh`库的存在,使得开发者无需深入理解底层的BOSH机制,就能在Ruby Web应用中实现XMPP的实时通信功能。 **文件名称列表分析** 由于只给出了"ruby_bosh-master"这一文件名,我们可以推测这是项目源代码的主...
Redis-3.0.0.gem是Redis在Ruby语言环境中的封装库,便于Ruby开发者在项目中集成和使用Redis服务。下面我们将深入探讨Redis的基础知识、3.0.0版本的特点以及如何在Ruby中安装和使用Redis。 1. Redis基础知识: - ...
3. SSE实现:在Sinatra应用中,可能有处理SSE请求的路由和响应函数,使用HTTP的`Content-Type: text/event-stream`和`Connection: keep-alive`头来实现。 4. 测试或示例数据:可能包含一些测试数据或脚本来模拟AMQP...
现在让我们深入了解一下如何使用Ruby和EventMachine构建一个HTTP服务器以实现文件下载功能。 EventMachine是一个事件驱动的网络库,它允许开发者创建高性能、低延迟的服务。在这个实例中,我们使用`em-...
使用`gem install redis-3.2.1.gem`命令,Ruby开发者可以在他们的项目中快速集成Redis支持,无需关心底层实现的复杂性。 在压缩包的文件名称列表中,只有一项"redis-3.2.1.gem",这意味着这个压缩包可能仅包含Redis...
TD Ameritrade Stream Daemon 该工具实现了 TD Ameritrade Interface gem,以流式传输股票监视列表上的实时报价。 我用它来发现股票价格的盘中突然波动。 它使用基于 5 分钟平均真实范围技术指标的范围度量来发现...
本教程将详细讲解如何在Swift项目中集成IJKLivePlayer进行直播拉流,并结合腾讯IM实现弹幕和赞的功能。 一、IJKLivePlayer集成 IJKLivePlayer是一款跨平台的开源媒体播放器,由Bilibili开发,支持RTMP、HLS等多种流...
然而,即便如此,Kotlin在计算能力上并未实现质的飞跃,仍需依赖其提供的工具和库来完成结构化数据的复杂计算。 总结来说,Java 8的Stream库显著提升了Java处理结构化数据的能力,Lambda表达式和链式编程极大提高了...