Perché (f l) non è consentito e uguale a (applicare f l)?

1

In schema quando definito

(define f (lambda (a b c d) d))

(define l (list 'a 'b 'c 'd))

Perché non fa la destrutturazione degli argomenti? Voglio dire che gli argomenti dovrebbero valutare prima, perché la destrutturazione non fa parte di ciò?

(f . l)

Quali sono i motivi per cui questa espressione non è uguale al seguito?

(apply f l)
  • Modificato per renderlo più chiaro, in base ai suggerimenti nei commenti
posta stralep 03.09.2014 - 19:53
fonte

1 risposta

5

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.)

    
risposta data 04.09.2014 - 01:54
fonte

Leggi altre domande sui tag