scheme - 检查参数是否是点对而不是列表

标签 scheme racket

我刚开始学习 Racket,我必须检查参数是否为点对。

我试过这个:

(pair? '(a . 1))

并返回#t

(pair? '('(a b c) . 1))

并返回#t

(pair? '(a b c))

并返回#t。但在这种情况下我想得到#f。

有没有像 pair? 这样的过程只有当我将它作为参数传递给一个点对时才为真?

在检查它是否是一对之前,我可能必须实现一个检查它是否不是列表的过程。

更新
我只需要检查 '(a . 1) 是否是点对,任何列表都不是点对。

最佳答案

如果我们迂腐,点对只不过是一种符号,一种写对的方法。表达式 '(a . d) 的计算结果是一个 cons 单元格。

当函数应用于某些参数时,参数就是值。这意味着函数不能接收点对 - 它可以接收 cons 单元格。

好的——但是一个函数可以知道一个值是一个cons cell还是一个列表吗?取决于你的意思。列表表示为 null(空列表)或 cons 单元格,其第二个元素是列表。

因此,谓词 pair? 将对所有列表(空列表除外)返回 true。 现在我们可以通过编写 (and (pair? x) (not (list? x))) 来检查一个 cons 单元是否不是列表的第一个 cons 单元。

关于scheme - 检查参数是否是点对而不是列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53040161/

相关文章:

macros - 语法规则中如何使用矢量模式?

lisp - scheme中 'assoc'函数的时间复杂度是多少?

testing - 如何测试 Racket 的 throw 错误?

scheme - 为什么线程没有执行(Racket)

lisp - 寻求对 SICP 练习 1.5 的一些解释

macros - 在 Racket 类函数中使用点表示法

scheme - 如何处理在执行 sicp 练习 4.9 时产生的这个错误?

scheme - 方案中代码的部分展开

scheme - 从命名空间映射符号重新内部化符号

user-interface - 如何在 Racket 中没有框架的 [x] 按钮的情况下退出 GUI 应用程序