summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/tests/extra_functionals.fate47
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java8
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java8
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Map.java8
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java16
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java35
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java10
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java12
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java8
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g452
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java38
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java50
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java114
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java142
20 files changed, 510 insertions, 92 deletions
diff --git a/data/tests/extra_functionals.fate b/data/tests/extra_functionals.fate
index de44c6f..44cd525 100644
--- a/data/tests/extra_functionals.fate
+++ b/data/tests/extra_functionals.fate
@@ -73,4 +73,51 @@
(set int_list_a (var int_list_c))
(reverse! int_list_a)
(set int_list_b (reverse (range 0 50 5)))
+
+(global (list string) some_words_a)
+(global (list string) some_words_b)
+(global (set string) some_words_c)
+
+(set some_words
+ (map
+ (lambda ( (int i) )
+ (switch 0
+ ((% (var i) 5) Five)
+ ((% (var i) 4) Four)
+ ((% (var i) 3) Three)
+ ((% (var i) 2) Two)
+ None
+ )
+ )
+ (range 0 20 1)
+ )
+)
+(map!
+ (lambda ( (int i) )
+ (switch 0
+ ((% (var i) 5) Five)
+ ((% (var i) 4) Four)
+ ((% (var i) 3) Three)
+ ((% (var i) 2) Two)
+ None
+ )
+ )
+ (range 0 20 1)
+ some_words_b
+)
+
+(map!
+ (lambda ( (int i) )
+ (switch 0
+ ((% (var i) 5) Five)
+ ((% (var i) 4) Four)
+ ((% (var i) 3) Three)
+ ((% (var i) 2) Two)
+ None
+ )
+ )
+ (range 0 20 1)
+ some_words_c
+)
+
(end)
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java
index e7dadb8..84828ca 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java
@@ -6,6 +6,7 @@ import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class AddElement extends Instruction
@@ -14,7 +15,7 @@ public class AddElement extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation element;
- protected final Computation collection;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -24,7 +25,7 @@ public class AddElement extends Instruction
(
final Origin origin,
final Computation element,
- final Computation collection
+ final Reference collection
)
{
super(origin);
@@ -41,7 +42,7 @@ public class AddElement extends Instruction
(
final Origin origin,
final Computation element,
- final Computation collection
+ final Reference collection
)
throws ParsingError
{
@@ -58,7 +59,7 @@ public class AddElement extends Instruction
iv.visit_add_element(this);
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java
index 156b54f..56329ed 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java
@@ -8,6 +8,7 @@ import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class AddElementAt extends Instruction
@@ -17,7 +18,7 @@ public class AddElementAt extends Instruction
/***************************************************************************/
protected final Computation index;
protected final Computation element;
- protected final Computation collection;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -28,7 +29,7 @@ public class AddElementAt extends Instruction
final Origin origin,
final Computation index,
final Computation element,
- final Computation collection
+ final Reference collection
)
{
super(origin);
@@ -47,7 +48,7 @@ public class AddElementAt extends Instruction
final Origin origin,
final Computation index,
final Computation element,
- final Computation collection
+ final Reference collection
)
throws ParsingError
{
@@ -65,7 +66,7 @@ public class AddElementAt extends Instruction
iv.visit_add_element_at(this);
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java
index 2ffde59..f992c44 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java
@@ -8,6 +8,7 @@ import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class AddElementsOf extends Instruction
@@ -15,7 +16,7 @@ public class AddElementsOf extends Instruction
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Reference other_collection;
+ protected final Computation other_collection;
protected final Reference collection;
/***************************************************************************/
@@ -25,7 +26,7 @@ public class AddElementsOf extends Instruction
protected AddElementsOf
(
final Origin origin,
- final Reference other_collection,
+ final Computation other_collection,
final Reference collection
)
{
@@ -42,7 +43,7 @@ public class AddElementsOf extends Instruction
public static AddElementsOf build
(
final Origin origin,
- final Reference other_collection,
+ final Computation other_collection,
final Reference collection
)
throws ParsingError
@@ -67,7 +68,7 @@ public class AddElementsOf extends Instruction
iv.visit_add_elements_of(this);
}
- public Reference get_source_collection ()
+ public Computation get_source_collection ()
{
return other_collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java
index cd1c4d0..c3c049b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java
@@ -13,7 +13,7 @@ import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
-import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class ForEach extends Instruction
@@ -21,7 +21,7 @@ public class ForEach extends Instruction
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Reference collection;
+ protected final Computation collection;
protected final String var_name;
protected final List<Instruction> body;
@@ -32,7 +32,7 @@ public class ForEach extends Instruction
public ForEach
(
final Origin origin,
- final Reference collection,
+ final Computation collection,
final String var_name,
final List<Instruction> body
)
@@ -52,7 +52,7 @@ public class ForEach extends Instruction
iv.visit_for_each(this);
}
- public Reference get_collection ()
+ public Computation get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java
index 5040987..950418e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java
@@ -21,7 +21,7 @@ public class IndexedMap extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation lambda_function;
- protected final Reference collection_in;
+ protected final Computation collection_in;
protected final Reference collection_out;
/***************************************************************************/
@@ -32,7 +32,7 @@ public class IndexedMap extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in,
+ final Computation collection_in,
final Reference collection_out
)
{
@@ -51,7 +51,7 @@ public class IndexedMap extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in,
+ final Computation collection_in,
final Reference collection_out
)
throws Throwable
@@ -93,7 +93,7 @@ public class IndexedMap extends Instruction
return lambda_function;
}
- public Reference get_collection_in ()
+ public Computation get_collection_in ()
{
return collection_in;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java
index 46a728c..cba32f5 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java
@@ -21,7 +21,7 @@ public class Map extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation lambda_function;
- protected final Reference collection_in;
+ protected final Computation collection_in;
protected final Reference collection_out;
/***************************************************************************/
@@ -32,7 +32,7 @@ public class Map extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in,
+ final Computation collection_in,
final Reference collection_out
)
{
@@ -51,7 +51,7 @@ public class Map extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in,
+ final Computation collection_in,
final Reference collection_out
)
throws ParsingError
@@ -84,7 +84,7 @@ public class Map extends Instruction
return lambda_function;
}
- public Reference get_collection_in ()
+ public Computation get_collection_in ()
{
return collection_in;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java
index 1dd9b91..e070cdc 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java
@@ -21,9 +21,9 @@ public class Merge extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation lambda_function;
- protected final Reference collection_in_a;
+ protected final Computation collection_in_a;
protected final Computation default_a;
- protected final Reference collection_in_b;
+ protected final Computation collection_in_b;
protected final Computation default_b;
protected final Reference collection_out;
@@ -35,9 +35,9 @@ public class Merge extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in_a,
+ final Computation collection_in_a,
final Computation default_a,
- final Reference collection_in_b,
+ final Computation collection_in_b,
final Computation default_b,
final Reference collection_out
)
@@ -60,9 +60,9 @@ public class Merge extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in_a,
+ final Computation collection_in_a,
final Computation default_a,
- final Reference collection_in_b,
+ final Computation collection_in_b,
final Computation default_b,
final Reference collection_out
)
@@ -135,7 +135,7 @@ public class Merge extends Instruction
return lambda_function;
}
- public Reference get_collection_in_a ()
+ public Computation get_collection_in_a ()
{
return collection_in_a;
}
@@ -145,7 +145,7 @@ public class Merge extends Instruction
return default_a;
}
- public Reference get_collection_in_b ()
+ public Computation get_collection_in_b ()
{
return collection_in_b;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java
index 9ea468f..4d64652 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java
@@ -3,8 +3,12 @@ package tonkadur.fate.v1.lang.instruction;
import tonkadur.parser.Origin;
import tonkadur.parser.ParsingError;
+import tonkadur.fate.v1.lang.type.PointerType;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
@@ -13,7 +17,8 @@ public class PopElement extends Instruction
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Computation collection;
+ protected final Computation storage_ptr;
+ protected final Reference collection;
protected final boolean is_from_left;
/***************************************************************************/
@@ -23,12 +28,14 @@ public class PopElement extends Instruction
protected PopElement
(
final Origin origin,
- final Computation collection,
+ final Computation storage_ptr,
+ final Reference collection,
final boolean is_from_left
)
{
super(origin);
+ this.storage_ptr = storage_ptr;
this.collection = collection;
this.is_from_left = is_from_left;
}
@@ -40,14 +47,25 @@ public class PopElement extends Instruction
public static PopElement build
(
final Origin origin,
- final Computation collection,
+ final Computation storage_ptr,
+ final Reference collection,
final boolean is_from_left
)
throws ParsingError
{
RecurrentChecks.assert_is_a_collection(collection);
+ RecurrentChecks.assert_can_be_used_as
+ (
+ storage_ptr,
+ new PointerType
+ (
+ origin,
+ ((CollectionType) collection.get_type()).get_content_type(),
+ "auto generated"
+ )
+ );
- return new PopElement(origin, collection, is_from_left);
+ return new PopElement(origin, storage_ptr, collection, is_from_left);
}
/**** Accessors ************************************************************/
@@ -58,11 +76,16 @@ public class PopElement extends Instruction
iv.visit_pop_element(this);
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
+ public Computation get_storage_pointer ()
+ {
+ return storage_ptr;
+ }
+
public boolean is_from_left ()
{
return is_from_left;
@@ -85,6 +108,8 @@ public class PopElement extends Instruction
sb.append(collection.toString());
+ sb.append(" ");
+ sb.append(storage_ptr.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java
index 0ab34d4..f07ef89 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java
@@ -6,6 +6,7 @@ import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class PushElement extends Instruction
@@ -14,7 +15,7 @@ public class PushElement extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation element;
- protected final Computation collection;
+ protected final Reference collection;
protected final boolean is_from_left;
/***************************************************************************/
@@ -25,7 +26,7 @@ public class PushElement extends Instruction
(
final Origin origin,
final Computation element,
- final Computation collection,
+ final Reference collection,
final boolean is_from_left
)
{
@@ -44,7 +45,7 @@ public class PushElement extends Instruction
(
final Origin origin,
final Computation element,
- final Computation collection,
+ final Reference collection,
final boolean is_from_left
)
throws ParsingError
@@ -62,7 +63,7 @@ public class PushElement extends Instruction
iv.visit_push_element(this);
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java
index 040ef99..d2a2e50 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java
@@ -6,6 +6,7 @@ import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class RemoveElement extends Instruction
@@ -14,7 +15,7 @@ public class RemoveElement extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation element;
- protected final Computation collection;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -24,7 +25,7 @@ public class RemoveElement extends Instruction
(
final Origin origin,
final Computation element,
- final Computation collection
+ final Reference collection
)
{
super(origin);
@@ -41,7 +42,7 @@ public class RemoveElement extends Instruction
(
final Origin origin,
final Computation element,
- final Computation collection
+ final Reference collection
)
throws ParsingError
{
@@ -63,7 +64,7 @@ public class RemoveElement extends Instruction
return element;
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java
index 9d84ee4..79caeac 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java
@@ -5,7 +5,7 @@ import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
-import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class ReverseList extends Instruction
@@ -13,7 +13,7 @@ public class ReverseList extends Instruction
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Computation collection;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -22,7 +22,7 @@ public class ReverseList extends Instruction
protected ReverseList
(
final Origin origin,
- final Computation collection
+ final Reference collection
)
{
super(origin);
@@ -37,7 +37,7 @@ public class ReverseList extends Instruction
public static ReverseList build
(
final Origin origin,
- final Computation collection
+ final Reference collection
)
throws ParsingError
{
@@ -54,7 +54,7 @@ public class ReverseList extends Instruction
iv.visit_reverse_list(this);
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java
index 5983c03..bdad43d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java
@@ -7,6 +7,7 @@ import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class SetValue extends Instruction
@@ -15,7 +16,7 @@ public class SetValue extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation element;
- protected final Computation value_reference;
+ protected final Reference value_reference;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -25,7 +26,7 @@ public class SetValue extends Instruction
(
final Origin origin,
final Computation element,
- final Computation value_reference
+ final Reference value_reference
)
{
super(origin);
@@ -42,7 +43,7 @@ public class SetValue extends Instruction
(
final Origin origin,
final Computation element,
- final Computation value_reference
+ final Reference value_reference
)
throws ParsingError
{
@@ -64,7 +65,7 @@ public class SetValue extends Instruction
return element;
}
- public Computation get_reference ()
+ public Reference get_reference ()
{
return value_reference;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java
index 82e746d..bf12da6 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java
@@ -1,13 +1,11 @@
package tonkadur.fate.v1.lang.instruction;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
-import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class Shuffle extends Instruction
@@ -15,7 +13,7 @@ public class Shuffle extends Instruction
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Computation collection;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -24,7 +22,7 @@ public class Shuffle extends Instruction
protected Shuffle
(
final Origin origin,
- final Computation collection
+ final Reference collection
)
{
super(origin);
@@ -39,7 +37,7 @@ public class Shuffle extends Instruction
public static Shuffle build
(
final Origin origin,
- final Computation collection
+ final Reference collection
)
throws ParsingError
{
@@ -56,7 +54,7 @@ public class Shuffle extends Instruction
iv.visit_shuffle(this);
}
- public Computation get_collection ()
+ public Reference get_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java
index 918d6e0..b2e5176 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java
@@ -18,7 +18,7 @@ public class SubList extends Instruction
/***************************************************************************/
protected final Computation start;
protected final Computation end;
- protected final Reference collection_in;
+ protected final Computation collection_in;
protected final Reference collection_out;
/***************************************************************************/
@@ -30,7 +30,7 @@ public class SubList extends Instruction
final Origin origin,
final Computation start,
final Computation end,
- final Reference collection_in,
+ final Computation collection_in,
final Reference collection_out
)
{
@@ -51,7 +51,7 @@ public class SubList extends Instruction
final Origin origin,
final Computation start,
final Computation end,
- final Reference collection_in,
+ final Computation collection_in,
final Reference collection_out
)
throws Throwable
@@ -87,7 +87,7 @@ public class SubList extends Instruction
return end;
}
- public Reference get_collection_in ()
+ public Computation get_collection_in ()
{
return collection_in;
}
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 6d65e0a..f914451 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -610,7 +610,7 @@ returns [Instruction result]
}
| IMP_ADD_ALL_KW
- source=value_reference WS+
+ sourcev=value WS+
target=value_reference WS*
R_PAREN
{
@@ -622,7 +622,7 @@ returns [Instruction result]
($IMP_ADD_ALL_KW.getLine()),
($IMP_ADD_ALL_KW.getCharPositionInLine())
),
- ($source.result),
+ ($sourcev.result),
($target.result)
);
}
@@ -773,7 +773,7 @@ returns [Instruction result]
);
}
- | IMP_POP_RIGHT_KW value_reference WS* R_PAREN
+ | IMP_POP_RIGHT_KW value_reference WS+ value WS* R_PAREN
{
$result =
PopElement.build
@@ -783,12 +783,13 @@ returns [Instruction result]
($IMP_POP_RIGHT_KW.getLine()),
($IMP_POP_RIGHT_KW.getCharPositionInLine())
),
+ ($value.result),
($value_reference.result),
false
);
}
- | IMP_POP_LEFT_KW value_reference WS* R_PAREN
+ | IMP_POP_LEFT_KW value_reference WS+ value WS* R_PAREN
{
$result =
PopElement.build
@@ -798,14 +799,15 @@ returns [Instruction result]
($IMP_POP_LEFT_KW.getLine()),
($IMP_POP_LEFT_KW.getCharPositionInLine())
),
+ ($value.result),
($value_reference.result),
true
);
}
| IMP_MAP_KW
- value WS+
- inr=value_reference WS+
+ fun=value WS+
+ in=value WS+
outr=value_reference WS*
R_PAREN
{
@@ -817,15 +819,15 @@ returns [Instruction result]
($IMP_MAP_KW.getLine()),
($IMP_MAP_KW.getCharPositionInLine())
),
- ($value.result),
- ($inr.result),
+ ($fun.result),
+ ($in.result),
($outr.result)
);
}
| IMP_INDEXED_MAP_KW
- value WS+
- inr=value_reference WS+
+ fun=value WS+
+ in=value WS+
outr=value_reference WS*
R_PAREN
{
@@ -837,8 +839,8 @@ returns [Instruction result]
($IMP_INDEXED_MAP_KW.getLine()),
($IMP_INDEXED_MAP_KW.getCharPositionInLine())
),
- ($value.result),
- ($inr.result),
+ ($fun.result),
+ ($in.result),
($outr.result)
);
}
@@ -846,8 +848,8 @@ returns [Instruction result]
| IMP_MERGE_KW
fun=value WS+
- inr0=value_reference WS+
- inr1=value_reference WS+
+ inv0=value WS+
+ inv1=value WS+
outr=value_reference WS*
R_PAREN
{
@@ -860,9 +862,9 @@ returns [Instruction result]
($IMP_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($inr0.result),
+ ($inv0.result),
null,
- ($inr1.result),
+ ($inv1.result),
null,
($outr.result)
);
@@ -871,9 +873,9 @@ returns [Instruction result]
| IMP_MERGE_KW
fun=value WS+
def0=value WS+
- inr0=value_reference WS+
+ inv0=value WS+
def1=value WS+
- inr1=value_reference WS+
+ inv1=value WS+
outr=value_reference WS*
R_PAREN
{
@@ -886,9 +888,9 @@ returns [Instruction result]
($IMP_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($inr0.result),
+ ($inv0.result),
($def0.result),
- ($inr1.result),
+ ($inv1.result),
($def1.result),
($outr.result)
);
@@ -897,7 +899,7 @@ returns [Instruction result]
| IMP_SUB_LIST_KW
vstart=value WS+
vend=value WS+
- inr=value_reference WS+
+ inv=value WS+
outr=value_reference WS*
R_PAREN
{
@@ -911,7 +913,7 @@ returns [Instruction result]
),
($vstart.result),
($vend.result),
- ($inr.result),
+ ($inv.result),
($outr.result)
);
}
@@ -1161,7 +1163,7 @@ returns [Instruction result]
}
| FOR_EACH_KW
- value_reference WS+ new_reference_name
+ coll=value WS+ new_reference_name
{
final Map<String, Variable> variable_map;
final Variable new_variable;
@@ -1170,7 +1172,7 @@ returns [Instruction result]
elem_type = Type.ANY;
- collection_type = ($value_reference.result).get_type();
+ collection_type = ($coll.result).get_type();
if (collection_type instanceof CollectionType)
{
@@ -1251,7 +1253,7 @@ returns [Instruction result]
($FOR_EACH_KW.getLine()),
($FOR_EACH_KW.getCharPositionInLine())
),
- ($value_reference.result),
+ ($coll.result),
($new_reference_name.result),
($general_fate_sequence.result)
);
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 74489f8..0712319 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
@@ -29,6 +29,7 @@ import tonkadur.wyrd.v1.compiler.util.Shuffle;
import tonkadur.wyrd.v1.compiler.util.RemoveAt;
import tonkadur.wyrd.v1.compiler.util.InsertAt;
import tonkadur.wyrd.v1.compiler.util.RemoveAllOf;
+import tonkadur.wyrd.v1.compiler.util.MapLambda;
import tonkadur.wyrd.v1.compiler.util.RemoveOneOf;
import tonkadur.wyrd.v1.compiler.util.ReverseList;
import tonkadur.wyrd.v1.compiler.util.CreateCons;
@@ -2077,7 +2078,42 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
)
throws Throwable
{
- /* TODO */
+ final ComputationCompiler lambda_cc, in_collection_cc;
+ final Register result;
+
+ result = reserve(TypeCompiler.compile(compiler, n.get_type()));
+
+ result_as_address = result.get_address();
+ result_as_computation = result.get_value();
+
+ lambda_cc = new ComputationCompiler(compiler);
+
+ n.get_lambda_function().get_visited_by(lambda_cc);
+
+ assimilate(lambda_cc);
+
+ in_collection_cc = new ComputationCompiler(compiler);
+
+ n.get_collection().get_visited_by(in_collection_cc);
+
+ assimilate(in_collection_cc);
+
+ init_instructions.add
+ (
+ MapLambda.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ lambda_cc.get_computation(),
+ in_collection_cc.get_address(),
+ 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 ba268f1..5d46b79 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
@@ -50,6 +50,7 @@ import tonkadur.wyrd.v1.compiler.util.NOP;
import tonkadur.wyrd.v1.compiler.util.While;
import tonkadur.wyrd.v1.compiler.util.Shuffle;
import tonkadur.wyrd.v1.compiler.util.Clear;
+import tonkadur.wyrd.v1.compiler.util.MapLambda;
import tonkadur.wyrd.v1.compiler.util.IterativeSearch;
import tonkadur.wyrd.v1.compiler.util.RemoveAllOf;
import tonkadur.wyrd.v1.compiler.util.RemoveOneOf;
@@ -652,7 +653,54 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
throws Throwable
{
- /* TODO */
+ final ComputationCompiler lambda_cc, in_collection_cc, out_collection_cc;
+
+ lambda_cc = new ComputationCompiler(compiler);
+
+ n.get_lambda_function().get_visited_by(lambda_cc);
+
+ if (lambda_cc.has_init())
+ {
+ result.add(lambda_cc.get_init());
+ }
+
+ in_collection_cc = new ComputationCompiler(compiler);
+
+ n.get_collection_in().get_visited_by(in_collection_cc);
+
+ if (in_collection_cc.has_init())
+ {
+ result.add(in_collection_cc.get_init());
+ }
+
+ out_collection_cc = new ComputationCompiler(compiler);
+
+ n.get_collection_out().get_visited_by(out_collection_cc);
+
+ if (out_collection_cc.has_init())
+ {
+ result.add(out_collection_cc.get_init());
+ }
+
+ result.add
+ (
+ MapLambda.generate
+ (
+ compiler.registers(),
+ compiler.assembler(),
+ lambda_cc.get_computation(),
+ in_collection_cc.get_address(),
+ out_collection_cc.get_address(),
+ (
+ (tonkadur.fate.v1.lang.type.CollectionType)
+ n.get_collection_out().get_type()
+ ).is_set()
+ )
+ );
+
+ lambda_cc.release_registers(result);
+ in_collection_cc.release_registers(result);
+ out_collection_cc.release_registers(result);
}
@Override
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java
new file mode 100644
index 0000000..8e8ae03
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java
@@ -0,0 +1,114 @@
+package tonkadur.wyrd.v1.compiler.util;
+
+import java.util.List;
+import java.util.ArrayList;
+
+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.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.lang.instruction.Initialize;
+
+import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager;
+
+public class AddElement
+{
+ /* Utility Class */
+ private AddElement () {}
+ public static Instruction generate
+ (
+ final RegisterManager registers,
+ final InstructionManager assembler,
+ final Computation element,
+ final Address collection,
+ final boolean is_set
+ )
+ {
+ final Register collection_size;
+ final List<Instruction> result;
+
+ result = new ArrayList<Instruction>();
+
+ collection_size = registers.reserve(Type.INT, result);
+
+ result.add
+ (
+ new SetValue(collection_size.get_address(), new Size(collection))
+ );
+
+
+ if (is_set)
+ {
+ final Register found, index;
+
+ index = registers.reserve(Type.INT, result);
+ found = registers.reserve(Type.BOOL, result);
+
+ result.add
+ (
+ BinarySearch.generate
+ (
+ registers,
+ assembler,
+ element,
+ collection_size.get_value(),
+ collection,
+ found.get_address(),
+ index.get_address()
+ )
+ );
+
+ result.add
+ (
+ If.generate
+ (
+ registers,
+ assembler,
+ Operation.not(found.get_value()),
+ InsertAt.generate
+ (
+ registers,
+ assembler,
+ index.get_address(),
+ element,
+ collection_size.get_value(),
+ collection
+ )
+ )
+ );
+
+ registers.release(index, result);
+ registers.release(found, result);
+ }
+ else
+ {
+ final Address new_elem_addr;
+
+ new_elem_addr =
+ new RelativeAddress
+ (
+ collection,
+ new Cast(collection_size.get_value(), Type.STRING),
+ element.get_type()
+ );
+
+ result.add(new Initialize(new_elem_addr));
+ result.add(new SetValue(new_elem_addr, element));
+ }
+
+ registers.release(collection_size, result);
+
+ return assembler.merge(result);
+ }
+}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java
new file mode 100644
index 0000000..580bcb1
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java
@@ -0,0 +1,142 @@
+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.type.MapType;
+
+import tonkadur.wyrd.v1.lang.meta.Instruction;
+import tonkadur.wyrd.v1.lang.meta.Computation;
+
+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 MapLambda
+{
+ /* Utility Class */
+ private MapLambda () {}
+
+ /* Uses Durstenfeld's shuffling algorithm */
+ public static Instruction generate
+ (
+ final RegisterManager registers,
+ final InstructionManager assembler,
+ final Computation lambda,
+ final Address collection_in,
+ final Address collection_out,
+ final boolean to_set
+ )
+ {
+ final List<Computation> params;
+ final List<Instruction> result, while_body;
+ final Register iterator, collection_in_size, storage;
+
+ params = new ArrayList<Computation>();
+ result = new ArrayList<Instruction>();
+ while_body = new ArrayList<Instruction>();
+
+ iterator = registers.reserve(Type.INT, result);
+ collection_in_size = registers.reserve(Type.INT, result);
+ storage =
+ registers.reserve
+ (
+ ((MapType) collection_out.get_target_type()).get_member_type(),
+ result
+ );
+
+ result.add(new SetValue(iterator.get_address(), Constant.ZERO));
+ result.add
+ (
+ new SetValue
+ (
+ collection_in_size.get_address(),
+ new Size(collection_in)
+ )
+ );
+
+ params.add
+ (
+ new ValueOf
+ (
+ new RelativeAddress
+ (
+ collection_in,
+ new Cast(iterator.get_value(), Type.STRING),
+ (
+ (MapType) collection_in.get_target_type()
+ ).get_member_type()
+ )
+ )
+ );
+
+ while_body.add
+ (
+ LambdaEvaluation.generate
+ (
+ registers,
+ assembler,
+ lambda,
+ /* Can't put it in the target collection directly, since that may
+ * be a set.
+ */
+ storage.get_address(),
+ params
+ )
+ );
+
+ while_body.add
+ (
+ AddElement.generate
+ (
+ registers,
+ assembler,
+ storage.get_value(),
+ collection_out,
+ to_set
+ )
+ );
+
+ while_body.add
+ (
+ new SetValue
+ (
+ iterator.get_address(),
+ Operation.plus(iterator.get_value(), Constant.ONE)
+ )
+ );
+
+ result.add
+ (
+ While.generate
+ (
+ registers,
+ assembler,
+ Operation.less_than
+ (
+ iterator.get_value(),
+ collection_in_size.get_value()
+ ),
+ assembler.merge(while_body)
+ )
+ );
+
+ registers.release(iterator, result);
+ registers.release(collection_in_size, result);
+ registers.release(storage, result);
+
+ return assembler.merge(result);
+ }
+}