方案控制台打印

时间:2012-02-11 02:20:48

标签: printing scheme

刚开始使用Scheme。我在控制台上打印有问题。 一个简单的列表打印示例:

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

我想在每次调用函数时打印n。我想我不能在同一个功能中做到这一点?我是否需要调用另一个函数才能打印?

1 个答案:

答案 0 :(得分:33)

通过调用display(可能还有newline)在Scheme中打印。 因为你想在其他东西之前/之后顺序地调用它(在函数中(或者在Scheme,functional-ish的情况下)语言只对被调用的函数副作用有意义),你通常需要使用{ {1}},依次计算其参数,然后返回最后一个子表达式的值。但是,begin隐式包含此类lambda - 表达式。

所以在你的情况下,它会是这样的:

begin

两个评论:

  1. 您可以使用 (lambda (n) (display n) (newline) (cond [...])) 作为(define (factorial n) [...])
  2. 的简写
  3. 实现(define factorial (lambda (n) [...]))禁止tail call-optimization的方式,因此程序将使用相当多的堆栈空间来获得更大的n值。不过,可以使用累加器将其重写为可优化的形式。
  4. 如果您只想打印factorial一次,当用户调用该函数时,您确实需要编写一个包装器,如下所示:

    n

    然后将您的函数重命名为 (define (factorial n) (display n) (newline) (inner-factorial n))