2011-07-01 10 views
3

私はそのようなタイプに定義されている:私のプログラムの時点でレコードの一部の値を変更するにはどうすればよいですか?

type s_program = 
    { globals : s_var list; 
     main: s_block; } 
and s_var = 
    { s_var_name: string; 
     s_var_type: s_type; 
     s_var_uniqueId: s_uniqueId } 
and s_uniqueId = int 

を、私は変数p: s_programがありますが、私は、例えば、p.globalsのすべての要素のs_var_uniqueIdを変更する必要があり、すべてのs_var_uniqueId1を追加。私はいくつかの質問があります。

1)私はpに直接関連する値を変更しているか、私は新しいp':s_program

2に新しい値を代入しなければならないのを)私はそのような何かを書くことができ:

​​

ありがとうございました。

編集1:提案

答えて

3

1として正しいwith一部)あなたが不可欠または関数型プログラミング言語:)としてのOCamlを使用するかどうかによって決まります。それが前者の場合は、レコードの両方のフィールドを(フィールド名の前にmutableキーワードを追加することによって)変更可能にし、それらを適切な場所に変更することができます。しかし、私は強くそれを行うとしていないアドバイスをしたい:。

2)あなたは2番目のレコードの変更のための{...}が欠落しているように見えることを除いて(完全に正常に見えるあなたの第二のアプローチ、一緒に行く

+0

ありがとうございました... – SoftTimur

+0

@akoprowski:この可能性を忘れました(変更可能な「キーワード」)。もっと明白なので 'ref 'を好む^ _ ^ –

4

まず最初に第2に、あなたが本当に望むものについて考える必要があります:可変レコード、可変フィールドを持つレコード、または可変フィールドを持つ可変レコードです。たとえば、次のように考えてください。複素数のレコードがあります(これはref 1の同じ例です)。

type complex = { re:float; im:float } ;; 

あなたは

let c = {re=2.;im=3.} ;; 

ような何かを宣言した場合、あなたはcre(またはim)どちらを変更することはできません。実際にはc := {re=4.;im=6.} ;;またはc.re := 4.;;は両方ともエラーで失敗します。可変レコードを取得するには、cの参照を使用するだけです。

let c = ref {re=2.;im=3.} ;; 

その後、c := {re=4.;im=6.} ;;cを変更することができます。しかし、私はあなたが変更可能なフィールドを持っていると思う!次に、どのフィールドが変更可能であるかを正確に把握する必要があります。しかし、あなたが

type complex = { re:float ref; im:float ref } 
let make_complex r i = { re = ref r ; im = ref i } 
let c = make_complex 3. 4. 
;; 

を書き、その後

c.re := 6. ; c.im := 7. ;; 

でフィールドを変更することができますそれはタイプfloat -> float ->()

let change_re c r = c.re := r ;; 
let change_im c i = c.im := i ;; 
let change_complex c r i = change_re c r ; change_im c i ;; 

の機能に容易になるだろう、すべてのフィールドが変更可能になりたいと仮定、私はあなたのコードにこのような命令的な機能をもたらすことについて本当に考えてお勧めします。これは、読みやすさを完全に破壊する簡単な方法です。

関連する問題