Esquema: Por que há a necessidade de usar um cond aqui?
-
21-09-2019 - |
Pergunta
Eu tentei escrever um (simples, ou seja, sem eqan?
) one?
função assim:
(define one?
(lambda (n)
((= 1 n))))
Mas o exposto acima não funciona, porque quando eu chamo assim:
(one? 1)
Eu sou recebido com este erro:
procedure application: expected procedure, given: #t (no arguments)
A maneira correta (de O pequeno esquema) para escrever é:
(define one?
(lambda (n)
(cond
(else (= 1 n)))))
Por que há necessidade de usar um cond
com um else
cláusula, em vez de apenas retornar (= 1 n)
?
Solução
Não há motivo para que você queira fazer isso. Vou verificar minha cópia do TLS quando chegar em casa para ver se consigo divino o que está acontecendo, mas você não está perdendo nada fundamental sobre cond
ou nada.
Resposta à sua nota acima: não está funcionando porque você tem um conjunto extra de parênteses no corpo do lambda. Deveria ser
(lambda (n) (= 1 n))
Os parênteses extras em sua versão significam que, em vez de retornar o valor #t
ou #f
, você está tentando chamar esse valor como uma função sem argumentos.
Outras dicas
não ter uma cópia de O pequeno esquema Handy, seu exemplo parece que deve funcionar. Eu acho que o cond
é estranho. Em Psudeo-C, o equivalente (com cond) é:
int
one(int n)
{
switch (foo) {
default:
return 1 == n;
}
}