質問
私は学習R5RSスキームの瞬間からPocketScheme)という機能が組み込まれている一部の異方式は:Append!
つまり-破壊の変更をリストアップしました。
んなに興味のある実際のコードとしての回答などを理解する過程をこのlistとしての機能(またはベクトルまたは文字列)を変化させます。
例:
(define (append! lst var)
(cons (lst var))
)
を利用した場合アプローチとしては、上記していますように (define list (append! foo (bar))
このようなものがますます重要になっていく。.
解決
突然変異が可能で強力に阻ます。PLTで、もっぱらとして発表するに至っていない set-car!
や set-cdr!
(とはい"交換"として set-mcar!
や set-mcdr!
).しかし、スペック append!
が登場 SRFI-1.この append!
少し異なります。のSRFIの実施 月, ただ 必要 を変更連結実績細胞への追加のリストが表示されます。
したい場合において append!
ることが 保証 変化の構造にリストされているので追加されるかを書きます。れている方まで楽しめる:
(define (my-append! a b)
(if (null? (cdr a))
(set-cdr! a b)
(my-append! (cdr a) b)))
のの定義は、ありませんエラーチェックをここで明確にする必要があるということをリストの長さ1以上として a
, は、(好ましくは)一覧(任意の長さのとして b
.その理由 a
以上の長さが1でなーゆさんこちらで用意した set-cdr!
空一覧です。
てんかこの作品は、見出すことができればご説明いたします。基本的に何をしたいのは下のリスト a
また、最後 cons
ペア、 (<last element> . null)
.なまずさ a
はすでに最後の要素のリストをチェック null
の cdr
.れた場合は、使用していま set-cdr!
に設定しても構いませんのリストたちを追加しています。ない場合には、その通話 my-append!
の cdr
の a
.毎回こうすれば末 a
.この変異動作しない戻り、何ものではないと思います心配を形成する存在としての変更リストを返します。
他のヒント
決してこのトピックに夫婦で2-3セントを置くためのより良い後半...
(1)スキームのが変更されてstuctureへの単一の参照が存在する間に破壊的な手順を使用して問題はありません。だから、例えば、断片的な単一の参照を介して、効率的に大規模なリストの構築 - 製造、完了したらその(今おそらくツー修飾されていない)リストが知られており、種々の対象から参照
。(2)私はAPPENDと思います!破壊的にのみ(潜在的に)、APPENDのように振る舞うべきです。そしてそうAPPEND!引数としてリストの任意の数を期待するべきです。各リストが、最後はおそらくSET-CDRされるだろう!」Dを次へと。
APPENDの(3)上記の定義!基本的にMacのLispとCommon Lispのからnconcをです。 (そして、他のLisp)。