为什么我的程序不产生任何输出?

Why doesn't my program produce any output?

我想编写一个 Scheme 函数 numofatoms 来确定列表中元素的数量。 例如,(numOfSymbols '((1 3) 7 (4 (5 2) ) ) 应该 return 6.

我目前拥有的:

;(1 3) 7 (4(5 2)) the list
(define (numofatoms lst) ;defining a numofatoms function
(define (flatten x) ;defining a flatten function
  (cond ((null? x) '())
        ((pair? x) (append (flatten (car x)) (flatten (cdr x))))
        (else (list x))))
  (length (flatten lst)))
(numofatoms '((1 3) 7 (4(5 2)))); calling the function 

定义 numofatomsflatten 后,我没有看到任何错误,但程序无法运行。它不产生任何输出。

如果您加载发布的代码并从 REPL 调用 numofatoms,则发布的代码工作正常。我假设 OP 要么从 REPL 调用 load,要么从命令行 运行 将代码作为脚本调用,当其中任何一个完成时,OP 看不到任何输出。 REPL 评估并 打印 结果(因此 P),但是当您 load 代码时,不一定会发生什么。

当在 REPL 中计算表达式时,将打印表达式的计算结果。当文件加载到 REPL 时,可能期望文件中最终表达式的值将被打印,但这种期望不会得到回报。

load 程序 为 R6RS 标准化;这里它是特定于实现的,细节取决于实现。对于 Chez Scheme,load returns 一个 未指定的值 ,因此当文件成功加载时,不应期望看到任何有用的东西。

R5RS 和 R7RS 都在标准中描述了 load 过程,但都未指定是否打印文件中表达式的计算结果。

Scheme 程序的任何脚本机制的细节完全取决于实现。但是,当您 运行 来自命令行的脚本时,您不在 REPL 中,因此同样不应期望文件中各种形式的评估结果将打印到终端 window.

如果你想让一个 Scheme 文件或脚本打印一些东西,你必须让它这样做。如果将发布文件的最后一行更改为 (display (numofatoms '((1 3) 7 (4(5 2))))) (newline),程序将在 运行.

时显示调用 numofatoms 的结果