Схема консольной печати - PullRequest
       8

Схема консольной печати

17 голосов
/ 11 февраля 2012

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

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

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

1 Ответ

34 голосов
/ 11 февраля 2012

Печать в схеме работает, вызывая display (и, возможно, newline).Поскольку вы хотите вызывать его последовательно до / после чего-то еще (что в функциональном (или в случае со схемой, функционале) языке имеет смысл только для побочных эффектов вызываемых функций), вам обычно нужно использовать begin, который по очереди оценивает свои аргументы, а затем возвращает значение последнего подвыражения.Однако lambda неявно содержит такое begin -выражение.

Так что в вашем случае это будет выглядеть так:

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

Два замечания:

  1. Вы можете использовать (define (factorial n) [...]) в качестве сокращения для (define factorial (lambda (n) [...])).
  2. Способ, которым вы реализуете factorial, запрещает оптимизацию хвостового вызова , поэтому программа будет использовать совсем немногостекового пространства для больших значений n.Однако можно переписать его в оптимизируемую форму с помощью аккумулятора.

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

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

и затем переименуйте вашу функцию в inner-factorial.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...