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 "

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top