Scheme/Racket中如何用car/cdr从(5 4.x)结构里单独提取x变量
正确操作
你只需要执行如下仅用car/cdr的表达式即可提取到x:
(cdr (car (cdr s)))
错误原因说明
你之前操作失败的核心问题是没有理清s的实际结构:
- 你定义的
s实际是一个双元素列表:(5 (4 . x)),你写的4.x是排版省略了括号和空格的点对结构(4 . x),是列表的第二个元素 - 你调用
(cdr s)得到的是包含点对的单元素列表((4 . x)),并非直接得到点对本身,所以再调用一次cdr只会得到空列表() - 你对
(car s)(也就是数值5)调用cdr必然报错,因为car/cdr仅支持对pair类型操作,数值不属于pair类型
结构拆解验证
你可以按以下步骤拆解确认每一步的输出:
(car s)→ 输出5(列表第一个元素)(cdr s)→ 输出((4 . x))(列表除第一个元素外的剩余部分,是一个单元素列表)(car (cdr s))→ 输出(4 . x)(取出单元素列表里的点对)(cdr (car (cdr s)))→ 输出x(取出点对的右半部分,即你需要的变量)
补充说明:如果你定义的
s实际是点尾列表(5 4 . x)(你写的'(5 4.x)是漏了4后面的空格),那么直接调用(cdr (cdr s))即可得到x。这种情况下你之前调用(cdr (cdr s))得到空列表,说明你实际定义的s不是点尾列表,而是第二个元素为点对的普通列表。
内容的提问来源于stack exchange,提问作者asdf
相关产品推荐
相关产品推荐

