2012-02-11 10 views
11

Acabo de comenzar con Scheme. Estoy teniendo problemas con la impresión en la consola. Un simple ejemplo de la lista de impresión:Impresión de consola de esquema

(define factorial 
    (lambda (n) 
    (cond 
     ((= 0 n) 1) 
     (#t (* n (factorial (- n 1))))))) 

Quiero imprimir n, cada vez que la función se llama. Pensé que no puedo hacer eso dentro de la misma función. ¿Debo llamar a otra función para poder imprimir?

Respuesta

22

La impresión en Scheme funciona llamando al display (y posiblemente, newline). Como quiera llamarlo secuencialmente antes/después de otra cosa (que, en un lenguaje funcional (o en el caso de Scheme, funcional-ish) solo tiene sentido para los efectos secundarios de las funciones llamadas), normalmente debería usar begin, que evalúa sus argumentos por turno y luego devuelve el valor de la última subexpresión. Sin embargo, lambda contiene implícitamente una expresión de este tipo begin.

Así, en su caso, sería algo así:

(lambda (n) 
    (display n) (newline) 
    (cond [...])) 

Dos observaciones:

  1. Puede utilizar (define (factorial n) [...]) como una forma abreviada de (define factorial (lambda (n) [...])).
  2. La forma de implementar factorial prohíbe tail call-optimization, por lo tanto, el programa utilizará un poco de espacio de pila para valores mayores de n. Sin embargo, es posible reescribirlo en una forma optimizable usando un acumulador.

Si sólo desea imprimir n una vez, cuando el usuario llama a la función, que de hecho se necesita para escribir un envoltorio, así:

(define (factorial n) 
    (display n) (newline) 
    (inner-factorial n)) 

Y a continuación, cambiar el nombre de la función a inner-factorial.

+0

No necesita comenzar en un cuerpo lambda. –

+0

¡Oh, gracias! ¿Pero qué hay de la impresión después de la condición? No estoy trabajando en factorial en realidad, pero es más fácil explicarlo. Algo así como imprimir solo si la condición es verdadera, es decir, imprimir si n! = 0. – ercliou

+1

He arreglado la parte sobre 'begin'. El cuerpo de una cláusula 'cond' también puede contener expresiones múltiples, por lo que puede simplemente llamar' display' allí. – fnl

Cuestiones relacionadas