[Ur] About clientOnly

Aistis Raulinaitis sheganinans at gmail.com
Mon May 22 13:53:20 EDT 2017


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> 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> wrote:
>
>> 2017-05-22 9:19 GMT+06:00 Aistis Raulinaitis <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 (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 (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> wrote:
>> >>
>> >> 2017-05-22 6:22 GMT+06:00 Aistis Raulinaitis <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
>> >> > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>> >> >
>> >>
>> >>
>> >>
>> >> --
>> >> Cheers,
>> >> Artyom Shalkhakov
>> >>
>> >> _______________________________________________
>> >> Ur mailing list
>> >> Ur at impredicative.com
>> >> 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
>> >
>>
>>
>>
>> --
>> Cheers,
>> Artyom Shalkhakov
>>
>> _______________________________________________
>> Ur mailing list
>> Ur at impredicative.com
>> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>
>
>
>
> _______________________________________________
> Ur mailing listUr at impredicative.comhttp://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/20170522/7e11185c/attachment.html>


More information about the Ur mailing list