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) ?

Foi útil?

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;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top