2017-08-23 7 views
0

スキーム - 誰かがこの出力を私に説明できますか?これらの定義された関数で

(define (foldr op z ls) 
    (if (null? ls) 
    z 
    (op (car ls) (foldr op z (cdr ls))))) 

(define (snoc x y) (cons y x)) 

と私はこの実行すると:

(foldr snoc '() (list 1 2 3)) 

を、私はこの出力を得る:

=> (((() . 3) . 2) . 1) 

この出力は何を意味するのでしょうか?誰かがそれを私に詳細に説明してもらえますか? 私はスキームの中のボックスとポインタ表記に関してこの答えを描きます。

答えて

1

ラケットは、cdrがリストでない場合、コンセルを「点線ペア」として印刷します。 DrRacketから

例:

> (list 1 2) 
'(1 2) 
> '(1 . (2 .())) 
'(1 2) 
> '(1 . 2) 
'(1 . 2) 
> (cons 1 2) 
'(1 . 2) 
> (cons 1 '()) 
'(1) 
> (cons '() 1) 
'(() . 1) 

(foldr op z ls)lsを取り、zopconsnilを置き換えます。 lsは、その後、(foldr op z ls)(cons a (cons b (cons c nil)))であれば、ある

は、(foldr snoc '() (list 1 2 3))は、最も内側のsnocから外側にあなたの方法を作業する

(snoc 1 (snoc 2 (snoc 3 '()))) 

で、あなたの例では

(op a (op b (op c z))) 

ある

(snoc 1 (snoc 2 (cons '() 3))) 

(snoc 1 (cons (cons '() 3) 2)) 

(cons (cons (cons '() 3) 2) 1) 

これは、点線のペア

'(((() . 3) . 2) . 1) 

(DrRacket中)(練習問題として残って図を描く。)

+0

それはあなたが知っている場合は、これを理解することは簡単です '(1 2 3)(' 'の単純化された可視化は実際にあります1。 (2。(3。()))) ' – Sylwester

関連する問題