O que acontece na cláusula um esquema de 'cond' quando o 'else' é omitido?

StackOverflow https://stackoverflow.com/questions/813587

  •  03-07-2019
  •  | 
  •  

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
> 
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top