在Icon中,每个表达式基本上都是一个流。像*
这样的大多数函数的命名方式都暗示了它们对单个元素的作用。
例如,此处foo.icn
将* 2
映射到流上。
procedure main()
every write((1 | 2 | 3) * 2)
end
我无法从一小部分Icon文档中看出,我已经看到它将如何交错两个非平凡的流......以及像2
这样的单例是否是一个元素流或某种神奇的标量值,它分布并且有时表现为无限流...类似于标量扩展在APL中的工作方式。
使用两个非平凡的流进行测试,显示了Icon使用的遍历顺序。最右边的流是最里面的循环,流可以遍历多次。
这也很好,因为这意味着我们不需要区分标量和单例流。
procedure main()
every write((1 | 2 | 3) * (2 | 0 | 0))
end
产生
% icon foo.icn
2
0
0
4
0
0
6
0
0
但是,我无法弄清楚如何编写一个同时遍历两个流的操作......你将如何实现等效的zipWith
?
以下是使用假设zipWith
函数的示例,其中*
作为字符串传入。 (我不确定Icon是否具有一流的功能)
procedure main()
every write(zipWith("*", (1 | 2 | 3), (2 | 0 | 0)))
end
哪会产生:
2
0
0