SICP的第3章比较了object与stream两种范式,但很可惜《冒号课堂》里面没有把stream列为一个独立的范式进行讨论。
http://mitpress.mit.edu/sicp/full-text/sicp/book/node50.html
SICP的第3章比较了object与stream两种范式,但很可惜《冒号课堂》里面没有把stream列为一个独立的范式进行讨论。
http://mitpress.mit.edu/sicp/full-text/sicp/book/node50.html
object本身并不是编程范式,而object-oriented才是。类似地,stream本身不宜作为独立的编程范式(事实上在SCIP中,它如同object一样被当作一种data structure),相应的stream processing更适合作为一种计算模型(computational model),既可用于函数范式,也可用于并发范式。
另请参见http://en.wikipedia.org/wiki/Stream_processing。
虽然stream processing不一定能作为一种范式,看了SICP的介绍我觉得它还是很具有代表性的一种模型。
今天我用C#的yield实现了一个无限流的Stack。Stack的输入是(operation, data)的流,输出是(data)流:
class Stack{
public static IEnumerable<int> Transform(IEnumerable<Command> aSourceStream){
LinkedList<int> list = new LinkedList<int>();
foreach(Command command in aSourceStream){
if(OperationType.PUSH== command.Operation){
list.AddLast(command.Data);
}
else if (OperationType.POP == command.Operation){
int data = list.Last.Value;
list.RemoveLast();
yield return data;
}
}
}
}C#、ruby、python等语言确可以利用yield来产生无穷序列,术语称协程(coroutine)。在合适的场合使用这一特性可以让代码更加简明、清晰。另外,这也可看作是函数式所倡导的惰性求值(lazy evaluation)的一种特殊情形。
You must log in to post.