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 <[email protected] <mailto:[email protected]>> 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
    <[email protected]
    <mailto:[email protected]>> wrote:

        2017-05-22 9:19 GMT+06:00 Aistis Raulinaitis
        <[email protected] <mailto:[email protected]>>:
        > 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
        > <[email protected]
        <mailto:[email protected]>> wrote:
        >>
        >> 2017-05-22 6:22 GMT+06:00 Aistis Raulinaitis
        <[email protected] <mailto:[email protected]>>:
        >> > 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
        >> > [email protected] <mailto:[email protected]>
        >> > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
        <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
        >> >
        >>
        >>
        >>
        >> --
        >> Cheers,
        >> Artyom Shalkhakov
        >>
        >> _______________________________________________
        >> Ur mailing list
        >> [email protected] <mailto:[email protected]>
        >> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
        <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
        >
        >
        >
        > _______________________________________________
        > Ur mailing list
        > [email protected] <mailto:[email protected]>
        > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
        <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>
        >



        --
        Cheers,
        Artyom Shalkhakov

        _______________________________________________
        Ur mailing list
        [email protected] <mailto:[email protected]>
        http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
        <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>




    _______________________________________________
    Ur mailing list
    [email protected] <mailto:[email protected]>
    http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
    <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>



    _______________________________________________
    Ur mailing list
    [email protected] <mailto:[email protected]>
    http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
    <http://www.impredicative.com/cgi-bin/mailman/listinfo/ur>




_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to