登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Chun Tian (binghe)

超越自我,洞察宇宙

 
 
 

日志

 
 

混乱的 Common Lisp “流” 市场  

2007-02-02 01:02:06|  分类: Lisp |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
流 (stream) 是 Common Lisp 实现的核心部分。由于 ANSI Common Lisp 标准中只规定了流的很小一部分行为,而日常生活中对流的需求无处不在,所以各家厂商都有自己的实现和扩展方式,给编写跨 Lisp 平台的可移植程序带来麻烦。

流的最大作用是简化编程,文件操作、字符串处理、网络通信本质上都是对数据流的计算,拥有一个功能强大,稳定可靠的流实现,可以统一 Lisp 世界中很多软件包中程序员自行实现的类似对象,将所有流归结在一个类继承树里,最大程度地实现流组件的共享。SBCL 文档中提到,目前主要有三种流扩展:

Bivalent Streams: 一种可同时读写 character 和 (unsigned-byte 8) 类型数据的流类型
Gray Streams: 用户可重载的 CLOS 类,其实例可用作 Lisp 流 (例如作为 format 的第一个参数)
Simple Streams: Franz 提出的 Allegro simple-streams 标准草案

从设计理念和特性上来讲 simple-stream 是未来的发展方向。simple-stream 解决了 gray-stream 的下列问题:

1. gray stream 区分每个流的输入和输出方向,对各种流类强制分成三种类型(只输入、只输出,既输入又输出)
2. gray stream 按照固定的元素类型来区分流,实践发现这种限制很不合理,使得在同一个流里传输不定宽度的元素变得困难
3. gray stream 的方法,直接定义在 Common Lisp 流接口的下面,带来一些优化和语义不清之类的难题
4. 由于实现的级别太高,扩展 gray stream 需要重写大量不必要的代码。

simple-stream 将输入、输出特性作为所有流的一种标记属性来对待,同时不定义任何元素类型,所有元素均在底层按照8位元处理,通过适当的扩展,可以把simple- stream用作外部IO设备或者伪设备等。可以说,simple-stream是未来 Common Lisp 流的发展方向。
但是目前 simple-stream 只在 Allegro Common Lisp 拥有最完整的实现,在 CMUCL 和 SBCL 上只有部分实现,在 CLISP 和 LispWorks 上没有实现,其他 Lisp 厂商的情况不清楚。而 Gray stream 是所有 Lisp 厂商都实现,并且有 trivial-gray-stream 项目提供跨 Lisp 平台的兼容层。所以,推广 simple-stream 的关键在于:

1. 继续开发 SBCL 和 CMUCL 上拥有共同来源的 simple-stream 实现,使之完全兼容 Allegro Common Lisp
2. 至少实现 LispWorks 上的 simple-stream 支持,借此促使 CLISP 和 OpenMCL 也跟风实现 simple-stream
3. 开发一个 trivial-simple-stream 包用于提供跨 Lisp 平台的 simple-stream 兼容层
4. 实现一些简单的 simple-stream 扩展,例如 Allegro CL 已经实现了的 inflate 压缩算法流
5. 实现一些复杂的扩展,例如建立在网络流基础上的 BER 编解码流,进而支持 SNMP 和 LDAP 协议流;另一个方向是在终端流的基础上实现 ANSI 彩色终端流,进而为基于 Lisp 的 BBS 开发打下一个良好的基础。

所以,还是有很多事要做的。


  评论这张
 
阅读(2453)| 评论(4)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018