Ответ 1
Печать в Scheme работает, вызывая display
(и, возможно, newline
).
Поскольку вы хотите называть его последовательно до/после чего-то другого (что в функциональном (или в случае Scheme, функционально-ish) языке имеет смысл только для побочных эффектов вызываемых функций), вам обычно нужно использовать begin
, который по очереди вычисляет аргументы, а затем возвращает значение последнего подвыражения. Однако lambda
неявно содержит такое begin
-выражение.
Итак, в вашем случае это будет выглядеть так:
(lambda (n)
(display n) (newline)
(cond [...]))
Два замечания:
- Вы можете использовать
(define (factorial n) [...])
как сокращение для(define factorial (lambda (n) [...]))
. - Способ реализации
factorial
запрещает хвост-оптимизацию вызовов, поэтому программа будет использовать довольно много пространства стека для больших значений п. Однако переписывание его в оптимизированную форму с использованием аккумулятора возможно.
Если вы хотите только один раз печатать n
, когда пользователь вызывает эту функцию, вам действительно нужно написать обертку, например:
(define (factorial n)
(display n) (newline)
(inner-factorial n))
И затем переименуйте свою функцию в inner-factorial
.