これは、リストの各要素を順番に取得して結果を累積する反復関数を使用して行うことができます。例えば:
(define (make-number lst)
(define (make a lst)
(if (null? lst)
a
(make (+ (* 10 a) (car lst)) (cdr lst))))
(make 0 lst))
(display (make-number '(6 3)))
このmake
関数は、アキュムレータa
と残りの桁を使用lst
して、一度に 1 ステップずつ最終結果を構築します。
a = 0
a = 0*10 + 6 = 6
a = 6*10 + 3 = 63
リストにさらに数字がある場合、これは続きます。
a = 63*10 + 5 = 635
a = 635*10 + 9 = 6359
単一の関数を使用する非効率的な実装は、次のようになります。
(define (make-number lst)
(if (null? lst)
0
(+ (* (expt 10 (length (cdr lst))) (car lst)) (make-number (cdr lst)))))
この関数は、length
反復ごとにリストの残りを計算するだけでなく、expt
関数を繰り返し呼び出す必要があります。また、この実装は適切に末尾再帰的ではないため、実行中に複数のスタック フレームを構築してから、再帰の最大深度に達した後にそれらをすべてアンワインドします。