Scheme 可选关键字参数和多参数练习

Scheme 可选关键字参数和多参数练习,scheme,racket,Scheme,Racket,我必须编写一个函数pow increase,它接受任意数量的参数和一个可选参数。对于每个参数,它必须计算其对某个数字的幂,该幂从数字2开始递增,或者,如果提供了可选的关键字参数,则从该数字开始递增 例如: > (pow-increase 2 2 2 2) ; 2^2 2^3 2^4 2^5 '(4 8 16 32) > (pow-increase #start: 1 2 2 2 2) ; 2^1 2^2 2^3 2^4 '(2 4 8 16) 我已经为第一次调用编写了函数: (d

我必须编写一个函数pow increase,它接受任意数量的参数和一个可选参数。对于每个参数,它必须计算其对某个数字的幂,该幂从数字2开始递增,或者,如果提供了可选的关键字参数,则从该数字开始递增

例如:

> (pow-increase 2 2 2 2) ; 2^2 2^3 2^4 2^5
'(4 8 16 32)

> (pow-increase #start: 1 2 2 2 2) ; 2^1 2^2 2^3 2^4
'(2 4 8 16)
我已经为第一次调用编写了函数:

(define pow-increase
    (lambda argList 
        (let* ([len (length argList)]
               [exponents (range 2 (+ len 2) 1)])
        (map (lambda (x) (expt (car x) (car(cdr x)))) (zip argList exponents)))))
现在我想编写函数的第二个版本(用于第二个调用),但我不知道如何同时传递任意数量的参数和可选的关键字参数。我已经阅读了可选参数的语法:[optParamName value]

提前感谢您的帮助

我会去的

(define (pow-increase #:start (start 2) . lst)
  (for/list ((e (in-list lst)) (i (in-naturals start)))
    (expt e i)))
测试

> (pow-increase 2 2 2 2)
'(4 8 16 32)
> (pow-increase #:start 1 2 2 2 2)
'(2 4 8 16)
请注意,如果使用Racket的
循环,代码会变得多么优雅。如果您想继续使用初始版本,修改将是:

(define pow-increase
  (lambda (#:start (start 2) . argList)
    (let* ([len (length argList)]
           [exponents (range start (+ len start) 1)])
      (map (lambda (x) (expt (car x) (car (cdr x)))) (zip argList exponents)))))
但即使如此,您也可以通过去掉
zip
来简化,因为
map
允许多个列表:

(define pow-increase
  (lambda (#:start (start 2) . argList)
    (let* ([len (length argList)]
           [exponents (range start (+ len start) 1)])
      (map expt argList exponents))))