2

スキーム内のスキームのエバリュエーターを作成していますが、必要な機能の 1 つはマップです。ただし、私が見つけたマップの定義はすべて、複数のリストを許可していません。例えば:

(define (my-map proc lis)
   (cond ((null? lis)
          '())
         ((pair? lis)
          (cons (proc (car lis))
                (my-map proc (cdr lis))))))

このマップの定義は「不完全」です。たとえば、次のように 2 つの数値リストを追加することはできません (引数として 1 つのリストしか許可されません)。

(my-map + '(1 2 3) '(4 5 6))

上記のマップ定義を変更して、任意の数のリストを許可するにはどうすればよいですか?

4

3 に答える 3

1

my-map複数のリストを使用できるようにするための構文は単純(define (my-map mapper lst1 . lsts) ...)です。

しかし、それはあなたが本当に求めていることではありませんよね?一般的な実装方法は次のとおりです。

  1. 空のリストがあるかどうかを確認します。もしそうなら、空のリストを返します。
  2. 各リストの最初の要素を収集し、それらを引数として渡してマッパーを呼び出します。
  3. my-map各リストの残りを使用して、への再帰呼び出しでそのマッパー呼び出しの結果をコンスします。

ステップ 2 と 3 は、 の 1 リスト バージョンを使用して実装される可能性がありmapます。

于 2013-07-14T02:21:03.897 に答える