[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