3

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

このような手順には、次の署名が付いている場合があります。

(マップツリーデータ関数ツリー)

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

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

例1:

(定義* 2(ラムダ(x)(* 2 x)))
; および*3と*5の同様の定義

(マップツリー'(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のドキュメントでは、そのような関数は見つかりませんでした。

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

4

2 に答える 2

3

私は関数にあまり良い名前を持っていません。以下に実装を貼り付けます (私はそれを と呼びました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)))

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

于 2008-09-19T01:03:14.227 に答える
1

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

(定義 (マップトラバース関数データ)
  (if (list? func)
      (マップ マップ トラバース関数データ)
      (apply (eval func (interaction-environment)) (リストデータ))))

注: インストールしたバージョンの Guile では、何らかの理由で (interaction-environment) のみで Unbound variable エラーが発生しません。他の環境、つまり (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 "(scheme-report-environment 5)" ==> エラー: バインドされていない変数: スキーム-レポート-環境'

于 2008-09-19T03:09:40.897 に答える