[Ur] About clientOnly
Adam Chlipala
adamc at csail.mit.edu
Mon May 22 07:42:13 EDT 2017
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
> 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/9c5cbe55/attachment.html>
More information about the Ur
mailing list