O que acontece na cláusula um esquema de 'cond' quando o 'else' é omitido?
Pergunta
Eu estou no processo de aprender Scheme. Recentemente, passei (muito!) Tempo tentando encontrar um bug em um programa antes de eu percebi que estava faltando a palavra 'else' em uma cláusula cond. Mas o comportamento em tais circunstâncias, parece ser um pouco estranho. Experimentando com as condições com apenas um programa simples (abaixo) o 'tudo o que' é exibido como esperado na cláusula else, mas também é exibido, mas sem o 'else', é exibido com as cercam aspas eo un-interpretado nova linha impressa literalmente. Alguém pode me explicar o que está acontecendo? TIA.
(define (foo x)
(cond ((eq? x 0) (display "zero\n"))
(display "whatever\n")))
(define (bar x)
(cond ((eq? x 0 ) (display "zero\n"))
(else (display "whatever\n"))))
In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
>
Solução
"else" é apenas um sinônimo para "true". A forma de ler cond é como uma série de testes, onde o primeiro teste que é verdadeiras causas que forma a serem avaliadas.
(cond ( (test) (do this) )
( (test) (do this) ) )
Esta é a sua primeira
(cond ((eq? x 0) (display "zero\n"))
(display "whatever\n")))
aparência cond no (eq? x 0)
e determinou que é falso. A próxima cláusula é (display "whatever\n")
. Ele olha para display
, e desde display
não é nil
, é verdade. Em seguida, ele avalia a "whatever\n"
string, que simplesmente avalia a si mesmo. Portanto, o valor do cond é então "whatever\n"
.
Agora, aqui está você segunda:
(cond ((eq? x 0 ) (display "zero\n"))
(else (display "whatever\n"))))
Aqui, o primeiro teste é falsa, e ele vai para o segundo, que é else
e que avalia a verdade. (Se você pensar sobre isso, que é o que os meios "else" em um normal, if-then-else: "verdadeiro para todos os casos em que nenhum dos testes anteriores eram verdade")
Agora, a forma seguinte é (display "whatever\n")
. Isso é uma função que envia o argumento de cadeia para o console e retorna nada, porque isso é o que acontece exibição fazer. Em outro esquema, ele pode retornar seu valor de string, bem como imprimi-lo, caso em que você veria
whatever
"whatever\n"
Outras dicas
Na função foo
, a declaração cond
avalia display
como a condição de teste. Uma vez que não é realmente um símbolo chamado display
, é avaliada como verdadeira, então o "whatever\n"
é então avaliada como resultado de (foo 2)
.