突然変異は許可されていますが、Schemeでは強く推奨されていません。set-car!PLTは、 andを削除することさえしましたset-cdr!(ただし、それらをset-mcar!andに「置き換え」ましたset-mcdr!)。ただし、の仕様はSRFI-1append!に登場しました。これはあなたのものとは少し異なります。SRFIでは、実装はリストを追加するために短所セルを変更する場合がありますが、必須ではありません。append!
追加されるリストの構造を変更する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ます。これはミューテーション操作であるため、何も返さないので、変更されたリストを戻り値として作成することを心配する必要はありません。