
On Thu, Jun 22, 2006 at 01:24:32PM +0200, Jerzy Karczmarczuk wrote:
I believe that ways of producing intricate streams by such languages or Lustre are somehow based on continuation mechanisms. The paper on Esterel, etc. : ftp://ftp-sop.inria.fr/esterel/pub/papers/foundations.pdf
gives you an example in Lustre X[n+1] = U[n+1]*sin(X[n] + S[n+1]-S[n]) S[n+1] = cos(S[n]+U[n+1]
in a form remarkably analogous as I did:
node Control(U:float) returns X:float var S:float let X = 0.0 -> (U*sin(pre(X)+S-pre(S)); S = 1.0 -> cos(pre(S)+U); tel
For comparison, here's a version using arrows (except that the U stream is shifted forward, so its first value is used): class ArrowLoop a => ArrowCircuit a where delay :: b -> a b b control :: ArrowCircuit a => a Float Float control = proc u -> do rec let x' = u * sin (x + s' - s) s' = cos (s * u) x <- delay 0 -< x' s <- delay 1 -< s' returnA -< x One can plug in various implementations of ArrowCircuit. For stream processors, delay is just cons, and the computation is equivalent to the infinite list version. Another implementation uses continuations.