Domanda

Ho provato a scrivere un (semplice, cioè senza eqan?) funzione one? come tali:

(define one?
  (lambda (n)
    ((= 1 n))))

Ma quanto sopra non funziona, però, perché quando lo chiamo io, come ad esempio:

(one? 1)

vengo salutato con questo errore:

procedure application: expected procedure, given: #t (no arguments)

Il modo corretto (da The Little Schemer ) per scrivere è:

(define one?
  (lambda (n)
    (cond
      (else (= 1 n)))))

Perché c'è la necessità di utilizzare un cond con una clausola else, invece di (= 1 n) solo tornare?

È stato utile?

Soluzione

Non c'è alcuna ragione per cui si vorrebbe fare. Vado a controllare la mia copia di TLS quando torno a casa per vedere se riesco a indovinare quello che sta succedendo, ma non manca nulla fondamentale sulla cond o niente.

Risposta alla nota di cui sopra: Non funziona perché si ha un ulteriore set di parentesi nel corpo del lambda. Dovrebbe essere

(lambda (n) (= 1 n))

Le parentesi extra in vostra versione significa che invece di restituire il valore o #t #f, si sta cercando di chiamare tale valore come una funzione senza argomenti.

Altri suggerimenti

non avere una copia di The Little Schemer a portata di mano, il tuo esempio sembra che dovrebbe funzionare. Credo che il cond è estraneo. In psudeo-C l'equivant (con cond) è:

int
one(int n)
{     
    switch (foo) {
        default:
           return  1 == n;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top