Scheme中仅用car与cdr提取列表元素报错如何解决
报错原因
Scheme语法规则中,除quote等特殊形式外,所有被圆括号包裹的表达式都会被解析为过程调用:括号内第一个元素为待调用的过程,后续元素为传入过程的参数。
你编写的代码中((0) (42 #t) (bar))这一结构触发了语法错误:
- 外层括号被判定为过程调用,首先求值第一个子表达式
(0)得到结果0 - 解释器尝试将
0作为过程执行,传入参数为(42 #t)和(bar)的求值结果 - 由于
0是数值类型,并非可调用的过程,因此抛出对应报错。
注:如果你想要表达一个由(0)、(42 #t)、(bar)三个子列表组成的嵌套列表,需要用'(quote 符号)对列表做引用,避免被解释器识别为过程调用。
正确提取方案
仅使用car和cdr提取42的逻辑如下:
- 对添加了引用标记的目标列表执行
cdr操作,得到除第一个元素外的剩余部分:((42 #t) (bar)) - 对上述结果执行
car操作,得到第二个子列表:(42 #t) - 对该子列表执行
car操作,即可得到目标值42
正确代码如下:
(car (car (cdr '((0) (42 #t) (bar)))))
内容的提问来源于stack exchange,提问作者N.A.
相关产品推荐
相关产品推荐

