A bunch of Scheme implementations define little-known syntax for partial application[0] that lets you put limits on how many arguments have to be provided at each application step. Using the article's add example:
it gets tedious with lots of single-argument cases like the above, but in cases where you know you're going be calling a function a lot with, say, the first three arguments always the same and the fourth varying, it can be cleaner than a function of three arguments that returns an anonymous lambda of one argument.
(define ((foo a b c) d)
(do-stuff))
(for-each (foo 1 2 3) '(x y z))
vs
(define (foo a b c)
(lambda (d) (do-stuff)))
(for-each (foo 1 2 3) '(x y z))
There's also a commonly supported placeholder syntax[1]:
(define inc (cut + 1 <>))
(inc 2) ; => 3
(define (foo a b c d) (do-stuff))
(for-each (cut foo 1 2 3 <>) '(x y z))
And assorted ways to define or adapt functions to make fully curried ones when desired. I like the "make it easy to do something complicated or esoteric when needed, but don't make it the default to avoid confusion" approach.
You and me both (though I'm also annoyed by the overuse of macros instead of inline functions and the woeful lack of docstrings and type declarations).
Macros instead of inline functions is just archaic, not necessarily non-idiomatic. I'm not sure when inline declarations were added, but even well after that point macros were more reliable for getting inlining.
Calendrica has been around for that long already? How time flies. Was also interesting to find an off-by-1 bug in final (if the condition doesn't hold for initial the result is smaller than initial instead of greater than or equal to it). Interesting little program to read, though.
reply