2017-05-08 12 views
1

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!)) 

、我々は最初の要素が欠けているが、このプログラムは何とか​​それを残し、所望の出力を提供します。私はそれがどのように機能し、与えられたリストをトラバースする別の方法があるかどうかを知りたい。

答えて

0

set-cdr! abd set!の間に大きな違いがあります。最初はペアのcdrポインタを変更しますが、後者はバインディングを変更します。あなたのmlist-map-while変数xcarを変えるには

は、その後、xxcdrように、を表す内容に変更します。

(define list1 (mlist 1 2 3)) 
(define list1-ref list1)  ; variable pointing to the same value as list1 
(set-mcar! list1-ref 9)  ; set-car! changes the pair 
(set! list1-ref (mcdr list)) ; set! updates what list1-ref points to 
list1 ; ==> (9 2 3) 
list-ref ; ==> (2 3) 

次のことができます。それ決しては、このように、それはこのようなより多くのです...ので、あなたのlist1を結合することは、常に最初、2番目、などにxポイントしばらく最初のペアを指す

cdrを変更します再帰で、set!を使用せずに同じ方法でリストを反復処理:我々は再帰ここ

(define (fold function init lst) 
    (if (null? lst) 
     init 
     (fold function 
      (function (car lst) init) 
      (cdr lst)))) 

(fold + 0 '(1 2 3) 
; ==> 6 

(fold cons '() '(1 2 3)) 
; ==> (3 2 1) 

通告をし、変更何lstは、cdrとなります。すべての再帰には独自のlstがあり、発信者自身のものと混同しないでください。あなたの例では、突然変異なしでset!と同じことをします。

+0

つまり、あなたの例のようにlist1-refを定義すると、(set!list1-ref(mcdr list)))値2と3はまだlist1の2番目と3番目の値を指していますか?私がそれらを変更すると、list1の値はそれぞれ変更されますか? – Dmitrii

+0

はい。リストがどのようにモデル化されるかのために、各要素対は、1つの要素と、残りのリストへのリンクとを有する。 '(mlist 1 2 3)'は '(mcons 1(mcons 2(mcons 3 '())))と同じです)' – Sylwester

+0

スキームはTCO保証を持っています。 –

関連する問題