刚开始使用Scheme。我在控制台上打印有问题。 一个简单的列表打印示例:
(define factorial
(lambda (n)
(cond
((= 0 n) 1)
(#t (* n (factorial (- n 1)))))))
我想在每次调用函数时打印n
。我想我不能在同一个功能中做到这一点?我是否需要调用另一个函数才能打印?
答案 0 :(得分:33)
通过调用display
(可能还有newline
)在Scheme中打印。
因为你想在其他东西之前/之后顺序地调用它(在函数中(或者在Scheme,functional-ish的情况下)语言只对被调用的函数副作用有意义),你通常需要使用{ {1}},依次计算其参数,然后返回最后一个子表达式的值。但是,begin
隐式包含此类lambda
- 表达式。
所以在你的情况下,它会是这样的:
begin
两个评论:
(lambda (n)
(display n) (newline)
(cond [...]))
作为(define (factorial n) [...])
。(define factorial (lambda (n) [...]))
禁止tail call-optimization的方式,因此程序将使用相当多的堆栈空间来获得更大的n值。不过,可以使用累加器将其重写为可优化的形式。如果您只想打印factorial
一次,当用户调用该函数时,您确实需要编写一个包装器,如下所示:
n
然后将您的函数重命名为 (define (factorial n)
(display n) (newline)
(inner-factorial n))
。