5

以下の例でわかるように、Scheme の map 関数は可変引数関数です。

> (map (lambda (number1 number2)
     (+ number1 number2))
   '(1 2 3 4)
   '(10 100 1000 10000))
'(11 102 1003 10004)

この可変引数オプションを実装したいのですが、2 つの引数マップの実装しか見つけることができませんでした。

(define (map f lst)
   (if (null? lst)
       '()
       (cons (f (car lst)) (map f (cdr lst)))))

誰かが可変長マップ関数の実装を手伝ってくれますか?

4

2 に答える 2

2

答えはわかりましたがcase-lambda、数または引数が異なる場合に使用する手順を明示できる構文キーワードがあることに注意してください。次のように使用します。

(define my-map
  (case-lambda
   ((func list) …)
   ((func list1 list2) …)
   (…)
   ((func . lists) …)))

このようにして、さまざまな引数の数の処理を最適化できます。はcase-lambda、本質的に次のような「ラッピング ラムダ」を生成します (ただし、より効率的にコンパイルされる可能性があります)。

(define my-map
  (lambda args ;; illustration only, implementations vary.
    (apply (let ((len (length args)))
             (cond ((= 2 len) (lambda (func list) …))
                   …))
           args)))
于 2014-02-08T20:12:59.073 に答える