DrRacketユーザー。Whileループはプログラムの機構をSchemeで動作させます
私はこのプログラムの仕組みを理解するのに苦労しています。私はそれを自分で書いていましたが、それはどうしたらいいのか理解できません。
としてループしながら、私はを定義します。
(define (while test body)
(if (test)
(begin
(body)
(while test body))
(void)))
は今、私は変更可能なリストの各要素に与えられた手順を適用するプログラムを記述する必要があります。
list1 (mlist 1 2 3)
を定義し、我々は'(2 3 4)
を得る
(mlist-map-while (lambda (x) (+ x 1)) list1)
を適用するので、
(define (mlist-map-while f x)
(while (lambda() (not (null? x)))
(lambda()
(set-mcar! x (f (mcar x)))
(set! x (mcdr x))))
(void))
、私が書いたもの。ここ
。
に行うのならば、私は
ここ(set! x (mcdr x))
を書いたか-mcar!
を設定する第1の手順は役に立たないとでなければならないので、私は理解していないものは、リストの最初の要素がそれにとどまる方法です第2のものと重なっている。この例のように:
(define list1 (mlist 1 2 3))
(set-mcar! list1 9)
(set-mcdr! list1 (mcdr list!))
、我々は最初の要素が欠けているが、このプログラムは何とかそれを残し、所望の出力を提供します。私はそれがどのように機能し、与えられたリストをトラバースする別の方法があるかどうかを知りたい。
つまり、あなたの例のようにlist1-refを定義すると、(set!list1-ref(mcdr list)))値2と3はまだlist1の2番目と3番目の値を指していますか?私がそれらを変更すると、list1の値はそれぞれ変更されますか? – Dmitrii
はい。リストがどのようにモデル化されるかのために、各要素対は、1つの要素と、残りのリストへのリンクとを有する。 '(mlist 1 2 3)'は '(mcons 1(mcons 2(mcons 3 '())))と同じです)' – Sylwester
スキームはTCO保証を持っています。 –