car 和 cdr 的简写

问题描述

我正在尝试使用 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 没有任何保留字,即使语言或实现决定稍后包含这些,这也应该有效。它永远不会使用新的并使用您的定义。