| summaryrefslogtreecommitdiff |
diff options
3 files changed, 167 insertions, 2 deletions
diff --git a/data/tests/extra_functionals.fate b/data/tests/extra_functionals.fate new file mode 100644 index 0000000..53c4b33 --- /dev/null +++ b/data/tests/extra_functionals.fate @@ -0,0 +1,39 @@ +(fate_version 1) + +(declare_structure test_struct + (int i) + (float f) + (int j) + (string str) +) + +(global test_struct st0) +(global test_struct st1) + +(set_fields! st0 + (i -1) + (f -5.0) + (j -2) + (str nothing) +) + +(global (lambda test_struct (test_struct)) update_test_struct) + +(set_value update_test_struct + (lambda ( (test_struct s) ) + (if_else (< (var s.i) 10) + (eval + update_test_struct + (set_fields s + (i (+ (var s.i) 1)) + (j (+ (var s.j) 10)) + ) + ) + (var s) + ) + ) +) + +(set_value st1 (eval update_test_struct (var st0))) + +(end) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 78047a3..c86ddda 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -1878,6 +1878,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.CarCdr n ) + throws Throwable { /* TODO */ } @@ -1887,6 +1888,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.ConsComputation n ) + throws Throwable { /* TODO */ } @@ -1896,6 +1898,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.AddElementComputation n ) + throws Throwable { /* TODO */ } @@ -1905,6 +1908,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.AddElementAtComputation n ) + throws Throwable { /* TODO */ } @@ -1914,6 +1918,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.AddElementsOfComputation n ) + throws Throwable { /* TODO */ } @@ -1923,6 +1928,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.Fold n ) + throws Throwable { /* TODO */ } @@ -1932,6 +1938,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.MapComputation n ) + throws Throwable { /* TODO */ } @@ -1941,6 +1948,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.Range n ) + throws Throwable { /* TODO */ } @@ -1950,6 +1958,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.RemoveAllOfElementComputation n ) + throws Throwable { /* TODO */ } @@ -1959,6 +1968,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.RemoveElementAtComputation n ) + throws Throwable { /* TODO */ } @@ -1968,6 +1978,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.RemoveElementComputation n ) + throws Throwable { /* TODO */ } @@ -1977,6 +1988,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.ReverseListComputation n ) + throws Throwable { /* TODO */ } @@ -1986,6 +1998,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.ShuffleComputation n ) + throws Throwable { /* TODO */ } @@ -1995,6 +2008,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.MergeComputation n ) + throws Throwable { /* TODO */ } @@ -2004,6 +2018,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.SubListComputation n ) + throws Throwable { /* TODO */ } @@ -2013,6 +2028,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.PartitionComputation n ) + throws Throwable { /* TODO */ } @@ -2022,6 +2038,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.SortComputation n ) + throws Throwable { /* TODO */ } @@ -2031,6 +2048,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.FilterComputation n ) + throws Throwable { /* TODO */ } @@ -2040,6 +2058,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.IndexedMapComputation n ) + throws Throwable { /* TODO */ } @@ -2049,6 +2068,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.PushElementComputation n ) + throws Throwable { /* TODO */ } @@ -2058,6 +2078,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.PopElementComputation n ) + throws Throwable { /* TODO */ } @@ -2067,7 +2088,65 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ( final tonkadur.fate.v1.lang.computation.SetFieldsComputation n ) + throws Throwable { - /* TODO */ + final ComputationCompiler target_cc; + final Register result; + + target_cc = new ComputationCompiler(compiler); + + n.get_target().get_visited_by(target_cc); + + target_cc.generate_address(); + + if (target_cc.has_init()) + { + init_instructions.add(target_cc.get_init()); + } + + result = reserve(target_cc.get_address().get_target_type()); + result_as_computation = result.get_value(); + result_as_address = result.get_address(); + + init_instructions.add + ( + new SetValue(result_as_address, target_cc.get_computation()) + ); + + target_cc.release_registers(init_instructions); + + for + ( + final Cons<String, tonkadur.fate.v1.lang.meta.Computation> entry: + n.get_assignments() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + entry.get_cdr().get_visited_by(cc); + + if (cc.has_init()) + { + init_instructions.add(cc.get_init()); + } + + init_instructions.add + ( + new SetValue + ( + new RelativeAddress + ( + result_as_address, + new Constant(Type.STRING, entry.get_car()), + cc.get_computation().get_type() + ), + cc.get_computation() + ) + ); + + cc.release_registers(init_instructions); + } } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 7ca4652..c8488d8 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -596,7 +596,54 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) throws Throwable { - /* TODO */ + final ComputationCompiler target_cc; + final Address target; + + target_cc = new ComputationCompiler(compiler); + + n.get_target().get_visited_by(target_cc); + + target = target_cc.get_address(); + + if (target_cc.has_init()) + { + result.add(target_cc.get_init()); + } + for + ( + final Cons<String, tonkadur.fate.v1.lang.meta.Computation> entry: + n.get_assignments() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + entry.get_cdr().get_visited_by(cc); + + if (cc.has_init()) + { + result.add(cc.get_init()); + } + + result.add + ( + new SetValue + ( + new RelativeAddress + ( + target, + new Constant(Type.STRING, entry.get_car()), + cc.get_computation().get_type() + ), + cc.get_computation() + ) + ); + + cc.release_registers(result); + } + + target_cc.release_registers(result); } |


