5

Scheme では、この関数(map fn list0 [list1 .. listN])にはリストの要素数が同じでなければならないという制限があります。Python から来たので、Python のリスト内包表記の自由がありません。これはmap上記のように見えますが、この制限はありません。

すべてのリストの最初の N 個の要素を繰り返し処理する、異なるサイズのリストを可能にする代替の「my-map」を実装したいと思います。ここで、N は最短のリストの長さです。

たとえば、 let numbe10lstbe(1 2 3)です。my-map では、次のような式を書きたいと考えています。

(my-map + (circular-list num) lst)))

そして得る:

(11 12 13)

私はこれを従来のものよりも読みやすい

(map + (lambda (arg) (+ num arg)) lst)

また

(map + (make-list (length lst) num) lst) 

2 つの質問:

  • Scheme 初心者として、`map` の制限の重要な理由を見落としていませんか?
  • 「my-map」のようなものは、Scheme または SRFI に既に存在しますか? 私は srfi-42 を調べましたが、それは私が探しているものではないか、探していたものであり、明らかではありませんでした。
4

1 に答える 1

7

最初に、空のリストmap 許可されていることに注意してください。もちろん、空のリストが 1 つある場合は、それらすべてを空にする必要があります。

次に、 のsrfi-1 バージョンをmap見てください。これは、次のように R5RS バージョンとは明確に異なります。

この手順は、R5RS 仕様から拡張され、引数の長さが等しくないことを許可します。最短のリストがなくなると終了します。

第三に、ほとんどのSchemeプログラマーは非常に好むでしょう

(map (lambda (arg) (+ num arg)) lst)

lambda私の推測では、言語に慣れるにつれて式がより読みやすくなるという点で、Scheme は Python とは異なります。

そして最後に、ある種のリスト内包表記を伴う実装がいくつかあります。たとえば、Racketでは次のように記述できます。

(for/list ([arg lst]) (+ num arg))
于 2011-05-21T04:33:27.580 に答える