Yes, Artyom helped me figure out that Ur/Web expects polymorphic FFI functions to be curried with an additional unit function argument, I was able to fully implement the JS Map() library. https://github.com/sheganinans/js_map
I also plan on implementing a JS Array() library. So given this and as you said I should make sure not to rely on the details of the Ur/Web internal representation. That seems like an opportunity for a JS library, to abstract away some of the details of marshaling between Ur/Web representations and JS types. So that any JS library can easily work with Ur/Web types and the details are hidden away in the library. On Wed, Jul 12, 2017 at 12:14 PM, Adam Chlipala <[email protected]> wrote: > 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]> > 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 > [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
