Assegnare un elenco di atomi nello Schema
Domanda
Sto cercando di imparare Scheme dal libro "The Little Schemer" usando DrScheme su un Macintosh. Inizia con cose come " Qual è la macchina di l dove sono l'argomento (a b c)? & Quot;
Comprendo che la risposta a questa domanda è a, ma non sono in grado di capire cosa digitare nel Dr Scheme per "seguire". Una semplice idea su come assegnare a l come > (def l ('a' b 'c))
mi dà l'errore: " funzione chiamata: previsto un nome definito o un nome operazione primitiva dopo una parentesi aperta, ma ho trovato qualcos'altro "
Soluzione
Per definire qualcosa:
(define <name> <value>)
Quindi, per definire l:
(define l '(a b c))
Questo definisce l
come l'elenco (a b c)
. Il segno di virgoletta singola cita tutto ciò che lo segue, che si tratti di un simbolo o di un elenco, il che significa che non viene valutato ma letto così com'è. non , tuttavia, citi il ??nome sul quale lo stai impostando. Per fortuna, questa è una delle poche operazioni in Scheme in cui si riscontra questa incoerenza.
Altri suggerimenti
Prova questo:
(define l '(a b c))
Qui, la citazione si applica all'intero elenco (a b c)
.
Oppure usa semplicemente
(car '(a b c))
Ciò che l'errore ti dice è questo: quando il lettore vede un elenco, vuole trattare il primo elemento dell'elenco come una funzione. Ecco come funziona (+ 1 2 3)
: invoca la funzione +
. (Rigorosamente, guarda il simbolo '+
e scopre che esiste una funzione legata a quella, quindi invoca quella funzione.)
Quindi, quando si digita
(define l ('a 'b 'c))
guarda l'elenco interno e poi vuole trovare una funzione. Invece trova s ??il simbolo chiamato a
. Poiché non esiste una funzione, viene visualizzato l'errore. Se invece digiti
(define l '(a b c))
hai detto al lettore tramite la citazione che è di trattarlo come un elenco senza cercare di interpretarlo.
Ecco un esempio dello schema MIT su un Mac:
1 ]=> (define li '(a b c))
;Value: li
1 ]=> (car li)
;Value: a
1 ]=> (car '(a b c ))
;Value: a
Forma non abbreviata di
(define l '(a b c))
è
(define l (quote (a b c)))
o anche in questo caso:
(define l (list 'a 'b 'c))
senza un " list " parte tenta di eseguire 'a, ovviamente