SRFI 232: An advanced currying form Arthur A. Gleckler (08 Jan 2022 02:21 UTC)
Re: SRFI 232: An advanced currying form Dr. Arne Babenhauserheide (08 Jan 2022 17:24 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (08 Jan 2022 18:26 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (09 Jan 2022 18:45 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (09 Jan 2022 21:56 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (13 Jan 2022 22:37 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (14 Jan 2022 07:24 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (18 Jan 2022 19:30 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (19 Jan 2022 00:44 UTC)
Re: SRFI 232: An advanced currying form John Cowan (16 Jan 2022 18:29 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (16 Jan 2022 18:52 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (16 Jan 2022 19:01 UTC)
Re: SRFI 232: An advanced currying form John Cowan (20 Jan 2022 06:21 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (18 Jan 2022 18:28 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (18 Jan 2022 18:38 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (18 Jan 2022 19:00 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (18 Jan 2022 21:22 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (18 Jan 2022 22:18 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (19 Jan 2022 07:47 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (19 Jan 2022 20:55 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (24 Jan 2022 23:08 UTC)
Re: SRFI 232: An advanced currying form Marc Nieper-Wißkirchen (26 Jan 2022 13:29 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (31 Jan 2022 21:42 UTC)
Re: SRFI 232: An advanced currying form Dr. Arne Babenhauserheide (09 Jan 2022 01:35 UTC)
Re: SRFI 232: An advanced currying form John Cowan (16 Jan 2022 18:15 UTC)
Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe (09 Jan 2022 18:47 UTC)

Re: SRFI 232: An advanced currying form Wolfgang Corcoran-Mathe 09 Jan 2022 18:45 UTC
Hi Marc, and thanks for commenting.

First of all, having read your thoughts, I suggest that we not throw
the baby out with the bath-water.  The current version of this form
is not fixed, of course, and I think we can improve it.

On 2022-01-08 19:26 +0100, Marc Nieper-Wißkirchen wrote:
> Guile's lambda* seems to come from SRFI 89's lambda*. I agree with
> Arne that a different name should be chosen for SRFI 232.

Yes.  As hinted in the Issues, I think lambda* is a pretty awful
name.  I'd like to hear some alternative suggestions.  Here
are a few off-the-cuff possibilities:

* lambda-c
* curry (unfortunately, used by lots of other similar macros)
* kappa (from 'Kurry')

As for the define sugar, how about define-curried ?

> (1) Do we really need to make this type of currying easier in Scheme?
> ...
> I would like to see a real-world use case where the
> proposed form actually makes the resulting code easier to understand
> (and to write).

I'm not sure I understand what you mean by "this type of currying".
Do you mean the way that lambda* allows procedures to be applied to
fewer or more arguments than they accept, as opposed to the "fixed"
currying of SRFI 219?

I agree that I'd like to see useful examples of lambda*, and I believe
that the sum/product example given in the SRFI is one, though it's
tiny.  In Haskell and other "curried languages", I very frequently
write partially-applied expressions like "foldr + 0" or "map (+ 1)";
this terseness and omitting of unneeded detail can dramatically
simplify programs, I think.  (You can do this with cut, but the
advantage of lambda* here is its extreme brevity and ordinary syntax.)

Whether this use is "real-world" is, of course, a matter of opinion.
(https://xkcd.com/1312/ applies.)  But I suggest that the "real world"
in programming is always a matter of opinion, so maybe we can find a
different criterion of significance.

> (2) My biggest complaint about the lambda* form is that the behavior
> is irregular. If I apply as many arguments as there are formals, it
> would make as much sense to return a thunk. The arbitrariness at such
> limit points is a source for future programming errors. Another
> discontinuity is at the border between returning a value and applying
> the excess arguments to the resulting values. While it looks elegant,
> the lambda* form confounds three things.

Am I understanding right that you think that lambda* is combining
several different features in a way that makes its behavior
unpredictable?  Can you identify the three things that you think
it's "confounding"?

I think that there is some oddness in the treatment of nullary
procedures and application to zero arguments, and the form may be
tricky to reason about overall: lambda* does a lot.  As for applying a
k-ary procedure to k arguments, I agree that it would make theoretical
sense to return a thunk, but, practically, there's no
question--applying the procedure makes far better sense to me.
Perhaps it's a contradiction of lambda*'s "zero arguments rule",
though.  Can we make some improvements here?

I think you meant "applying the resulting values to the excess
arguments" in the second to last sentence, but maybe I've
misunderstood.  While I wonder about possible problems that
the extra-arguments behavior might introduce, I don't see
any capriciousness here.  Regardless of whether a procedure is
invoked on extra arguments, it *does* return a value.  If there
are extra arguments, then this value is immediately invoked on
them.

> (3) We need benchmarks on whether replacing lambda by lambda* affects
> runtime (much) and whether calling the procedures resulting from
> partially applying lambda* are as fast as hand-written procedures (or
> those returned by SRFI 26).

I've attached a very basic set of benchmark tests which use
chibi's test library as a sloppy way to get execution times.  Each of
the following entails 100,000 applications of a procedure; "normal"
applies a 5-ary procedure, "hand-curried" applies a fully-curried
5-ary procedure, and the "lambda*" sets apply a 5-ary lambda*
procedure through an increasing number of partial applications.
See the attached file for details.

    normal: .
    1 out of 1 (100.0%) test passed in 0.015610933303833008 seconds.

    hand-curried: .
    1 out of 1 (100.0%) test passed in 0.09452295303344727 seconds.

    lambda* coarsest: .
    1 out of 1 (100.0%) test passed in 0.09674406051635742 seconds.

    lambda* coarse: .
    1 out of 1 (100.0%) test passed in 0.3158271312713623 seconds.

    lambda* fine: .
    1 out of 1 (100.0%) test passed in 0.728193998336792 seconds.

    lambda* finest: .
    1 out of 1 (100.0%) test passed in 0.9788308143615723 seconds.

These were executed on a machine with a 4.2 GHz x86_64 processor
and 8 GB RAM.  As usual with benchmarks, I advise not taking them
very seriously.

Best regards,

--
Wolfgang Corcoran-Mathe  <xxxxxx@sigwinch.xyz>

"As Will Rogers would have said, 'There is no such thing as a
free variable.'" --Alan J. Perlis