我一直在學習關於continuation passing style,特別是在javascript中實現的asynchronous version,其中一個函數將另一個函數作爲最終參數,並創建一個異步調用,並將返回值傳遞給第二個函數。延續傳球與管道有何不同?
不過,我不能完全看到延續傳遞如何做任何事情超過重新管道(如UNIX命令行管道)或流:
replace('somestring','somepattern', filter(str, console.log));
VS
echo 'somestring' | replace 'somepattern' | filter | console.log
除將管道很多,更乾淨。對於管道系統,似乎很明顯,數據被傳遞,同時執行被傳遞給接收程序。事實上,對於管道系統,我希望數據流能夠繼續傳遞到管道中,而在CPS中,我期望有一個串行過程。
也許可以想象,如果將通信對象和更新方法與數據一起傳遞,而不是完整的切換和返回,CPS可以擴展爲連續管道。
我錯過了什麼嗎? CPS在一些重要的方面不同(更好?)?
要說清楚,我的意思是continuation-passing,其中一個函數將執行傳遞給另一個函數,而不僅僅是簡單的回調。 CPS似乎暗示將函數的返回值傳遞給另一個函數,然後退出。
在異步點上:我正在考慮的實現是當回調作爲異步setTimeout調用進行時,而不是同步直接函數調用。我並不是指無序。在javascript中,要做CPS,你不可避免地必須傳遞迴調,除非產量被認爲是CPS。另外,我想說的是,當CPS完成尾部呼叫時,這兩件事在概念上是等價的。 – 2012-04-16 14:13:20
「尾部呼叫」的結果可能影響封閉函數的結果存在顯着差異。管道不是這種情況。在管道中,result()中發生了什麼會影響filter()中發生的情況,但這仍然不包含CPS的可能性,其中replace會確定過濾器的作用,但過濾器也可能影響結果的作用。排序/比較就是一個例子。可能CPS不適合用來完成某些可以用程序管道x = f1()完成的工作。 X = F2(x)的。或者:使用「function(str){return'red'}」作爲第二個參數來替換。 – delicateLatticeworkFever 2012-04-16 14:52:30
查看它的另一種方法,pipe與CPS:x = f1(f2())複製管道,如果它表示f2()的*返回值*是arg到f1()。但那不是CPS。 – delicateLatticeworkFever 2012-04-16 15:00:20