2016-04-07 6 views
1

私は、セットを使用せずにメモリにリストを保持することに問題がありました!セットを使用せずにリストを更新する! - スキーム

私は、定義された最初の空のリストを持っている

(define database (list)) 

は、私は、パスワードが正しく、リストにペアを追加するかどうかを確認するこの手順を持っています。

(define (set-pass l) 
    (if (pair? l) 
    (if (check-pass (second (last l))) 
     (add-to-list l) 
     "password does not meet policy requirements" 
    ) 
    "invalid input" 
) 
) 

し、[追加ツーリスト手順:

(define (add-to-list l) 
    ;(append database l) 
    ;implement this. 
) 

問題は、私は、この手順を複数回呼び出す必要があり、次のとおりです。

(set-pass '('john '(X p c F z C b Y h 1 2 3 4 : :))) 
(set-pass '('john '(X p c F z C b Y : 1 2 3 4 : :))) 
(set-pass '('john '(X p c F z C b : : 1 2 3 4 : :))) 

私は追加・ツー・プロシージャを実装私はset-passを一度(上記のように追加して)呼び出しているようなリストですが、複数回呼び出すと実装する方法を見つけることができませんでした。私はhereherehereと言ったいくつかのことを試しました。しかし私は私が望むものを達成できませんでした。だから私はこれをどのようにすることができますか?

+0

プロシージャ内でリストをカプセル化しても、ある時点で 'set! 'を使用してリストを再割り当てする必要があります。いずれか、またはそれを必要とする関数にパラメータとして変更されたリストを渡し続ける。 –

答えて

1

これは、変数としてデータベースを持つことにより、機能的にこれを行うことが可能です:

(let loop ((input (read-line)) (database '())) 
    (display (format "inserting ~a\n" input)) 
    (loop (read-line) 
     (cons input database))) 

その他(ETC削除)機能作業の操作に従って変化した構造とRECURと同様ます。

set-cdr!でリストを更新することもできます。 set!は、シンボルが指しているものを変異させるが、set-cdr!は、ペアのcdrを突然変異させる。

(define database (list "head")) 

(define (add element) 
    (let ((tmp (cdr database))) 
    (set-cdr! database (cons element tmp)))) 

(define (delete element) 
    (let loop ((prev database) (cur (cdr database))) 
    (cond ((null? cur) #f) 
      ((equal? (car cur) element) 
      (set-cdr! prev (cdr cur))) 
      (else (loop cur (cdr cur)))))) 

(define (get) 
    (cdr database)) 

(add 1) 
(add 2) 
(add 3) 
(get) ; ==> (3 2 1) 
(delete 2) 
(get) ; ==> (3 1) 

秒あなたは猫が袋の外にある、すべての変異が利用可能である変異を許可する:それはペアにする必要があるので、あなたは、最初の要素がいくつかのダミーデータで持っている必要があります。例えば。 set!が提供されている場合はクロージャーを使用して可変オブジェクトを作成でき、set-car!/set-cdr!が指定されている場合は、ボックスで可変バインディングを取得できます。

関連する問題