The main reason is, (f . l)
can only work if l
is an identifier (or some other atomic literal), and not if it's a more complicated expression. Consider a function for calculating the sum-of-squares:
(define (sum-of-squares . nums)
(apply + (map square nums)))
Here, you cannot rewrite the (apply + (map square nums))
into (+ . (map square nums))
, because that is equivalent (at read-time, way before evaluation happens) to (+ map square nums)
. And map
, square
, and nums
are not numbers. ;-)
Therefore, implementations have to supply an apply
procedure. And once you do, there's no real point to supporting a dotted procedure-application expression that only works some of the time, when apply
works correctly all the time.
(Many thanks to Brian Mastenbrook for explaining this to me years ago, back when I had a similar question myself.)