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