| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-27 22:11:01 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-27 22:11:01 +0200 | 
| commit | 84c040f10ddfc66d75ce7e7459f4c92e1592238b (patch) | |
| tree | f8aecc690fad772d9b9f324032f0f6786f468826 | |
| parent | 6aec0ce0fb005457b53633b9599998117a1003cf (diff) | |
Adds the code for the Let computation.
Still not in the parser, though.
3 files changed, 145 insertions, 0 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Let.java b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java new file mode 100644 index 0000000..f5be874 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java @@ -0,0 +1,89 @@ +package tonkadur.fate.v1.lang.computation; + +import java.util.List; + +import tonkadur.functional.Cons; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.Variable; + +import tonkadur.fate.v1.lang.type.Type; + +public class Let extends Computation +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation computation; +   protected final List<Cons<Variable, Computation>> assignments; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public Let +   ( +      final Origin origin, +      final List<Cons<Variable, Computation>> assignments, +      final Computation computation +   ) +   { +      super(origin, computation.get_type()); + +      this.computation = computation; +      this.assignments = assignments; +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final ComputationVisitor cv) +   throws Throwable +   { +      cv.visit_let(this); +   } + +   public Computation get_computation () +   { +      return computation; +   } + +   public List<Cons<Variable, Computation>> get_assignments () +   { +      return assignments; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Let ("); + +      for (final Cons<Variable, Computation> assignment: assignments) +      { +         sb.append("("); +         sb.append(assignment.get_car().get_type()); +         sb.append(" "); +         sb.append(assignment.get_car().get_name()); +         sb.append(" "); +         sb.append(assignment.get_cdr().toString()); +         sb.append(")"); +      } +      sb.append(") "); + +      sb.append(computation.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java index 32fcee7..09b9135 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -49,6 +49,9 @@ public interface ComputationVisitor     public void visit_lambda_evaluation (final LambdaEvaluation n)     throws Throwable; +   public void visit_let (final Let n) +   throws Throwable; +     public void visit_newline (final Newline n)     throws Throwable; 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 5a06201..94e013d 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 @@ -1643,6 +1643,59 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     }     @Override +   public void visit_let +   ( +      final tonkadur.fate.v1.lang.computation.Let n +   ) +   throws Throwable +   { +      final Collection<String> names; + +      names = new ArrayList<String>(); + +      for +      ( +         final +            Cons +            < +               tonkadur.fate.v1.lang.Variable, +               tonkadur.fate.v1.lang.meta.Computation +            > +            a: +               n.get_assignments() +      ) +      { +         final String name; +         final Register r; +         final ComputationCompiler cc; + +         name = a.get_car().get_name(); +         r = reserve(TypeCompiler.compile(compiler, a.get_car().get_type())); + +         compiler.registers().bind(name, r); +         names.add(name); + +         cc = new ComputationCompiler(compiler); + +         a.get_cdr().get_visited_by(cc); + +         assimilate(cc); + +         init_instructions.add +         ( +            new SetValue(r.get_address(), cc.get_computation()) +         ); +      } + +      n.get_computation().get_visited_by(this); + +      for (final String name: names) +      { +         compiler.registers().unbind(name); +      } +   } + +   @Override     public void visit_variable_reference     (        final tonkadur.fate.v1.lang.computation.VariableReference n | 


