[Ur] Set / Update values within a structure
Ziv Scully
zivscully at gmail.com
Sat Nov 11 12:22:50 EST 2017
The original question smells like a potential XY problem (
http://xyproblem.info/). What's the actual goal? There is probably a
functional pattern that solves the problem in a nicer way than the
imperative mutation of a callback function.
Nitin, if you specifically want to call a mutable Ur/Web callback from
JavaScript, it's probably easiest to pass values you need (sources,
callback functions, or anything else) through a custom JavaScript FFI
function (below called passToJs) that you call from inside main. You can
set global JavaScript variables or do whatever else from inside passToJs.
val main =
src <- source (fn () => return ());
return <xml>
<active code={passToJs (fn () => f <- get src; f ())}/>
(* XML that may mutate src *)
</xml>
But I still suspect that this isn't the best solution to whatever the real
problem is!
Ziv
On Fri, Nov 10, 2017 at 17:54 Nitin Surana <nsurana at usc.edu> wrote:
> Hi Adam
>
> I tried to create a sample from what I understand about your suggestion,
> but of course I got it wrong.
> Following is the code (which doesn't compile), which would demonstrate
> what I'm trying to do (look for 4 forward slashes ////)
>
> fun debugMe a =
> alert a;
> ////can't read from source n here, because it's defined within main(), below doesn't compile
> fnn <- get n;
> fnn()
>
>
>
> structure AB = Mymaths.Make(struct
> val callback = debugMe
> end)
>
> fun main()=
>
> n <- source Nil;
> lss <- source Nil;
>
>
> let
> fun callMe () =
> x <- AB.simple "test";
> debug x
>
> fun anotherCallback()
> //iterate over source lss and do something
>
> in
> //Some code to change the callback debugMe to anotherCallback() but what ?!
> set n anotherCallback ////this doesn't work
>
>
> return <xml>
> <body>
> <h1> Sample </h1>
> <button value="Click Me" onclick={fn _ => callMe()}></button>
> </body>
> </xml>
> end
>
> Thanks
>
>
> On Fri, Nov 10, 2017 at 1:45 PM, Adam Chlipala <adamc at csail.mit.edu>
> wrote:
>
>> You can register a callback that, when called, reads another callback out
>> of a [source] and calls it. Is that sufficient?
>> On 11/10/2017 04:19 PM, Nitin Surana wrote:
>>
>> Hi Adam
>>
>> Thanks for responding. Is there any alternative to change the callback ?
>> I want to trigger a urweb function defined within `let` block upon a
>> javascript event.
>> Since, the function is within `let` block (because it needs access to
>> certain variables within the parent function), I'm unable to use execF(...)
>> from javascript.
>>
>> Also, is `ref` not supported in urweb ?
>>
>> Thanks
>>
>> On Fri, Nov 10, 2017 at 4:48 AM, Adam Chlipala <adamc at csail.mit.edu>
>> wrote:
>>
>>> On 11/09/2017 10:42 PM, Harshita Kasera wrote:
>>>
>>> What I ultimately want to achieve is to be able to change the callback
>>> function *debugMe* at a later point of time. Is it possible to set or
>>> update values within a structure at a later point of time?
>>>
>>>
>>> No, module (structure) fields can't be modified at runtime in Ur/Web or
>>> ML. Therefore, the module system is not the right tool for runtime
>>> rewriting of callbacks.
>>>
>>
>>
>> _______________________________________________
>> Ur mailing list
>> Ur at impredicative.com
>>
>
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.impredicative.com_cgi-2Dbin_mailman_listinfo_ur&d=DwIGaQ&c=clK7kQUTWtAVEOVIgvi0NU5BOUHhpN0H8p7CSfnc_gI&r=fRXDP9LYNqdFgci7lxN2fw&m=4BPlw-ffwmldYJ_nUfPoCMcCEtXDUqFj73lIc-B35lQ&s=SdXCyX5EL_W3lxWpCwUlkH65djIEQvhG4MnsKPjypKE&e=
>>
>>
>
>
> --
> Regards
> Nitin Surana
> MS Computer Science
> 323-690-6529
>
> _______________________________________________
> Ur mailing list
> Ur at impredicative.com
> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20171111/096f674f/attachment.html>
More information about the Ur
mailing list