【问题标题】:Scheme language: #void error output方案语言:#void 错误输出
【发布时间】:2018-10-12 13:08:51
【问题描述】:

这是我的程序:

(define (listof n m)
(display " ( ")
(let loop ((times n))

   (if (= times 0)
     (display ") ")
     (begin (display m)
            (display " ")
            (loop (- times 1))))))

=> (listof 2 (listof 2 2))

预期输出:((2 2) (2 2)) .
收到的输出:( 2 2 ) ( # < void> # < void> )

我该如何解决这个问题?

【问题讨论】:

  • 该函数应该产生一个列表,还是打印被括号包围的东西? (#<void>s 是由display 生成的值。)

标签: list scheme void display


【解决方案1】:

由于(listof 2 (listof 2 2)) 我应该输出((2 2) (2 2)) 我很确定您必须编写生成列表的代码并且它与与打印无关。因此您不能使用display

为什么?好吧。想象一下,如果(listof 2 2) 应该打印“(2 2)”,那么显然返回是没有结果的。因此与display 相同的输出是可以的。因此(listof 2 (listof 2 2)) 应该显示(2 2) (? ?),其中?listof 返回的任何内容。

如果listof 应该返回一个带有传递参数的列表,那么(listof 2 2) 应该返回 (cons 2 (cons 2 '())。您需要重写您的过程,以便它执行此操作。

【讨论】:

    【解决方案2】:

    listof 函数的结果是#。 这是因为最后完成的事情是(display ") ")。 这会将“)”打印到标准输出,但不会将有意义的值返回给调用函数(因此 #)。这意味着您不能以这种方式嵌套调用 listof。

    换句话说,要解决这个问题,你必须让函数返回一个有意义的值。例如,您可以使用 string-append 构造一个字符串。我假设您不想在这里构建实际列表,否则您应该研究列表的工作原理。

    这是一个例子(这个例子只适用于字符串):

    (define (listof n m)
       (let loop ((times n) (res "("))
    
          (if (= times 0)
             (string-append res " )")
             (loop (- times 1) (string-append res " " m)))))
    
    
    
    > (listof 3 (listof 2 "hello"))
    "( ( hello hello ) ( hello hello ) ( hello hello ) )"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多