[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