This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch NLPCRAFT-206
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-206 by this push:
     new 1760721  WIP.
1760721 is described below

commit 17607216cb68e65633b5ab3780ef224c3f4449fd
Author: Aaron Radzinski <[email protected]>
AuthorDate: Mon Mar 15 17:44:59 2021 -0700

    WIP.
---
 .../apache/nlpcraft/model/intent/NCDslTerm.scala   |   4 +
 .../model/intent/compiler/NCDslCompiler.scala      |   3 +-
 .../model/intent/compiler/NCDslCompilerBase.scala  | 179 +++++++++++----------
 .../model/intent/compiler/NCDslStack.scala         |   2 +-
 4 files changed, 98 insertions(+), 90 deletions(-)

diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCDslTerm.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCDslTerm.scala
index 6002359..52efa05 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCDslTerm.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCDslTerm.scala
@@ -29,6 +29,7 @@ import org.apache.nlpcraft.model.NCToken
  * @param conv
  */
 case class NCDslTerm(
+    dsl: String,
     id: Option[String],
     pred: NCDslTokenPredicate,
     min: Int,
@@ -46,6 +47,7 @@ case class NCDslTerm(
      */
     def cloneWithFragMeta(meta: Map[String, Any]): NCDslTerm =
         NCDslTerm(
+            dsl,
             id,
             pred,
             min,
@@ -53,4 +55,6 @@ case class NCDslTerm(
             conv,
             meta
         )
+
+    override def toString: String = dsl
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompiler.scala
index b1caa38..3c582c6 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompiler.scala
@@ -112,7 +112,7 @@ object NCDslCompiler extends LazyLogging {
         override def exitAlias(ctx: IDP.AliasContext): Unit = alias = 
ctx.id().getText
     
         override def enterCallExpr(ctx: IDP.CallExprContext): Unit =
-            instrs += ((_, stack: NCDslStack, _) ⇒ stack.push(stack.MARKER))
+            instrs += ((_, stack: NCDslStack, _) ⇒ 
stack.push(stack.PLIST_MARKER))
     
         /**
          *
@@ -276,6 +276,7 @@ object NCDslCompiler extends LazyLogging {
 
             // Add term.
             terms += NCDslTerm(
+                ctx.getText,
                 Option(termId),
                 pred,
                 min,
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompilerBase.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompilerBase.scala
index 4ea07fb..64af438 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompilerBase.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslCompilerBase.scala
@@ -455,7 +455,7 @@ trait NCDslCompilerBase {
         val fun = id.getText
     
         def ensureStack(min: Int): Unit = if (stack.size < min) throw 
rtMinParamNumError(min, fun)
-        def delMarker(): Unit = require(pop1() == stack.MARKER)
+        def delMarker(): Unit = require(pop1() == stack.PLIST_MARKER)
         def arg[X](min: Int, f: () ⇒ X): X = {
             ensureStack(min + 1) // +1 for the frame marker.
             
@@ -470,7 +470,7 @@ trait NCDslCompilerBase {
         def arg2(): (T, T) = arg(1, pop2)
         def arg3(): (T, T, T) = arg(1, pop3)
         def arg1Tok(): T =
-            if (stack.nonEmpty && stack.top == stack.MARKER) {
+            if (stack.nonEmpty && stack.top == stack.PLIST_MARKER) {
                 delMarker()
             
                 () ⇒ Z(tok, true)
@@ -519,7 +519,7 @@ trait NCDslCompilerBase {
         def doList(): Unit = {
             val dump = new S() // Empty list is allowed.
 
-            while (stack.nonEmpty && stack.top != stack.MARKER)
+            while (stack.nonEmpty && stack.top != stack.PLIST_MARKER)
                 dump += stack.pop()
 
             delMarker()
@@ -658,21 +658,24 @@ trait NCDslCompilerBase {
             })
         }
 
+        def z[Y](args: () ⇒ Y, body: Y ⇒ Z): Unit = args() match { case x ⇒ 
stack.push(() ⇒ body(x)) }
+        def z0(body: () ⇒ Z): Unit = { delMarker(); stack.push(() ⇒ body()) } 
+
         fun match {
             // Metadata access.
-            case "meta_part" ⇒ arg2() match { case (x1, x2) ⇒ stack.push(() ⇒ 
{ val Z(v1, f1) = x1(); val Z(v2, f2) = x2(); 
Z(toToken(v1).meta[Object](toStr(v2)), f1 || f2) }) }
-            case "meta_token" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(tok.meta[Object](toStr(v)), true) }) }
-            case "meta_model" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(tok.getModel.meta[Object](toStr(v)), false) }) }
-            case "meta_intent" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(termCtx.intentMeta.get(toStr(v)).orNull, false) }) }
-            case "meta_req" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(termCtx.req.getRequestData.get(toStr(v)), false) }) }
-            case "meta_user" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(termCtx.req.getUser.getMetadata.get(toStr(v)), false) }) }
-            case "meta_company" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { 
val Z(v, _) = x(); Z(termCtx.req.getCompany.getMetadata.get(v), false) }) }
-            case "meta_sys" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(U.sysEnv(toStr(v)).orNull, false) }) }
-            case "meta_conv" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, _) = x(); Z(termCtx.convMeta.get(toStr(v)).orNull, false) }) }
-            case "meta_frag" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(termCtx.fragMeta.get(toStr(v)).orNull, f) }) }
+            case "meta_part" ⇒ z[(T, T)](arg2, { x ⇒ val Z(v1, f1) = x._1(); 
val Z(v2, f2) = x._2(); Z(toToken(v1).meta[Object](toStr(v2)), f1 || f2) })
+            case "meta_token" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(tok.meta[Object](toStr(v)), true) })
+            case "meta_model" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(tok.getModel.meta[Object](toStr(v)), false) })
+            case "meta_intent" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(termCtx.intentMeta.get(toStr(v)).orNull, false) })
+            case "meta_req" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(termCtx.req.getRequestData.get(toStr(v)), false) })
+            case "meta_user" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(termCtx.req.getUser.getMetadata.get(toStr(v)), false) })
+            case "meta_company" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(termCtx.req.getCompany.getMetadata.get(v), false) })
+            case "meta_sys" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(U.sysEnv(toStr(v)).orNull, false) })
+            case "meta_conv" ⇒ z[T](arg1, { x ⇒ val Z(v, _) = x(); 
Z(termCtx.convMeta.get(toStr(v)).orNull, false) })
+            case "meta_frag" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(termCtx.fragMeta.get(toStr(v)).orNull, f) })
 
             // Converts JSON to map.
-            case "json" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(U.jsonToJavaMap(asStr(v)), f) }) }
+            case "json" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(U.jsonToJavaMap(asStr(v)), f) })
 
             // Inline if-statement.
             case "if" ⇒ doIf()
@@ -691,41 +694,41 @@ trait NCDslCompilerBase {
             case "parts" ⇒ doParts()
 
             // Request data.
-            case "req_id" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getServerRequestId, false))
-            case "req_normtext" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getNormalizedText, false))
-            case "req_tstamp" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getReceiveTimestamp, false))
-            case "req_addr" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getRemoteAddress.orElse(null), false))
-            case "req_agent" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getClientAgent.orElse(null), false))
+            case "req_id" ⇒ z0(() ⇒ Z(termCtx.req.getServerRequestId, false))
+            case "req_normtext" ⇒ z0(() ⇒ Z(termCtx.req.getNormalizedText, 
false))
+            case "req_tstamp" ⇒ z0(() ⇒ Z(termCtx.req.getReceiveTimestamp, 
false))
+            case "req_addr" ⇒ z0(() ⇒ 
Z(termCtx.req.getRemoteAddress.orElse(null), false))
+            case "req_agent" ⇒ z0(() ⇒ 
Z(termCtx.req.getClientAgent.orElse(null), false))
 
             // User data.
-            case "user_id" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getUser.getId, false))
-            case "user_fname" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getUser.getFirstName, false))
-            case "user_lname" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getUser.getLastName, false))
-            case "user_email" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getUser.getEmail, false))
-            case "user_admin" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getUser.isAdmin, false))
-            case "user_signup_tstamp" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getUser.getSignupTimestamp, false))
+            case "user_id" ⇒ z0(() ⇒ Z(termCtx.req.getUser.getId, false))
+            case "user_fname" ⇒ z0(() ⇒ Z(termCtx.req.getUser.getFirstName, 
false))
+            case "user_lname" ⇒ z0(() ⇒ Z(termCtx.req.getUser.getLastName, 
false))
+            case "user_email" ⇒ z0(() ⇒ Z(termCtx.req.getUser.getEmail, false))
+            case "user_admin" ⇒ z0(() ⇒ Z(termCtx.req.getUser.isAdmin, false))
+            case "user_signup_tstamp" ⇒ z0(() ⇒ 
Z(termCtx.req.getUser.getSignupTimestamp, false))
 
             // Company data.
-            case "comp_id" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getId, false))
-            case "comp_name" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getName, false))
-            case "comp_website" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getWebsite, false))
-            case "comp_country" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getCountry, false))
-            case "comp_region" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getRegion, false))
-            case "comp_city" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getCity, false))
-            case "comp_addr" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getAddress, false))
-            case "comp_postcode" ⇒ delMarker(); stack.push(() ⇒ 
Z(termCtx.req.getCompany.getPostalCode, false))
+            case "comp_id" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getId, false))
+            case "comp_name" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getName, 
false))
+            case "comp_website" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getWebsite, 
false))
+            case "comp_country" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getCountry, 
false))
+            case "comp_region" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getRegion, 
false))
+            case "comp_city" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getCity, 
false))
+            case "comp_addr" ⇒ z0(() ⇒ Z(termCtx.req.getCompany.getAddress, 
false))
+            case "comp_postcode" ⇒ z0(() ⇒ 
Z(termCtx.req.getCompany.getPostalCode, false))
 
             // String functions.
-            case "trim" | "strip" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { 
val Z(v, f) = x(); Z(toStr(v).trim, f) }) }
-            case "uppercase" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(toStr(v).toUpperCase, f) }) }
-            case "lowercase" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(toStr(v).toLowerCase, f) }) }
-            case "is_alpha" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(StringUtils.isAlpha(toStr(v)), f) }) }
-            case "is_alphanum" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(StringUtils.isAlphanumeric(toStr(v)), f) }) }
-            case "is_whitespace" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { 
val Z(v, f) = x(); Z(StringUtils.isWhitespace(toStr(v)), f) }) }
-            case "is_num" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(StringUtils.isNumeric(toStr(v)), f) }) }
-            case "is_numspace" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(StringUtils.isNumericSpace(toStr(v)), f) }) }
-            case "is_alphaspace" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { 
val Z(v, f) = x(); Z(StringUtils.isAlphaSpace(toStr(v)), f) }) }
-            case "is_alphanumspace" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ 
{ val Z(v, f) = x(); Z(StringUtils.isAlphanumericSpace(toStr(v)), f) }) }
+            case "trim" | "strip" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(toStr(v).trim, f) })
+            case "uppercase" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(toStr(v).toUpperCase, f) })
+            case "lowercase" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(toStr(v).toLowerCase, f) })
+            case "is_alpha" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isAlpha(toStr(v)), f) })
+            case "is_alphanum" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isAlphanumeric(toStr(v)), f) })
+            case "is_whitespace" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isWhitespace(toStr(v)), f) })
+            case "is_num" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isNumeric(toStr(v)), f) })
+            case "is_numspace" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isNumericSpace(toStr(v)), f) })
+            case "is_alphaspace" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isAlphaSpace(toStr(v)), f) })
+            case "is_alphanumspace" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(StringUtils.isAlphanumericSpace(toStr(v)), f) }) 
             case "substring" ⇒
             case "charAt" ⇒
             case "regex" ⇒
@@ -741,31 +744,31 @@ trait NCDslCompilerBase {
 
                 Z(Math.ceil(toJDouble(v)), f)
             }) }
-            case "floor" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.floor(toJDouble(v)), f) }) }
-            case "rint" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.rint(toJDouble(v)), f) }) }
-            case "round" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.round(toJDouble(v)), f) }) }
-            case "signum" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.signum(toJDouble(v)), f) }) }
-            case "sqrt" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.sqrt(toJDouble(v)), f) }) }
-            case "cbrt" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.cbrt(toJDouble(v)), f) }) }
-            case "acos" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.acos(toJDouble(v)), f) }) }
-            case "asin" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.asin(toJDouble(v)), f) }) }
-            case "atan" ⇒ arg1() match { case x ⇒ stack.push(() ⇒{ val Z(v, f) 
= x(); Z( Math.atan(toJDouble(v)), f) }) }
-            case "cos" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, f) 
= x(); Z(Math.cos(toJDouble(v)), f) }) }
-            case "sin" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, f) 
= x(); Z(Math.sin(toJDouble(v)), f) }) }
-            case "tan" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, f) 
= x(); Z(Math.tan(toJDouble(v)), f) }) }
-            case "cosh" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.cosh(toJDouble(v)), f) }) }
-            case "sinh" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.sinh(toJDouble(v)), f) }) }
-            case "tanh" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.tanh(toJDouble(v)), f) }) }
-            case "atn2" ⇒ arg2() match { case (x1, x2) ⇒ stack.push(() ⇒ { val 
Z(v1, f1) = x1(); val Z(v2, f2) = x2(); Z(Math.atan2(toJDouble(v1), 
toJDouble(v2)), f1 || f2) }) }
-            case "degrees" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(Math.toDegrees(toJDouble(v)), f) }) }
-            case "radians" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z( Math.toRadians(toJDouble(v)), f) }) }
-            case "exp" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, f) 
= x(); Z(Math.exp(toJDouble(v)), f) }) }
-            case "expm1" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.expm1(toJDouble(v)), f) }) }
-            case "hypot" ⇒ arg2() match { case (x1, x2) ⇒ stack.push(() ⇒ { 
val Z(v1, f1) = x1(); val Z(v2, f2) = x2(); Z(Math.hypot(toJDouble(v1), 
toJDouble(v2)), f1 || f2) }) }
-            case "log" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, f) 
= x(); Z(Math.log(toJDouble(v)), f) }) }
-            case "log10" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.log10(toJDouble(v)), f) }) }
-            case "log1p" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(Math.log1p(toJDouble(v)), f) }) }
-            case "pow" ⇒ arg2() match { case (x1, x2) ⇒ stack.push(() ⇒ { val 
Z(v1, f1) = x1(); val Z(v2, f2) = x2(); Z(Math.pow(toJDouble(v1), 
toJDouble(v2)), f1 || f2) }) }
+            case "floor" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.floor(toJDouble(v)), f) }) 
+            case "rint" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.rint(toJDouble(v)), f) }) 
+            case "round" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.round(toJDouble(v)), f) }) 
+            case "signum" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.signum(toJDouble(v)), f) }) 
+            case "sqrt" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.sqrt(toJDouble(v)), f) }) 
+            case "cbrt" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.cbrt(toJDouble(v)), f) }) 
+            case "acos" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.acos(toJDouble(v)), f) }) 
+            case "asin" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.asin(toJDouble(v)), f) }) 
+            case "atan" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); Z( 
Math.atan(toJDouble(v)), f) }) 
+            case "cos" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.cos(toJDouble(v)), f) }) 
+            case "sin" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.sin(toJDouble(v)), f) }) 
+            case "tan" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.tan(toJDouble(v)), f) }) 
+            case "cosh" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.cosh(toJDouble(v)), f) }) 
+            case "sinh" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.sinh(toJDouble(v)), f) }) 
+            case "tanh" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.tanh(toJDouble(v)), f) }) 
+            case "atn2" ⇒ z[(T, T)](arg2, { x ⇒ val Z(v1, f1) = x._1(); val 
Z(v2, f2) = x._2(); Z(Math.atan2(toJDouble(v1), toJDouble(v2)), f1 || f2) }) 
+            case "degrees" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.toDegrees(toJDouble(v)), f) }) 
+            case "radians" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); Z( 
Math.toRadians(toJDouble(v)), f) }) 
+            case "exp" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.exp(toJDouble(v)), f) }) 
+            case "expm1" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.expm1(toJDouble(v)), f) }) 
+            case "hypot" ⇒ z[(T, T)](arg2, { x ⇒ val Z(v1, f1) = x._1(); val 
Z(v2, f2) = x._2(); Z(Math.hypot(toJDouble(v1), toJDouble(v2)), f1 || f2) }) 
+            case "log" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.log(toJDouble(v)), f) }) 
+            case "log10" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.log10(toJDouble(v)), f) }) 
+            case "log1p" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(Math.log1p(toJDouble(v)), f) }) 
+            case "pow" ⇒ z[(T, T)](arg2, { x ⇒ val Z(v1, f1) = x._1(); val 
Z(v2, f2) = x._2(); Z(Math.pow(toJDouble(v1), toJDouble(v2)), f1 || f2) }) 
             case "square" ⇒ doSquare()
             case "pi" ⇒ delMarker(); stack.push(() ⇒ Z(Math.PI, false))
             case "euler" ⇒ delMarker(); stack.push(() ⇒ Z(Math.E, false))
@@ -780,13 +783,13 @@ trait NCDslCompilerBase {
             case "tail" ⇒
             case "add" ⇒
             case "remove" ⇒
-            case "first" ⇒
-            case "last" ⇒
-            case "keys" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(new util.ArrayList(toJMap(v).keySet()), f) }) }
-            case "values" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val Z(v, 
f) = x(); Z(new util.ArrayList(toJMap(v).values()), f) }) }
+            case "first" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); val lst = 
toJList(v); Z(if (lst.isEmpty) null else lst.get(0).asInstanceOf[Object], f)}) 
+            case "last" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); val lst = 
toJList(v); Z(if (lst.isEmpty) null else lst.get(lst.size() - 
1).asInstanceOf[Object], f)}) 
+            case "keys" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); Z(new 
util.ArrayList(toJMap(v).keySet()), f) }) 
+            case "values" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); Z(new 
util.ArrayList(toJMap(v).values()), f) }) 
             case "take" ⇒
             case "drop" ⇒
-            case "size" | "count" | "length" ⇒ arg1() match { case x ⇒ 
stack.push(() ⇒ { val Z(v, f) = x(); Z(toJList(v).size(), f)}) }
+            case "size" | "count" | "length" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = 
x(); Z(toJList(v).size(), f)}) 
             case "reverse" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ {
                 val Z(v, f) = x()
 
@@ -796,9 +799,9 @@ trait NCDslCompilerBase {
 
                 Z(jl, f)
             }) }
-            case "is_empty" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(toJList(v).isEmpty, f) }) }
-            case "non_empty" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(!toJList(v).isEmpty, f) }) }
-            case "to_string" ⇒ arg1() match { case x ⇒ stack.push(() ⇒ { val 
Z(v, f) = x(); Z(toJList(v).asScala.map(_.toString).asJava, f) }) }
+            case "is_empty" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(toJList(v).isEmpty, f) }) 
+            case "non_empty" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(!toJList(v).isEmpty, f) }) 
+            case "to_string" ⇒ z[T](arg1, { x ⇒ val Z(v, f) = x(); 
Z(toJList(v).asScala.map(_.toString).asJava, f) }) 
 
             // Statistical operations.
             case "avg" ⇒
@@ -808,18 +811,18 @@ trait NCDslCompilerBase {
             case "sum" ⇒
 
             // Date-time functions.
-            case "year" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalDate.now.getYear, false)) // 2021.
-            case "month" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalDate.now.getMonthValue, false)) // 1 ... 12.
-            case "day_of_month" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalDate.now.getDayOfMonth, false)) // 1 ... 31.
-            case "day_of_week" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalDate.now.getDayOfWeek.getValue, false))
-            case "day_of_year" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalDate.now.getDayOfYear, false))
-            case "hour" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalTime.now.getHour, false))
-            case "minute" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalTime.now.getMinute, false))
-            case "second" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalTime.now.getSecond, false))
-            case "week_of_month" ⇒ delMarker(); stack.push(() ⇒ 
Z(Calendar.getInstance().get(Calendar.WEEK_OF_MONTH), false))
-            case "week_of_year" ⇒ delMarker(); stack.push(() ⇒ 
Z(Calendar.getInstance().get(Calendar.WEEK_OF_YEAR), false))
-            case "quarter" ⇒ delMarker(); stack.push(() ⇒ 
Z(LocalDate.now().get(IsoFields.QUARTER_OF_YEAR), false))
-            case "now" ⇒ delMarker(); stack.push(() ⇒ 
Z(System.currentTimeMillis(), false)) // Epoc time.
+            case "year" ⇒ z0(() ⇒ Z(LocalDate.now.getYear, false)) // 2021.
+            case "month" ⇒ z0(() ⇒ Z(LocalDate.now.getMonthValue, false)) // 1 
... 12.
+            case "day_of_month" ⇒ z0(() ⇒ Z(LocalDate.now.getDayOfMonth, 
false)) // 1 ... 31.
+            case "day_of_week" ⇒ z0(() ⇒ 
Z(LocalDate.now.getDayOfWeek.getValue, false))
+            case "day_of_year" ⇒ z0(() ⇒ Z(LocalDate.now.getDayOfYear, false))
+            case "hour" ⇒ z0(() ⇒ Z(LocalTime.now.getHour, false))
+            case "minute" ⇒ z0(() ⇒ Z(LocalTime.now.getMinute, false))
+            case "second" ⇒ z0(() ⇒ Z(LocalTime.now.getSecond, false))
+            case "week_of_month" ⇒ z0(() ⇒ 
Z(Calendar.getInstance().get(Calendar.WEEK_OF_MONTH), false))
+            case "week_of_year" ⇒ z0(() ⇒ 
Z(Calendar.getInstance().get(Calendar.WEEK_OF_YEAR), false))
+            case "quarter" ⇒ z0(() ⇒ 
Z(LocalDate.now().get(IsoFields.QUARTER_OF_YEAR), false))
+            case "now" ⇒ z0(() ⇒ Z(System.currentTimeMillis(), false)) // Epoc 
time.
 
             case _ ⇒ throw rtUnknownFunError(fun) // Assertion.
         }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslStack.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslStack.scala
index 09c26b9..4ededea 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslStack.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCDslStack.scala
@@ -45,5 +45,5 @@ class NCDslStack extends mutable.ArrayStack[NCDslStackType] {
     /**
       * Special marker for stack frames.
       */
-    final val MARKER: NCDslStackType = () ⇒ { NCDslStackItem(null, false) }
+    final val PLIST_MARKER: NCDslStackType = () ⇒ { NCDslStackItem(null, 
false) }
 }

Reply via email to