diff --git a/src/main/java/org/yinwang/yin/Binder.java b/src/main/java/org/yinwang/yin/Binder.java index 910774e..8df8db4 100644 --- a/src/main/java/org/yinwang/yin/Binder.java +++ b/src/main/java/org/yinwang/yin/Binder.java @@ -2,10 +2,12 @@ import org.yinwang.yin.ast.*; +import org.yinwang.yin.value.Record; import org.yinwang.yin.value.Value; import org.yinwang.yin.value.Vector; import java.util.List; +import java.util.Map; public class Binder { @@ -18,6 +20,19 @@ public static void define(Node pattern, Value value, Scope env) { } else { env.put(id, value); } + } else if (pattern instanceof RecordLiteral) { + if (value instanceof Record) { + Map elms1 = ((RecordLiteral) pattern).map; + Map elms2 = ((Record) value).values; + if (elms1.keySet().equals(elms2.keySet())) { + for (String k1 : elms1.keySet()) { + define(elms1.get(k1), elms2.get(k1), env); + } + } else { + _.abort(pattern, "define with records of different attributes: " + + elms1.keySet() + " v.s. " + elms2.keySet()); + } + } } else if (pattern instanceof VectorLiteral) { if (value instanceof Vector) { List elms1 = ((VectorLiteral) pattern).elements; @@ -51,6 +66,19 @@ public static void assign(Node pattern, Value value, Scope env) { ((Subscript) pattern).set(value, env); } else if (pattern instanceof Attr) { ((Attr) pattern).set(value, env); + } else if (pattern instanceof RecordLiteral) { + if (value instanceof Record) { + Map elms1 = ((RecordLiteral) pattern).map; + Map elms2 = ((Record) value).values; + if (elms1.keySet().equals(elms2.keySet())) { + for (String k1 : elms1.keySet()) { + assign(elms1.get(k1), elms2.get(k1), env); + } + } else { + _.abort(pattern, "assign with records of different attributes: " + + elms1.keySet() + " v.s. " + elms2.keySet()); + } + } } else if (pattern instanceof VectorLiteral) { if (value instanceof Vector) { List elms1 = ((VectorLiteral) pattern).elements; diff --git a/tests/assign1.yin b/tests/assign1.yin index dcaf778..7327fe8 100644 --- a/tests/assign1.yin +++ b/tests/assign1.yin @@ -4,8 +4,16 @@ (set! bb.x 10) [aa bb] + (define [x y] [1 2]) [x y] (set! [x y] [y x]) [x y] + +(define {:a xx :b yy} {:a 7 :b 8}) +[xx yy] + +(set! {:a x :b y} {:a 7 :b 8}) +[x y] +