Alternative Curry Syntax¶
Warning
This is an experimental extension. It is not well specified and may change or disappear in the future. This documentation is largely in the format of a DEP in case we want to propose it in the future.
Abstract¶
An alternative syntax for currying functions has been provided within Open Dylan.
Copyright¶
This document is public domain.
Specification¶
Functions called with an “omitted” or placeholder parameter return
a curried function as if curry
and rcurry
had been
used.
There may be multiple placeholder parameters and they can be in any parameter position. A curried function that has 2 placeholder parameters will need 2 parameters when called.
This can be used with operators as well.
Motivation¶
There are situations in which using curry
and rcurry
can result in confusing code that is difficult to understand at
a quick glance. The alternative syntax provides an easy to understand
way to set up a curried function.
Rationale¶
The alternative curry syntax was implemented in 1999 by Keith Playford and has been in the compiler since then. It does not break any existing code.
Examples¶
In this example, the two curried functions will have the same result:
let to-string-1 = curry(as, <byte-string>);
let to-string-2 = as(<byte-string>, _);
As indicated earlier, multiple arguments being omitted is supported:
define function adder(a, b, c)
a + b + c
end;
let a = adder(_, 2, _);
let r = a(1, 3); // r == 6
Placeholder arguments can be used with operators as well:
let incr = _ + 1;
let double = _ * 2;
These can be used inline with functions that take functions as arguments:
format-out("%=", map(_ + 1, #(1, 2, 3, 4));
Taking some examples from the Open Dylan compiler, some simplifications are possible:
map(method (o) print-condition(o, #t) end, o.subnotes)
let outer-values
= map(method (variable :: <string>)
jam-variable(jam, variable, default: #f)
end,
variables);
could be rewritten as:
map(print-condition(_, #t), o.subnotes)
let outer-values = map(jam-variable(jam, _, default: #f), variables);
Backwards Compatibility¶
There are no backwards compatibility considerations for this functionality
as the _
is not a valid variable name in the language as specified by
the DRM.
Reference Implementation¶
This functionality has been present within Open Dylan since 1999. The code
is largely focused in these methods in dfmc/conversion/convert.dylan
:
curried-arguments?
convert-curried-function-call