May now partially apply partial applications
parent
8ba1f04147
commit
a02865d8b1
|
@ -39,21 +39,33 @@
|
||||||
the dynamic function calls will handle currying/partial application
|
the dynamic function calls will handle currying/partial application
|
||||||
for you, which has a much more inviting syntax.
|
for you, which has a much more inviting syntax.
|
||||||
|
|
||||||
TODO: Accept partial application as FNREF.
|
Partially applied functions may continue to be partially applied
|
||||||
|
until their parameters are exhausted. This can be used to implement
|
||||||
|
currying.
|
||||||
-->
|
-->
|
||||||
<function name="f:partial">
|
<function name="f:partial">
|
||||||
<param name="fnref" as="element(f:ref)" />
|
<param name="fnref" as="item()+" />
|
||||||
<param name="args" as="item()*" />
|
<param name="args" as="item()*" />
|
||||||
|
|
||||||
|
<!-- perform type check here, not above, since we can be passed a
|
||||||
|
sequence (e.g.a partially applied function) -->
|
||||||
|
<variable name="ref"
|
||||||
|
as="element(f:ref)"
|
||||||
|
select="$fnref[ 1 ]" />
|
||||||
|
|
||||||
<f:ref>
|
<f:ref>
|
||||||
<sequence select="$fnref/@*" />
|
<sequence select="$ref/@*" />
|
||||||
|
|
||||||
<attribute name="partial"
|
<attribute name="partial"
|
||||||
select="count( $args )" />
|
select="count( $args )" />
|
||||||
|
|
||||||
<sequence select="$fnref/*" />
|
<sequence select="$ref/*" />
|
||||||
</f:ref>
|
</f:ref>
|
||||||
|
|
||||||
|
<!-- include any previously applied arguments (if we're partially
|
||||||
|
applying a partial application) -->
|
||||||
|
<sequence select="remove( $fnref, 1 )" />
|
||||||
|
|
||||||
<!-- nested sequences are implicitly flattened, so we're not
|
<!-- nested sequences are implicitly flattened, so we're not
|
||||||
returning a sub-sequence here -->
|
returning a sub-sequence here -->
|
||||||
<sequence select="$args" />
|
<sequence select="$args" />
|
||||||
|
|
|
@ -94,6 +94,27 @@
|
||||||
<expect label="returns all arguments"
|
<expect label="returns all arguments"
|
||||||
test="count( $x:result ) = 4" />
|
test="count( $x:result ) = 4" />
|
||||||
</scenario>
|
</scenario>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- partial applications should behave as their own functions -->
|
||||||
|
<scenario label="partially applying partial application">
|
||||||
|
<call function="f:partial">
|
||||||
|
<param name="fnref" select="f:partial( $fnref, (1, 2) )" />
|
||||||
|
<param name="args" select="3" />
|
||||||
|
</call>
|
||||||
|
|
||||||
|
<expect label="returns FNREF as first item in sequence"
|
||||||
|
test="$x:result[ 1 ] = $fnref" />
|
||||||
|
|
||||||
|
<expect label="returns arguments from both partial applications"
|
||||||
|
test="count( $x:result ) = 4" />
|
||||||
|
|
||||||
|
<expect label="arguments are ordered with previous applications
|
||||||
|
first in sequence"
|
||||||
|
test="$x:result[ 2 ] = 1
|
||||||
|
and $x:result[ 3 ] = 2
|
||||||
|
and $x:result[ 4 ] = 3" />
|
||||||
|
</scenario>
|
||||||
</scenario>
|
</scenario>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 3dc0ab2e1b78dae5d31c228c22a7dd8868d5678f
|
Subproject commit 20c6b8a32f37a6511698fe89b78b82fd1aa64bd2
|
Loading…
Reference in New Issue