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:
- Puede utilizar
(define (factorial n) [...])
como una forma abreviada de (define factorial (lambda (n) [...]))
.
- 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
.
No necesita comenzar en un cuerpo lambda. –
¡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
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