2009-06-03 11 views
6

I am learning Scheme. Cosa c'è di sbagliato con il codice qui sotto? Voglio scrivere un programma che prende la prima funzione dalla lista e poi la applica a un numero?Come si applica una funzione anonima da un elenco in schema?

(define num 3) 

    ;;I want to do something like this which returns 3 
    ((λ (x) x)num) 

    ;;but my functions are in a list so this should return3 
    ((first '((λ (x) x) (λ (x) (* x x)))) num) 

Im ottenendo questo errore per il codice di cui sopra:
applicazione procedura: procedura prevista, data: (λ (x) x); argomenti erano: 3

Che cosa significa quando ottengo questo tipo di output?

Quando non applico nulla, ottengo un risultato positivo.

(first '((λ(x) x)(λ(x) (*x x)))) 

rendimenti (λ (x) x)

risposta

11

Stai citando, con 'il lambda, in modo che non è in corso di valutazione.

Se ti basta inserire (λ (x) x) al prompt, DrScheme ti mostra #<procedure>, il che significa che ha effettivamente valutato il lambda e ti ha dato una chiusura. Citandolo, stai dando a Scheme solo una lista di simboli.

Se volete mettere le vostre funzioni in un elenco, si può fare:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num) 

La citazione consente di produrre una lista, sì, ma il cui contenuto non vengono valutati. La funzione list produce un elenco da tutti i suoi argomenti, dopo che sono stati valutati.

Si potrebbe anche quasiquote la lista, se ti piace:

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num) 
+0

Grazie. – unj2

2

Qual è la differenza tra queste espressioni?

> (procedure? (lambda (n) n)) 
#t 
> (procedure? (quote (lambda (n) n))) 
#f 
> (procedure? '(lambda (n) n)) 
#f 

Jay ha risposto per te ma non posso ancora mandarlo su di lui.

2

(lambda (x) x) non è una procedura. È una forma che valuta in una procedura. Le persone sono un po 'sciolte con la terminologia e spesso chiamano la forma lambda come una sorta di stenografia. "Ceci n'est pas une pipe."

+0

Vero, ma in definitiva inutile come spiegazione per i neofiti che sono confusi da tali problemi. Nota BTW da quel momento Racket ha cambiato il modo in cui stampa i valori, il che si traduce in un errore più chiaro: "...' procedura prevista, data: '(λ (x) x) '..." - la citazione è nuova. –

+1

Quando ero un principiante questa era esattamente la frase di cui avevo bisogno per chiarire la confusione, così l'ho scritta per aiutare gli altri. Forse è solo "in definitiva inutile" per tutti tranne me. – rptb1

+1

Il problema è che Scheme ha qualche (molto intenzionale!) Confusione tra codice e dati, 'x' e' 'x', la tua spiegazione è corretta (come ho detto) ma è un tipo simile di confusione al meta livello, dove 'x' è dati e" il valore associato a * x * "è il" codice ". Per molti studenti, questo tipo di dualità è molto confuso e per lo più non diventa completamente chiaro fino a quando non passano attraverso qualcosa come il valutatore meta-circolare. –

Problemi correlati