问题描述
我正在尝试使用 car/cdr 来获取列表中的特定元素:
(define x7 '(1 3 (5 7) 9))
; The cdr (3 (5 7) 9)
; The cddr ((5 7) 9)
; The caddr (5 7)
; The cdaddr (7)
我已经能够做到那么远,但是,如果我对结果执行 car
,它会起作用,但是如果我在简写形式中添加另一个 a
,我会得到错误:
(car (cdaddr x7)) ; OK
(cadaddr x7) ; cadaddr: unbound identifier in: cadaddr
简写形式是否最多只能包含五个字符/步,还是我在这里遗漏了其他东西?
解决方法
根据R6RS report:
提供最多四个深度的任意组合。这些程序总共有二十八个。
这与 R5RS 和新的 R7RS 报告相同。当然,没有什么可以阻止实现添加更多内容,但是使用这些会降低程序的可移植性,因为其他实现可能仅提供所需的 4 层深度。
您当然可以提供自己的课程:
(define (cadadadr p)
(cadar (cdadr p)))
由于 Scheme 没有任何保留字,即使语言或实现决定稍后包含这些,这也应该有效。它永远不会使用新的并使用您的定义。