Schema: Perché c'è la necessità di utilizzare un cond qui?
-
21-09-2019 - |
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?
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;
}
}