Scheme 如何在这个算法中正确使用点尾符号?

Scheme 如何在这个算法中正确使用点尾符号?,scheme,racket,variadic-functions,sicp,Scheme,Racket,Variadic Functions,Sicp,我正在做来自SICP(不是家庭作业)的练习,练习2.20引入了点尾符号,在这里你可以使用(define(fa.b)…来传递一个可变数量的参数(最终在列表b中)。这个问题特别需要一个过程,它接受整数a,并返回奇偶校验等于a的所有参数的列表。问题不难,;以下是我的解决方案: (define (same-parity a . b); a is an int, b is any number of int arguments (let ((parity (remainder a 2))) (

我正在做来自SICP(不是家庭作业)的练习,练习2.20引入了点尾符号,在这里你可以使用
(define(fa.b)…
来传递一个可变数量的参数(最终在列表
b
中)。这个问题特别需要一个过程,它接受整数
a
,并返回奇偶校验等于
a
的所有参数的列表。问题不难,;以下是我的解决方案:

(define (same-parity a . b); a is an int, b is any number of int arguments
  (let ((parity (remainder a 2)))
    (define (proc li)
      (cond ((null? li) null)
            ; If parity of the head of the list is = parity of a,
            ((= (remainder (car li) 2) parity)
             ; keep it and check the rest of the list.
             (cons (car li) (proc (cdr li))))
            ; Otherwise ignore it and check the rest of the list.
            (else (proc (cdr li)))))
    (cons a (proc b))))
我的问题是,我似乎根本没有使用点尾功能。我可能只接受了两个论点,一个数字和一个列表;我正在有效地将算法包装在一个过程
proc
中,它消除了虚线尾的东西

在我编写这个解决方案之前,我希望有一个递归调用

(相同的奇偶校验a.(cdr b))

或者精神上相似的东西,但不管我怎么尝试,我总是传递清单或额外的程序或任何东西。这可能是因为我不知道
到底做什么,只知道我希望它做什么(Racket文档也没有清理任何东西)。总之,

我的解决方案是本练习的目的,还是有办法在算法中实际使用点符号(这似乎是本练习的重点)?您不能使用
(相同的奇偶校验a.(cdr b))
(因为这将作为
(相同的奇偶校验a cdr b)
)读取,但您可以使用
(应用相同的奇偶校验a(cdrb))
。这就是将列表“splat”到参数中的方式

然而,您使用的“内部过程”方法通常更有效,因为正在进行的列表复制更少