【发布时间】:2012-02-11 02:20:47
【问题描述】:
刚开始使用 Scheme。我在控制台上打印时遇到问题。 一个简单的列表打印示例:
(define factorial
(lambda (n)
(cond
((= 0 n) 1)
(#t (* n (factorial (- n 1)))))))
我想在每次调用函数时打印n。我想我不能在同一个函数中做到这一点?我需要调用另一个函数才能打印吗?
【问题讨论】:
刚开始使用 Scheme。我在控制台上打印时遇到问题。 一个简单的列表打印示例:
(define factorial
(lambda (n)
(cond
((= 0 n) 1)
(#t (* n (factorial (- n 1)))))))
我想在每次调用函数时打印n。我想我不能在同一个函数中做到这一点?我需要调用另一个函数才能打印吗?
【问题讨论】:
通过调用display(也可能是newline)在Scheme 中打印。
因为你想在其他东西之前/之后依次调用它(在函数式(或在 Scheme 的情况下,函数式)语言中只对被调用函数的副作用有意义),你通常需要使用 @ 987654324@,依次计算其参数,然后返回最后一个子表达式的值。但是,lambda 隐含地包含了这样一个begin 表达式。
所以在你的情况下,它会是这样的:
(lambda (n)
(display n) (newline)
(cond [...]))
两个备注:
(define (factorial n) [...]) 作为(define factorial (lambda (n) [...])) 的简写。factorial 的方式禁止tail call-optimization,因此程序将使用相当多的堆栈空间来处理较大的n 值。不过,可以使用累加器将其重写为可优化的形式。如果你只想打印一次n,当用户调用该函数时,你确实需要编写一个包装器,如下所示:
(define (factorial n)
(display n) (newline)
(inner-factorial n))
然后将你的函数重命名为inner-factorial。
【讨论】:
begin的部分。 cond-clause 的主体也可能包含多个表达式,因此您可以轻松地在那里调用display。
(define factorial (n) ...) 在语法上不正确:应该是 (define (factorial n) ...)。