From: Satoshi Ogasawara <ogasawara@itpl.co.jp>
To: daniel.buenzli@erratique.ch
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] [ANN] PEC ver. 1.1
Date: Thu, 19 Apr 2012 02:39:00 +0900 [thread overview]
Message-ID: <4F8EFC34.7080906@itpl.co.jp> (raw)
In-Reply-To: <2B372C89CE4F408688B67B090FA5105C@erratique.ch>
First of all, I apologize about my first message. Now I understand React can be
easily adapted to send a value during update cycle by using thunk. To forbid
sending events during update cycle in React is not restriction but design choice.
(2012/04/18 22:27), Daniel Bünzli wrote:
> and now what should the value of e be in the next update cycle ? All the options you
have (keep only the first call to sender, keep only the last call to sender, keep both and
execute one after the other) break the functional and compositional nature of FRP because
it violates the semantics of events.
PEC takes the third option. I understand that the evaluation order of update
are problematic.
module E = Pec.Event.Make (Pec.EventQueue.DefaultQueueM) (Pec.EventQueue.DefaultQueueI)
open Printf
let _ =
let e, sender = E.make () in
let e' = E.map (fun x -> sender 2; x + 1) e in
let e'' = E.map (fun x -> sender 3; x + 1) e in
let _ = E.subscribe (printf "e=%d\n") e in
let _ = E.subscribe (printf "e'=%d\n") e' in
let _ = E.subscribe (printf "e''=%d\n") e'' in
sender 1;
ignore (E.run ());
printf "---\n";
ignore (E.run ());
printf "---\n";
ignore (E.run ());
printf "end\n"
This program outputs:
e=1
e'=2
e''=2
---
e=2
e'=3
e''=3
---
e=3
e'=4
e''=4
end
This result rely on order of applying subscribe function. I think any program
depending on the evaluation order of updates are not good one.
But I'm not sure why only sending a value to event breaks functional and compos-
itional nature of FRP. I think all side-effects during update cycle are breaks
functional and compositional nature of FRP too, because the results of both programs
are depends on evaluation order of updates.
A:
let e' = E.map (fun x -> sender 1; x + 1) e in
let e'' = E.map (fun x -> sender 2; x + 1) e in
B:
let e' = E.map (fun x -> print_int 1; x + 1) e in
let e'' = E.map (fun x -> print_int 2; x + 1) e in
Are there any special problem in program A? In other word, program B keeps
functional and compositional nature of FRP?
>> Yes, weak-pointer-less implementation is one of my purpose. The key point is
>> that dependency of events are represented by nested variants.
>
> That doesn't really answer my question (or at least I don't understand what it means).
Inside PEC, "let e' = E.map f e" is just variant instance.
let map f e = Wrap {
event = e;
wrap = f;
w_latest = None;
}
Another primitive combinator functions also just makes a variant instance.
and 'a event =
| Cell : 'a mcell -> 'a event
| Wrap : ('a, 'b) mwrap -> 'b event
| Choose : 'a choose -> 'a event
| Never : 'a event
| Switch : 'a mswitch -> 'a event
So an event value itself is a nested variant instance which can be GCed freely
when user-level references are disappear. (There are no library level reference.)
When an event is subscribed, the argument function are set in source events of
subscribed event. This means subscribed events are never GCed until source events
are GCed.(or until unsubscribe.)
If one of source events are fired, dependent events marked with subscribe functions
are updated. Weak pointer does not needs in that algorithm.
Best Regards,
Ogasawara
next prev parent reply other threads:[~2012-04-18 17:39 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-17 16:40 Satoshi Ogasawara
2012-04-17 17:52 ` Adrien
2012-04-17 18:50 ` Satoshi Ogasawara
2012-04-17 19:23 ` Daniel Bünzli
2012-04-18 1:59 ` Satoshi Ogasawara
2012-04-18 7:36 ` Daniel Bünzli
2012-04-18 11:44 ` Satoshi Ogasawara
2012-04-18 13:27 ` Daniel Bünzli
2012-04-18 17:39 ` Satoshi Ogasawara [this message]
2012-04-18 22:32 ` Daniel Bünzli
2012-04-19 8:59 ` Satoshi Ogasawara
2012-04-19 10:31 ` Daniel Bünzli
2012-04-19 10:57 ` Daniel Bünzli
2012-04-19 13:31 ` Satoshi Ogasawara
2012-04-19 13:02 ` Satoshi Ogasawara
2012-04-19 14:09 ` Daniel Bünzli
2012-04-20 9:24 ` Satoshi Ogasawara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F8EFC34.7080906@itpl.co.jp \
--to=ogasawara@itpl.co.jp \
--cc=caml-list@inria.fr \
--cc=daniel.buenzli@erratique.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).