我正在研究一种小语言,以获得乐趣并尝试一些想法。我试图实现的一个想法就是在shell中使用管道,但是使用任意对象。一个例子可能会使这更清楚。
函数range
和show_pipe
可以这样定义:
range(n) => {
x := 0;
while x < n do {
push x;
x := x + 1;
}
}
show_pipe() => {
while true do {
x := pull;
if x = FinishedPipe then {
return 0
} else {
print(x)
};
}
}
push
将一个值推送到管道的下一部分并暂停该函数,直到需要另一个值,pull
从管道中提取一个值并返回它或FinishedPipe
如果管道的前一部分已经完成执行。
然后,您可以将这两个函数与range(10) | show_pipe()
一起管道,这将在控制台上显示数字0到9。
我通过为管道的每个部分使用一个线程并使用线程安全队列从管道的一个部分传递值来实现这一点。我真的想找到一种不使用线程来实现管道的方法。我正在使用Rust,因此我无法使用协同程序。