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