そのようなプロシージャは Scheme 標準に存在しますか? 存在する場合、それはどのように呼び出されますか?

StackOverflow https://stackoverflow.com/questions/98394

  •  01-07-2019
  •  | 
  •  

質問

私はプロシージャの名前を探しました。このプロシージャは、プロシージャのツリー構造をデータのツリー構造に適用し、結果のツリー構造を生成します。3 つのツリーはすべて同じ構造を持っています。

このようなプロシージャには次のような署名が含まれる場合があります。

(map-tree data functree)

その戻り値は、対応するデータ要素に functree の要素を要素ごとに適用した結果になります。

例 (プロシージャがマップツリーと呼ばれると仮定します):

例 1:

(define *2 (lambda (x) (* 2 x)))
; and similar definitions for *3 and *5

(map-tree '(100 (10 1)) '(*2 (*3 *5)))

結果が出るだろう

(200 (30 5))

例 2:

(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce)))
        '((car cdr) cadr))

結果が得られます

((aa bc) cd)

しかし、私が調べた SLIB ドキュメントにはそのような関数は見つかりませんでした。

そのような手順はすでに存在しますか?
そうでない場合、プロシージャに適切な名前は何ですか?また、その引数をどのように順序付けしますか?

役に立ちましたか?

解決

関数にあまり良い名前がありません。私の実装を以下に貼り付けます(私はそれを map-traversing;他の人がより良い名前を提案するはずです)。引数の順序を次のとおりにしました。 map 自体。

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (func data)))

サンプル データを使用すると、次のようになります。

(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))

2 番目のサンプルには SRFI 26 が必要です。(書き込みを許可します (cut * 2 <>) の代わりに (lambda (x) (* 2 x)).)

(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))

最も重要なことは、例とは異なり、関数はすべて引用符で囲まれていない必要があることです。

他のヒント

次のマップトラバースの定義では、関数の引用符を外す必要がないことがわかりました。

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (apply (eval func (interaction-environment)) (list data))))

注記:私がインストールしたバージョンの Guile では、何らかの理由により、(interaction-environment) のみが Unbound 変数エラーを引き起こしません。他の環境、つまり(scheme-report-environment 5) および (null-environment 5) では、このエラーが発生します。

注2:その後、[1] で、(scheme-report-environment 5) と (null-environment 5) が機能するには、最初に (use-modules (ice-9 r5rs)) を行う必要があることがわかりました。

[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html 'Re:guile -c "(スキーム-レポート-環境 5)" ==> エラー:非バインド変数:スキーム-レポート-環境'

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top