The easiest solution I found is to add this directive to test.urp:
monoInline 10
Short rationale: the compiler uses conservative program analysis to find
opportunities to get rid of first-class functions. Uses of the
[transaction] monad are compiled internally into first-class functions,
so we need to get rid of all their first-classness, as the compiler for
server-side code currently doesn't support functions at runtime. Extra
inlining can help reveal more structure to the program analysis, and it
did so in this case.
On 02/27/2017 11:22 AM, Artyom Shalkhakov wrote:
Hello all,
So I hit a road-block, the code:
> fun groups (): transaction page =
> m <- return ((Tregex.match'
> (concat (literal "a") (capture [#X] (literal "b"))) "ab")
> : option {Whole:counted_substring, Groups:{X:counted_substring}});
> case m of
> None => return <xml>Failed: mismatch!</xml>
> | Some {Whole = whole, Groups = {X = {Start=s,Len=l}}} => return
<xml>Success? Whole match: {[whole.Start]} + {[whole.Len]}, group is
{[s]} + {[l]}</xml>
Gives this error:
> .../test.ur:137:17: (to 139:7) Anonymous function remains at code
generation
> Function:
> (fn _ : {} =>
> (case UNBOUND_1 of
> None => write("Failed: mismatch!") |
> Some {Whole = whole, Groups = {X = {Start = s, Len = l}}} =>
> (write("Success? Whole match: ");
> (FFI(Basis.htmlifyInt_w(whole.Start));
> (write(" + ");
> (FFI(Basis.htmlifyInt_w(whole.Len));
> (write(", group is ");
> (FFI(Basis.htmlifyInt_w(s));
> (write(" + "); FFI(Basis.htmlifyInt_w(l)))))))))))
To reproduce, you'll have to build urweb-regex (I've put some
directions into README in my branch) and then do [cd tests && make all]
What can be done to avoid this issue? I tried to put type annotations,
didn't work.
2017-02-25 9:30 GMT+06:00 Artyom Shalkhakov
<[email protected] <mailto:[email protected]>>:
Hello all,
2017-02-23 21:55 GMT+06:00, Artyom Shalkhakov
<[email protected] <mailto:[email protected]>>:
> Hello Benjamin, Ziv,
>
> I wrote a very rough approximation to the idea that Ziv
proposed, here's
> the code (currently, it does not do much):
>
> https://github.com/ashalkhakov/urweb-regex/tree/typed-regex
<https://github.com/ashalkhakov/urweb-regex/tree/typed-regex>
>
> At first I was thinking that it would be better to introduce
named groups,
> but now I'm wondering how to handle positional groups, instead?
>
> Tangentially, I also noticed that JS does not handle capture
groups mixed
> with repetition, e.g.
>
> 'xabxabxab'.match(/(xab){3}/) // or with /(xab)*/
>
> gives: ["xabxabxab", "xab"] (would it be worth it to try to rule
out cases
> like this statically? probably not?)
>
I guess I figured it out. The idea is to keep track of index for every
group as well as the total count of groups in a regular expression.
Then, when constructing a capture:
> capture [#Name] E
the group indexes in E get incremented by 1, a new group is added:
{Name=0}, and the total count of groups is increased by 1.
Similarly, when concatenating two expressions in
> concat E1 E2
the group indexes in E2 will all get incremented by N, where N is the
count of groups of E1.
I think it should work.
>
> 2017-02-21 21:21 GMT+06:00 Benjamin Barenblat <[email protected]
<mailto:[email protected]>>:
>
>> On Mon, Feb 20, 2017 at 10:27 PM, Artyom Shalkhakov
>> <[email protected]
<mailto:[email protected]>> wrote:
>> > Thank you for the pointer. I guess creating a new package
that depends
>> > on
>> > urweb-regex is the way to go.
>>
>> I’m also happy to merge changes to urweb-regex. I think a
richly-typed
>> API like the one you’re looking for would be quite valuable in the
>> regex library.
>>
>> _______________________________________________
>> 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
>
--
Cheers,
Artyom Shalkhakov
--
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