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