2016-10-23 2 views
0

で定義されたリストに値を追加し、私が何をしtriyingだものは以下の通りです:スキーム

私はスキーム で辞書に値を追加しますので、私のように辞書を定義関数を作成する必要がありますリストのリストは、それは次のように:

(define Dictionary '(("key 1" "value 1") ("key 2" "value"))) 

を今すぐ値を加算する機能のために:

要素がnullでない場合、私はチェックまず第一要素はキーと値を持っていることをしようとする前にそれをリストに追加する

(define (addElement element mylist) 
    (cond 
     ((null? elemment) 'The_Element_Is_Null) 
     ((null? (cdr element)) 'The_Element_is_singleTon) 
     (#t (cons element mylist)) 
    ) 
) 

そして、それは次のようにそれを実行しよう:

(addElement '("key 3" "value 3") Dictionary) 

とDrRacketが、それはそれがあったかのように短所を使用して値が表示されていることを、次の

(("key 3" "value 3") ("key 1" "value 1") ("key 2" "value")) 

ノートを印刷したコードを実行リストに追加されますが、値は他の言語に似ていますが、これと同様のものを印刷することが可能です。

int i = 1; 
print("value = "+ i + 5); 

プログラムは

value = 6 

を印刷する必要がありますが、現実には、変数の値は、同じように、私の辞書はちょうど新しい要素でリストを出力しますが、1、新しい値を取得し、このコードを実行されていませんさ要素は実際にリストに追加されていません

解決策の1つは、メソッドセットを使用しています! 、が実際に入力されたリストを更新しないをください:値を追加することが、私は同じ結果

スキームで
(define (addElement element mylist) 
    (cond 
     ((null? elemment) 'The_Element_Is_Null) 
     ((null? (cdr element)) 'The_Element_is_singleTon) 
     (#t (set! myList(cons element mylist))) 
    ) 
) 
+0

この機能が辞書を修正するはずですか?古い辞書のような新しい辞書を返す関数を持たせるのは、はるかに一般的ですが、項目が追加されています。 (これは '' new-dict(add-element)( "this" "that")old-dict)のように使用されます) – molbdnilo

+0

これは私が必要としていたものです –

答えて

0

を取得していますしようとする、リスト操作のほとんどは、(consなど)のリストを「修正」という代わりに新しいリストを作成し、それを保存するか、それを渡すことになっています。

プロシージャが終了した後にプロシージャ内でリストの変更を保存したい場合は、変更されたリストを明示的にset!する必要があります.2番目の試みは正しい方向を目指しますが、プロシージャのパラメータを設定するだけです。元のリスト私は2つの選択肢を提案:

; declare the list outside the procedure 

(define Dictionary '()) 

; 1) either set! the list inside the procedure 

(define (addElement element) 
    (cond 
    ((null? element) 'The_Element_Is_Null) 
    ((null? (cdr element)) 'The_Element_Is_Singleton) 
    (else (set! Dictionary (cons element Dictionary))))) 

(addElement '("key 1" "value 1")) 

; 2) or set! the list with the result of calling the procedure 

(define (addElement element myList) 
    (cond 
    ((null? element) 'The_Element_Is_Null) 
    ((null? (cdr element)) 'The_Element_Is_Singleton) 
    (else (cons element myList)))) 

(set! Dictionary (addElement '("key 1" "value 1") Dictionary)) 

は、一般的にset!を使用して手続き型プログラミングのこのスタイルはが重くを落胆されることに注意してくださいを - 何がやりたいことは、別の手順にリストを変更プロシージャ・コールの結果を渡すことです(関数の構成)または同じプロシージャ(再帰の一部として)に渡し、新しい結果を処理させます。 Schemeは、その核となる機能的なプログラミング言語であり、物事はあなたが慣れていたものとは異なるやり方で行われることを忘れないでください。

+0

@ D.Shinodaこれはあなたの質問に答えましたか?もしそうなら、[accept](https:// meta。)を忘れないでください。stackexchange.com/questions/5234/how-does-accepting-an-answer-work)それは、左のチェックマークをクリックするだけです;) –

+0

ちょっと、ちょうどセットの必要性を排除する別の方法を見つけた!私の関数の出力を使ってリストを再定義するために(define())を使用していたのは、そのassigmentについてのものでしたが、とにかく感謝しています –