【问题标题】:Scheme console printing方案控制台打印
【发布时间】:2012-02-11 02:20:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: printing scheme


    【解决方案1】:

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

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

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

    两个备注:

    1. 您可以使用(define (factorial n) [...]) 作为(define factorial (lambda (n) [...])) 的简写。
    2. 您实现factorial 的方式禁止tail call-optimization,因此程序将使用相当多的堆栈空间来处理较大的n 值。不过,可以使用累加器将其重写为可优化的形式。

    如果你只想打印一次n,当用户调用该函数时,你确实需要编写一个包装器,如下所示:

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

    然后将你的函数重命名为inner-factorial

    【讨论】:

    • 你不需要在 lambda 正文中开始。
    • 哦,谢谢!但是在条件之后打印呢?我实际上并没有在阶乘上工作,但是用它来解释更容易。仅当条件为真时才打印之类的东西,即在 n!=0 时打印。
    • 我修复了关于begin的部分。 cond-clause 的主体也可能包含多个表达式,因此您可以轻松地在那里调用display
    • 对不起,如果我不清楚。我的意思是,如果 n=5,我会打印 1 2 3 4 5
    • 原来的答案有一些错别字。我试图编辑答案是正确的。例如(define factorial (n) ...) 在语法上不正确:应该是 (define (factorial n) ...)
    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多