F#でインタープリタ : 配列
配列が使えるようになりました。実装はF#のリストですけど。
次のスクリプトを解釈させると
a = [2, 3, 4] print(a[1]) a[1] = "three" print("a[1]: " + a[1]) b = [["one", 1], ["two", 2]] print(b[1][0] + ":" + b[1][1])
こんな出力になります。
3 "a[1]: three" "two:2"
多次元配列の扱いが難しかった。。。
以下のコードは値(value)を配列に代入するところです。
| Element(id, indexList, Array(elements)), value -> let rec loop elements indexList = match indexList with | x :: [] -> elements |> List.mapi (fun i element -> if i = x then value else element) |> Array | x :: xs -> elements |> List.mapi (fun i element -> if i = x then match element with | Array elements -> loop elements xs | _ -> failwith "invalid index" else element) |> Array | _ -> failwith "invalid index" let array = loop elements indexList let newEnv = Env.add id array env cont newEnv value
配列の要素を表す判別共用体(Element)に、配列の変数名(id)、インデックスのリスト(indexList)、配列を判別共用体(Array)を持たせています。
ネストした配列の中をトラバースして、代入先の要素を入れ替えています。