Il motivo principale è, (f . l)
può funzionare solo se l
è un identificatore (o qualche altro letterale atomico), e non se è un'espressione più complicata. Considera una funzione per calcolare la somma dei quadrati:
(define (sum-of-squares . nums)
(apply + (map square nums)))
Qui non puoi riscrivere (apply + (map square nums))
in (+ . (map square nums))
, perché è equivalente (in fase di lettura, molto prima che avvenga la valutazione) a (+ map square nums)
. E map
, square
e nums
non sono numeri. ; -)
Pertanto, le implementazioni hanno per fornire una procedura apply
. E una volta fatto, non c'è alcun reale punto a sostegno di una procedura punteggiata - l'espressione dell'applicazione che funziona solo una volta, quando apply
funziona sempre correttamente.
(Mille grazie a Brian Mastenbrook per avermelo spiegato anni fa, quando avevo una domanda simile anch'io.)