summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2020-09-15 16:22:28 +0200
committernsensfel <SpamShield0@noot-noot.org>2020-09-15 16:22:28 +0200
commita7356491e534e048374fdf53a534c9ea2034defd (patch)
treef8c5dd5cf1dd2e737c3cc027e38ec3e83e90728a
parentd4eb4ff9a013c870936b7546a65bdfd048c60133 (diff)
Fully implements remove_{one,all,at}.
-rw-r--r--data/tests/extra_functionals.fate14
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java164
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java74
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java58
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveOneOf.java110
5 files changed, 326 insertions, 94 deletions
diff --git a/data/tests/extra_functionals.fate b/data/tests/extra_functionals.fate
index bc629cb..cdbebb3 100644
--- a/data/tests/extra_functionals.fate
+++ b/data/tests/extra_functionals.fate
@@ -55,4 +55,18 @@
(set int_list_b (shuffle int_list_a))
(shuffle! int_list_c)
+(set int_list_c (var int_list_a))
+(remove_one! 6 int_list_a)
+
+(= (var int_list_a) (remove_one 6 int_list_c))
+
+(set int_list_b (var int_list_a))
+(remove_all! 3 int_list_a)
+
+(= (var int_list_a) (remove_all 3 int_list_b))
+
+(set int_list_c (var int_list_a))
+(remove_at! 4 int_list_a)
+(= (var int_list_a) (remove_at 4 int_list_c))
+
(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 ccfc525..186fdd0 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
@@ -25,10 +25,12 @@ import tonkadur.wyrd.v1.compiler.util.IfElse;
import tonkadur.wyrd.v1.compiler.util.If;
import tonkadur.wyrd.v1.compiler.util.Shuffle;
import tonkadur.wyrd.v1.compiler.util.RemoveAt;
+import tonkadur.wyrd.v1.compiler.util.RemoveAllOf;
+import tonkadur.wyrd.v1.compiler.util.RemoveOneOf;
import tonkadur.wyrd.v1.compiler.util.CreateCons;
import tonkadur.wyrd.v1.compiler.util.IterativeSearch;
import tonkadur.wyrd.v1.compiler.util.CountOccurrences;
-
+import tonkadur.wyrd.v1.compiler.util.LambdaEvaluation;
import tonkadur.wyrd.v1.lang.computation.*;
@@ -1744,21 +1746,18 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
final ComputationCompiler target_line_cc;
final List<Computation> parameters;
final Register result;
- final String return_to_label;
parameters = new ArrayList<Computation>();
target_line_cc = new ComputationCompiler(compiler);
- return_to_label =
- compiler.assembler().generate_label("<lambda_eval#return_to>");
-
n.get_lambda_function_reference().get_visited_by(target_line_cc);
assimilate(target_line_cc);
result = reserve(TypeCompiler.compile(compiler, n.get_type()));
- parameters.add(result.get_address());
+ result_as_address = result.get_address();
+ result_as_computation = result.get_value();
for
(
@@ -1776,29 +1775,17 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
parameters.add(cc.get_computation());
}
- init_instructions.addAll
- (
- compiler.registers().store_parameters(parameters)
- );
-
init_instructions.add
(
- compiler.assembler().mark_after
+ LambdaEvaluation.generate
(
- compiler.assembler().merge
- (
- compiler.registers().get_visit_context_instructions
- (
- target_line_cc.get_computation(),
- compiler.assembler().get_label_constant(return_to_label)
- )
- ),
- return_to_label
+ compiler.registers(),
+ compiler.assembler(),
+ target_line_cc.get_computation(),
+ result_as_address,
+ parameters
)
);
-
- result_as_address = result.get_address();
- result_as_computation = result.get_value();
}
@Override
@@ -2020,7 +2007,46 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
)
throws Throwable
{
- /* TODO */
+ final ComputationCompiler address_compiler, target_compiler;
+ final Address collection_address;
+ final Register result;
+
+ result = reserve(TypeCompiler.compile(compiler, n.get_type()));
+ result_as_address = result.get_address();
+ result_as_computation = result.get_value();
+
+ address_compiler = new ComputationCompiler(compiler);
+ target_compiler = new ComputationCompiler(compiler);
+
+ n.get_collection().get_visited_by(address_compiler);
+
+ if (address_compiler.has_init())
+ {
+ init_instructions.add(address_compiler.get_init());
+ }
+
+ init_instructions.add
+ (
+ new SetValue(result_as_address, address_compiler.get_computation())
+ );
+
+ address_compiler.release_registers(init_instructions);
+
+ n.get_element().get_visited_by(target_compiler);
+
+ assimilate(target_compiler);
+
+ init_instructions.add
+ (
+ RemoveAllOf.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ target_compiler.get_computation(),
+ new Size(result_as_address),
+ result_as_address
+ )
+ );
}
@Override
@@ -2030,7 +2056,48 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
)
throws Throwable
{
- /* TODO */
+ final ComputationCompiler address_compiler, target_compiler;
+ final Address collection_address;
+ final Register result, target_index;
+
+ result = reserve(TypeCompiler.compile(compiler, n.get_type()));
+ result_as_address = result.get_address();
+ result_as_computation = result.get_value();
+
+ address_compiler = new ComputationCompiler(compiler);
+ target_compiler = new ComputationCompiler(compiler);
+
+ n.get_collection().get_visited_by(address_compiler);
+
+ if (address_compiler.has_init())
+ {
+ init_instructions.add(address_compiler.get_init());
+ }
+
+ init_instructions.add
+ (
+ new SetValue(result_as_address, address_compiler.get_computation())
+ );
+
+ address_compiler.release_registers(init_instructions);
+
+ n.get_index().get_visited_by(target_compiler);
+
+ target_compiler.generate_address();
+
+ assimilate(target_compiler);
+
+ init_instructions.add
+ (
+ RemoveAt.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ target_compiler.get_address(),
+ new Size(result_as_address),
+ result_as_address
+ )
+ );
}
@Override
@@ -2040,7 +2107,50 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
)
throws Throwable
{
- /* TODO */
+ final ComputationCompiler elem_cc, collection_cc;
+ final Register result;
+
+ elem_cc = new ComputationCompiler(compiler);
+ collection_cc = new ComputationCompiler(compiler);
+
+ result = reserve(TypeCompiler.compile(compiler, n.get_type()));
+ result_as_address = result.get_address();
+ result_as_computation = result.get_value();
+
+ n.get_collection().get_visited_by(collection_cc);
+
+ if (collection_cc.has_init())
+ {
+ init_instructions.add(collection_cc.get_init());
+ }
+
+ init_instructions.add
+ (
+ new SetValue(result_as_address, collection_cc.get_computation())
+ );
+
+ collection_cc.release_registers(init_instructions);
+
+ n.get_element().get_visited_by(elem_cc);
+
+ elem_cc.generate_address();
+
+ assimilate(elem_cc);
+
+ init_instructions.add
+ (
+ RemoveOneOf.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ elem_cc.get_computation(),
+ result_as_address,
+ (
+ (tonkadur.fate.v1.lang.type.CollectionType)
+ n.get_collection().get_type()
+ ).is_set()
+ )
+ );
}
@Override
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 1f47d8f..ba268f1 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
@@ -52,6 +52,7 @@ import tonkadur.wyrd.v1.compiler.util.Shuffle;
import tonkadur.wyrd.v1.compiler.util.Clear;
import tonkadur.wyrd.v1.compiler.util.IterativeSearch;
import tonkadur.wyrd.v1.compiler.util.RemoveAllOf;
+import tonkadur.wyrd.v1.compiler.util.RemoveOneOf;
import tonkadur.wyrd.v1.compiler.util.ReverseList;
import tonkadur.wyrd.v1.compiler.util.RemoveAt;
@@ -2054,16 +2055,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
* )
*/
final ComputationCompiler elem_cc, collection_cc;
- final Register collection_size, found, index;
- final Address elem, collection;
elem_cc = new ComputationCompiler(compiler);
collection_cc = new ComputationCompiler(compiler);
- collection_size = compiler.registers().reserve(Type.INT, result);
- found = compiler.registers().reserve(Type.BOOL, result);
- index = compiler.registers().reserve(Type.INT, result);
-
n.get_element().get_visited_by(elem_cc);
n.get_collection().get_visited_by(collection_cc);
@@ -2079,76 +2074,21 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(collection_cc.get_init());
}
- elem = elem_cc.get_address();
- collection = collection_cc.get_address();
-
- result.add
- (
- new SetValue(collection_size.get_address(), new Size(collection))
- );
-
-
- if
- (
- (
- (tonkadur.fate.v1.lang.type.CollectionType)
- n.get_collection().get_type()
- ).is_set()
- )
- {
- result.add
- (
- BinarySearch.generate
- (
- compiler.registers(),
- compiler.assembler(),
- new ValueOf(elem),
- collection_size.get_value(),
- collection,
- found.get_address(),
- index.get_address()
- )
- );
- }
- else
- {
- result.add
- (
- IterativeSearch.generate
- (
- compiler.registers(),
- compiler.assembler(),
- new ValueOf(elem),
- collection_size.get_value(),
- collection,
- found.get_address(),
- index.get_address()
- )
- );
- }
-
result.add
(
- If.generate
+ RemoveOneOf.generate
(
compiler.registers(),
compiler.assembler(),
- new ValueOf(found.get_address()),
- RemoveAt.generate
+ elem_cc.get_computation(),
+ collection_cc.get_address(),
(
- compiler.registers(),
- compiler.assembler(),
- index.get_address(),
- collection_size.get_value(),
- collection
- )
+ (tonkadur.fate.v1.lang.type.CollectionType)
+ n.get_collection().get_type()
+ ).is_set()
)
);
- compiler.registers().release(index, result);
- compiler.registers().release(found, result);
- compiler.registers().release(collection_size, result);
-
elem_cc.release_registers(result);
collection_cc.release_registers(result);
}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java
new file mode 100644
index 0000000..976c60e
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java
@@ -0,0 +1,58 @@
+package tonkadur.wyrd.v1.compiler.util;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import tonkadur.wyrd.v1.lang.meta.Instruction;
+import tonkadur.wyrd.v1.lang.meta.Computation;
+import tonkadur.wyrd.v1.lang.computation.Address;
+
+import tonkadur.wyrd.v1.lang.instruction.SetValue;
+
+import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager;
+
+public class LambdaEvaluation
+{
+ /* Utility Class */
+ private LambdaEvaluation () {}
+
+ /* Uses Durstenfeld's shuffling algorithm */
+ public static Instruction generate
+ (
+ final RegisterManager registers,
+ final InstructionManager assembler,
+ final Computation lambda_function,
+ final Address result_storage,
+ final List<Computation> parameters
+ )
+ {
+ final List<Instruction> result;
+ final String return_to_label;
+
+ result = new ArrayList<Instruction>();
+
+ return_to_label = assembler.generate_label("<lambda_eval#return_to>");
+
+ parameters.add(0, result_storage);
+
+ result.addAll(registers.store_parameters(parameters));
+
+ result.add
+ (
+ assembler.mark_after
+ (
+ assembler.merge
+ (
+ registers.get_visit_context_instructions
+ (
+ lambda_function,
+ assembler.get_label_constant(return_to_label)
+ )
+ ),
+ return_to_label
+ )
+ );
+
+ return assembler.merge(result);
+ }
+}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveOneOf.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveOneOf.java
new file mode 100644
index 0000000..50f7d82
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveOneOf.java
@@ -0,0 +1,110 @@
+package tonkadur.wyrd.v1.compiler.util;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import tonkadur.wyrd.v1.lang.Register;
+
+import tonkadur.wyrd.v1.lang.type.Type;
+
+import tonkadur.wyrd.v1.lang.meta.Computation;
+import tonkadur.wyrd.v1.lang.meta.Instruction;
+
+import tonkadur.wyrd.v1.lang.computation.Cast;
+import tonkadur.wyrd.v1.lang.computation.Constant;
+import tonkadur.wyrd.v1.lang.computation.Operation;
+import tonkadur.wyrd.v1.lang.computation.Address;
+import tonkadur.wyrd.v1.lang.computation.RelativeAddress;
+import tonkadur.wyrd.v1.lang.computation.ValueOf;
+import tonkadur.wyrd.v1.lang.computation.Size;
+
+import tonkadur.wyrd.v1.lang.instruction.SetValue;
+
+import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager;
+
+public class RemoveOneOf
+{
+ /* Utility Class */
+ private RemoveOneOf () {}
+ public static Instruction generate
+ (
+ final RegisterManager registers,
+ final InstructionManager assembler,
+ final Computation element,
+ final Address collection,
+ final boolean is_set
+ )
+ {
+ final Register collection_size, found, index;
+ final List<Instruction> result;
+
+ result = new ArrayList<Instruction>();
+
+ index = registers.reserve(Type.INT, result);
+ collection_size = registers.reserve(Type.INT, result);
+ found = registers.reserve(Type.BOOL, result);
+
+ result.add
+ (
+ new SetValue(collection_size.get_address(), new Size(collection))
+ );
+
+ if (is_set)
+ {
+ result.add
+ (
+ BinarySearch.generate
+ (
+ registers,
+ assembler,
+ element,
+ collection_size.get_value(),
+ collection,
+ found.get_address(),
+ index.get_address()
+ )
+ );
+ }
+ else
+ {
+ result.add
+ (
+ IterativeSearch.generate
+ (
+ registers,
+ assembler,
+ element,
+ collection_size.get_value(),
+ collection,
+ found.get_address(),
+ index.get_address()
+ )
+ );
+ }
+
+ result.add
+ (
+ If.generate
+ (
+ registers,
+ assembler,
+ found.get_value(),
+ RemoveAt.generate
+ (
+ registers,
+ assembler,
+ index.get_address(),
+ collection_size.get_value(),
+ collection
+ )
+ )
+ );
+
+ registers.release(index, result);
+ registers.release(collection_size, result);
+ registers.release(found, result);
+
+ return assembler.merge(result);
+ }
+}