Scheme

2017-10-16 12 views
0

皆様の現在のリストから最初の値を切り捨ててください。自分のカスタムオブジェクトを引数としてとり、そのオブジェクトのリストから最初の引数を取り出し、それを返してオブジェクトから削除します。コードは次のとおりです。Scheme

(define (make-source sequence . xs) 
    (let ((a (if (not (null? xs)) 
       xs 
       (list #f)))) 
    (cond ((string? sequence) (append (string->list sequence) (list a))) 
      ((vector? sequence) (append (vector->list sequence) (list a))) 
      (else (append sequence (list a)))))) 

(define (next src) 
    (if (equal? (car src) '(#f)) 
     #t 
     (let ((a (car src))) 
     (set! src (make-source (cdr src))) 
     a))) 

問題はオブジェクトを変更せずにnext戻り値です。 問題の修正を手伝ってもらえますか? また、新しいリストを作成することなく、そのリストから要素をカットすることは可能ですか?

答えて

1

set!は、変数が指すオブジェクトではなく、バインディングを変更します。これは、今日のプログラミング言語のほとんどすべてで同じです:

def f(a): 
    a = 10 

x = 20 
f(x) 
x 
// => 20 

はなぜnextがオブジェクトを変更しない理由にあなたの答えがないx10です。変数は実際には設定されますが、ローカル変数であり、関数の最後に存在しなくなります。

Schemeでプログラミングするための慣用方法は、OOの実装を試みるのではなく、mapまたは折り畳みを使用して構造体で何かを行うことです。例えば。

(define (sum-numbers lst) 
    (foldl + 0 lst)) 

(sum-number '(1 2 3)) 
; ==> 6