scheme - 为什么 "1 2 3"是一个有效的 Scheme 表达式?

标签 scheme

这是有效的方案

1 2 3

并返回 3。但这是无效的

(1 2 3)

这也不是有效的

(1) (2) (3)

最后两个无效是有道理的。但我不明白第一个应该如何有效?有人可以解释一下吗?

最佳答案

可能是 REPL您的实现的一部分是读取一个非空的序列 表达式并对所有表达式求值并给出序列 结果。 (我相信 REPL 的这种行为是特定于实现的。R7RS 没有在其 §5.7 中提及它。它可能会随着 Scheme 的其他实现而变化,我从未使用过它;我同意 coredump's answer 它可能是一个奇特而有用的功能)

Scheme 能够返回并处理多个值,例如with call-with-values & values ;另见 this

所以从技术上讲,1 2 3 不是一个单个表达式,而是一个序列 三个表达式。调用 (read) 不会给你这样的序列。在 Linux 上的诡计 2 (+ 2 (read)) 55 66 立即 给出两个结果 57 66,而不是三个(在 之后等待输入)。

另请阅读 call/cc , continuations , 和 CPS .可能存在一些间接关系(您的 REPL 在(read)ing 表达式时如何在内部处理它们....)

关于scheme - 为什么 "1 2 3"是一个有效的 Scheme 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32930515/

相关文章:

scheme - 方案中的正则表达式

scheme - 是否可以更改DrRacket/Scheme搜索/引用库的顺序?

方案 - 不带外括号的 cdr

scheme - 仅使用 "The Little Schemer"中的表单展平列表

scheme - 以下表达式中的值、变量、对象和名称之间有什么区别?

list - 方案匹配元素

lisp - Scheme 中是否有等同于 Lisp 的 "runtime"原语?

scheme - 方案中范围集合的交集

scheme - 编写可移植 Scheme 代码的最佳方法?

image - 如何更改 Racket 中的图像大小