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