summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java41
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/Type.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g427
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java6
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java10
5 files changed, 78 insertions, 7 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java
index 6c99aa4..7ea988b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java
@@ -1,5 +1,6 @@
package tonkadur.fate.v1.lang.computation;
+import java.util.ArrayList;
import java.util.List;
import tonkadur.parser.Origin;
@@ -9,6 +10,9 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.Variable;
+import tonkadur.fate.v1.lang.type.LambdaType;
+import tonkadur.fate.v1.lang.type.Type;
+
public class LambdaExpression extends Computation
{
/***************************************************************************/
@@ -20,22 +24,51 @@ public class LambdaExpression extends Computation
/***************************************************************************/
/**** PROTECTED ************************************************************/
/***************************************************************************/
+ protected LambdaExpression
+ (
+ final Origin origin,
+ final List<Variable> parameters,
+ final Computation function,
+ final Type type
+ )
+ {
+ super(origin, type);
+
+ this.function = function;
+ this.parameters = parameters;
+ }
/***************************************************************************/
/**** PUBLIC ***************************************************************/
/***************************************************************************/
/**** Constructors *********************************************************/
- public LambdaExpression
+ public static LambdaExpression build
(
final Origin origin,
final List<Variable> parameters,
final Computation function
)
{
- super(origin, function.get_type());
+ final List<Type> signature;
+ final LambdaType type;
- this.function = function;
- this.parameters = parameters;
+ signature = new ArrayList<Type>();
+
+ for (final Variable v: parameters)
+ {
+ signature.add(v.get_type());
+ }
+
+ type =
+ new LambdaType
+ (
+ origin,
+ function.get_type(),
+ "autogen",
+ signature
+ );
+
+ return new LambdaExpression(origin, parameters, function, type);
}
/**** Accessors ************************************************************/
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
index 92ff859..509bce4 100644
--- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
@@ -80,6 +80,7 @@ public class Type extends DeclaredEntity
SIMPLE_BASE_TYPES.add(FLOAT);
SIMPLE_BASE_TYPES.add(INT);
+ SIMPLE_BASE_TYPES.add(LAMBDA);
SIMPLE_BASE_TYPES.add(STRING);
SIMPLE_BASE_TYPES.add(BOOLEAN);
SIMPLE_BASE_TYPES.add(REF);
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 81b63e2..14accd4 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -418,7 +418,7 @@ catch [final Throwable e]
general_fate_instr
returns [Instruction result]
:
- L_PAREN WS+ general_fate_sequence WS* R_PAREN
+ L_PAREN WS* general_fate_sequence WS* R_PAREN
{
$result =
new InstructionList
@@ -1534,6 +1534,27 @@ returns [Type result]
("anonymous (" + ($type.result).get_name() + ") list type")
);
}
+
+ | LAMBDA_KW type WS* L_PAREN WS* type_list WS* R_PAREN WS* R_PAREN
+ {
+ final Origin start_origin;
+
+ start_origin =
+ CONTEXT.get_origin_at
+ (
+ ($LAMBDA_KW.getLine()),
+ ($LAMBDA_KW.getCharPositionInLine())
+ );
+
+ $result =
+ new LambdaType
+ (
+ start_origin,
+ ($type.result),
+ "auto_generated",
+ ($type_list.result)
+ );
+ }
;
catch [final Throwable e]
{
@@ -2314,7 +2335,7 @@ returns [Computation result]
}
| LAMBDA_KW
- L_PAREN WS+ variable_list WS* R_PAREN
+ L_PAREN WS* variable_list WS* R_PAREN
{
final Map<String, Variable> variable_map;
@@ -2330,7 +2351,7 @@ returns [Computation result]
R_PAREN
{
$result =
- new LambdaExpression
+ LambdaExpression.build
(
CONTEXT.get_origin_at
(
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 27f382d..2fe7e43 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
@@ -1763,6 +1763,12 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.addAll(compiler.registers().store_parameters(parameters));
+ /* Terminate current context */
+ result.addAll
+ (
+ compiler.registers().get_finalize_context_instructions()
+ );
+
result.addAll
(
compiler.registers().get_jump_to_context_instructions
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
index 7013e1e..9c20229 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
@@ -58,6 +58,11 @@ public class TypeCompiler
);
}
+ if (fate_type instanceof tonkadur.fate.v1.lang.type.LambdaType)
+ {
+ return Type.INT;
+ }
+
fate_type = fate_type.get_base_type();
if (fate_type.equals(tonkadur.fate.v1.lang.type.Type.BOOLEAN))
@@ -166,6 +171,11 @@ public class TypeCompiler
return MapType.MAP_TO_RICH_TEXT;
}
+ if (fate_content_type instanceof tonkadur.fate.v1.lang.type.LambdaType)
+ {
+ return MapType.MAP_TO_INT;
+ }
+
if (fate_content_type instanceof tonkadur.fate.v1.lang.type.PointerType)
{
return