[Ur] About clientOnly

Aistis Raulinaitis sheganinans at gmail.com
Sat Jul 15 21:15:32 EDT 2017


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 <adamc at csail.mit.edu> 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 <adamc at csail.mit.edu>
> 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 <
>> artyom.shalkhakov at gmail.com> wrote:
>>
>>> 2017-05-22 9:19 GMT+06:00 Aistis Raulinaitis <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 (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
>>> > <artyom.shalkhakov at gmail.com> wrote:
>>> >>
>>> >> 2017-05-22 6:22 GMT+06:00 Aistis Raulinaitis <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
>>> >> > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Cheers,
>>> >> Artyom Shalkhakov
>>> >>
>>> >> _______________________________________________
>>> >> Ur mailing list
>>> >> Ur at impredicative.com
>>> >> 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
>>> >
>>>
>>>
>>>
>>> --
>>> Cheers,
>>> Artyom Shalkhakov
>>>
>>> _______________________________________________
>>> Ur mailing list
>>> Ur at impredicative.com
>>> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>>
>>
>>
>>
>> _______________________________________________
>> Ur mailing listUr at impredicative.comhttp://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>
>>
>>
>> _______________________________________________
>> Ur mailing list
>> Ur at impredicative.com
>> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur
>>
>>
>
>
> _______________________________________________
> Ur mailing listUr at impredicative.comhttp://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/20170715/cd097785/attachment.html>


More information about the Ur mailing list