Консоль печати схемы

Только что началось с Схемы. У меня проблема с печатью на консоли. Пример простого примера печати:

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

Я хочу печатать n, каждый раз, когда вызывается функция. Я понял, что не могу сделать это в рамках одной и той же функции? Мне нужно вызвать другую функцию, чтобы я мог печатать?

Ответ 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.