From 050f7c661b0bbeb57d3d5d8078d686c523aa698d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 15 Nov 2010 17:06:30 +0300 Subject: [PATCH] Function types and literals --- examples/src/FunctionsAndTypes.jetl | 1 + grammar/src/expressions.grm | 4 +++- grammar/src/types.grm | 18 +++++++++++++++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/examples/src/FunctionsAndTypes.jetl b/examples/src/FunctionsAndTypes.jetl index 543a1f6475f..3c85e50fb4a 100644 --- a/examples/src/FunctionsAndTypes.jetl +++ b/examples/src/FunctionsAndTypes.jetl @@ -26,6 +26,7 @@ val f1 = {(t : T) : X => something(t)} fun f1(t : T) : X = something(t) val f1 = {(t : T) => something(t)} +val f1 = {(T) : X => something(it)} val f1 = {t => something(t)} val f1 = {something(it)} diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index d769b947b02..9e5fad9a351 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -26,7 +26,9 @@ tupleLiteral ; functionLiteral - : "{" (parameter | SimpleName)* "=>" expression "}" + : "{" SimpleName "=>" expression "}" + : "{" functionTypeContents "=>" expression "}" + : "{" "(" parameter{","} ")" "=>" expression "}" ; constructorInvocation diff --git a/grammar/src/types.grm b/grammar/src/types.grm index cd01d0768e5..eaadb9bc7f6 100644 --- a/grammar/src/types.grm +++ b/grammar/src/types.grm @@ -15,15 +15,27 @@ type ; userType - : name ("<" type{","} ">")? + : name ("<" (projectionSpecifier type){","} ">")? + ; + +projectionSpecifier + : "in" + : "out" + : empty ; functionType - : "{" type{","} "=>" type "}" + : "{" functionTypeContents "}" + ; + +functionTypeContents + : "(" (parameter | type){","} ")" ":" type ; tupleType - : "(" type"{","} ")" + : "(" type{","} ")" ; +//////////////////////////////////////// +