[Ur] About clientOnly

Adam Chlipala adamc at csail.mit.edu
Wed Jul 12 15:14:30 EDT 2017


Yes, JavaScript functions are not valid as functions within Ur/Web's 
runtime representations.  The details are intentionally undocumented, 
but perhaps I should add more of a disclaimer not to rely on the 
details.  (I hope I've understood your issue report well enough to 
isolate the problem.)

On 05/22/2017 01:53 PM, Aistis Raulinaitis wrote:
> Ah, so is this now why I'm getting this error?: TypeError: fr.f is not 
> a function
>
> Here's some screenshots of the code in the inspector: 
> http://imgur.com/a/FBm3R
>
> The code in question looks like this:
>
> function new_map_with (init) {
>     var acc = new Map ();
>     var curr = init;
>     while (curr._2 != null) {
>         acc.set (curr._1._1, curr._1._2);
>         curr = curr._2;}
>     //curr._1._1 contains the last elem when curr._1._2 === null.
>     acc.set (curr._1._1, curr._1._2);
>     return acc;}
>
> I am attempting to pass back the Map from JS back to Ur, and it seems 
> that fr.f at runtime will hold new_map_with at first, then after it 
> executes it then holds the Map I generates. At that point line 1991 
> gets called e = {c: "c", v: fr.f(v)}; and I get that error, since fr.f 
> now holds Map {...} and Map isn't a function..
>
> On Mon, May 22, 2017 at 4:42 AM, Adam Chlipala <adamc at csail.mit.edu 
> <mailto:adamc at csail.mit.edu>> wrote:
>
>     I can confirm that non-primitive/abstract types are not meant to
>     cross the FFI boundary.
>
>
>     On 05/21/2017 11:31 PM, Aistis Raulinaitis wrote:
>>     Thanks!
>>
>>     On Sun, May 21, 2017 at 8:27 PM, Artyom Shalkhakov
>>     <artyom.shalkhakov at gmail.com
>>     <mailto:artyom.shalkhakov at gmail.com>> wrote:
>>
>>         2017-05-22 9:19 GMT+06:00 Aistis Raulinaitis
>>         <sheganinans at gmail.com <mailto:sheganinans at gmail.com>>:
>>         > Hmm, that makes sense. Do you have an example of FFI with
>>         an abstract type?
>>         > I tried to encapsulate the map type with a con, but
>>         obviously that does not
>>         > work..
>>         >
>>
>>         Sure, here are two examples:
>>
>>         https://github.com/bbarenblat/urweb-regex
>>         <https://github.com/bbarenblat/urweb-regex> (in particular,
>>         take a look
>>         at regex__FFI.urs and the two types [substring_t] and
>>         [substring_list_t])
>>         https://github.com/ashalkhakov/urweb-storage
>>         <https://github.com/ashalkhakov/urweb-storage> (shameless
>>         plug; in
>>         particular, take a look at storage__FFI.urs and the type
>>         [storage])
>>
>>         > On Sun, May 21, 2017 at 8:10 PM, Artyom Shalkhakov
>>         > <artyom.shalkhakov at gmail.com
>>         <mailto:artyom.shalkhakov at gmail.com>> wrote:
>>         >>
>>         >> 2017-05-22 6:22 GMT+06:00 Aistis Raulinaitis
>>         <sheganinans at gmail.com <mailto:sheganinans at gmail.com>>:
>>         >> > So I am working with the JS FFI, however it seems that
>>         the clientOnly
>>         >> > directive is being ignored.
>>         >> >
>>         >> > Here is the example code:
>>         >> >
>>         >> > ~~~
>>         >> > main.urp:
>>         >> > ~~~
>>         >> >
>>         >> > ffi js_map
>>         >> > jsFunc Js_map.new_map=new_map
>>         >> > jsFunc Js_map.new_map_with=new_map_with
>>         >> > clientOnly Js_map.new_map
>>         >> > clientOnly Js_map.new_map_with
>>         >> > benignEffectful Js_map.new_map
>>         >> > benignEffectful Js_map.new_map_with
>>         >> > jsFile js_map.js
>>         >> >
>>         >> > main
>>         >> >
>>         >> >
>>         >> > ~~~
>>         >> > main.urs:
>>         >> > ~~~
>>         >> >
>>         >> > val main : unit -> transaction page
>>         >> >
>>         >> >
>>         >> > ~~~
>>         >> > main.ur:
>>         >> > ~~~
>>         >> >
>>         >> > fun main () =
>>         >> >     c <- Js_map.new_map_with ((1, 2)::[]);
>>         >> >     return <xml></xml>
>>         >> >
>>         >> >
>>         >> > ~~~
>>         >> > js_map.urs:
>>         >> > ~~~
>>         >> >
>>         >> > con js_map :: Type -> Type -> Type
>>         >> >
>>         >> > val new_map      : k ::: Type -> v ::: Type -> unit ->
>>         transaction
>>         >> > (js_map k
>>         >> > v)
>>         >> > val new_map_with : k ::: Type -> v ::: Type -> list (k *
>>         v) ->
>>         >> > transaction
>>         >> > (js_map k v)
>>         >> >
>>         >> >
>>         >> > ~~~
>>         >> > js_map.js:
>>         >> > ~~~
>>         >> >
>>         >> > function new_map () {return new Map ();}
>>         >> >
>>         >> > function new_map_with (arg) {return new Map (arg); }
>>         >> >
>>         >> >
>>         >> > ~~~
>>         >> > So in main.ur, you can see that I am calling this Js
>>         code in a C
>>         >> > context,
>>         >> > instead of getting an error complaining about how it
>>         should be called on
>>         >> > the
>>         >> > client, instead I get this confusing error:
>>         >> >
>>         >> > urweb main
>>         >> > /Users/ace/src/cli_only/js_map.urs:4:75: (to 4:87)
>>         Unsupported type
>>         >> > constructor
>>         >> > Constructor: FFI(Js_map.js_map_with) FFI(Basis.int)
>>         FFI(Basis.int)
>>         >> >
>>         /usr/local/Cellar/urweb/20170105/lib/urweb/ur/basis.urs:127:23:
>>         (to
>>         >> > 127:25)
>>         >> > Unsupported type constructor
>>         >> > Constructor: FFI(Js_map.js_map_with) FFI(Basis.int)
>>         FFI(Basis.int)
>>         >> > make: *** [all] Error 1
>>         >> >
>>         >>
>>         >> I got the impression that Ur/Web being a whole-program
>>         optimizing
>>         >> compiler, the only types being supported for marshalling
>>         between FFI
>>         >> code and non-FFI code are primitive types and abstract
>>         types. I think
>>         >> I asked this same question some time ago.
>>         >>
>>         >> So it looks like you will have to work around this somehow.
>>         >>
>>         >> >
>>         >> >
>>         >> > _______________________________________________
>>         >> > Ur mailing list
>>         >> > Ur at impredicative.com <mailto:Ur at impredicative.com>
>>         >> > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>         <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>>         >> >
>>         >>
>>         >>
>>         >>
>>         >> --
>>         >> Cheers,
>>         >> Artyom Shalkhakov
>>         >>
>>         >> _______________________________________________
>>         >> Ur mailing list
>>         >> Ur at impredicative.com <mailto:Ur at impredicative.com>
>>         >> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>         <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>>         >
>>         >
>>         >
>>         > _______________________________________________
>>         > Ur mailing list
>>         > Ur at impredicative.com <mailto:Ur at impredicative.com>
>>         > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>         <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>>         >
>>
>>
>>
>>         --
>>         Cheers,
>>         Artyom Shalkhakov
>>
>>         _______________________________________________
>>         Ur mailing list
>>         Ur at impredicative.com <mailto:Ur at impredicative.com>
>>         http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>         <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>>
>>
>>
>>
>>     _______________________________________________
>>     Ur mailing list
>>     Ur at impredicative.com <mailto:Ur at impredicative.com>
>>     http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>     <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>
>
>
>     _______________________________________________
>     Ur mailing list
>     Ur at impredicative.com <mailto:Ur at impredicative.com>
>     http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>     <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
>
>
>
>
> _______________________________________________
> 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/20170712/0f4db3a0/attachment.html>


More information about the Ur mailing list