about summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2025-12-17 16:33:06 +0000
committerArun Isaac2025-12-17 16:33:06 +0000
commit433650cdf5c74cf4016434bd11d313158bf9792d (patch)
treebd19564de1b9e5f853969edfb86f810d1c260386
parentbd4ccd3afdd185c1030336d86c2c15726f9e874a (diff)
downloadravanan-main.tar.gz
ravanan-main.tar.lz
ravanan-main.zip
javascript: Implement function body expressions. HEAD main
-rw-r--r--ravanan/javascript.scm18
-rw-r--r--tests/javascript.scm8
2 files changed, 25 insertions, 1 deletions
diff --git a/ravanan/javascript.scm b/ravanan/javascript.scm
index 1edad00..eebf082 100644
--- a/ravanan/javascript.scm
+++ b/ravanan/javascript.scm
@@ -82,6 +82,16 @@
 (define-peg-pattern javascript-expression all
   (and (ignore "$") javascript-subexpression))
 
+(define-peg-pattern javascript-function-body-subexpression body
+  (and "{"
+       (* (or (and (not-followed-by (or "{" "}"))
+                   peg-any)
+              javascript-function-body-subexpression))
+       "}"))
+
+(define-peg-pattern javascript-function-body all
+  (and (ignore "$") javascript-function-body-subexpression))
+
 (define-peg-pattern string-literal body
   (* (and (not-followed-by "$(")
           peg-any)))
@@ -89,6 +99,7 @@
 (define-peg-pattern javascript all
   (* (or parameter-reference
          javascript-expression
+         javascript-function-body
          string-literal)))
 
 (define* (evaluate-expression-tree-1 expression-tree context expression-lib)
@@ -146,7 +157,12 @@ keys @code{\"inputs\"}, @code{\"self\"} and @code{\"runtime\"}.
                                expression-lib)))))
     ;; This is a more complex javascript expression. Fall back to node.
     (('javascript-expression expression)
-     (evaluate-using-node expression context expression-lib))))
+     (evaluate-using-node expression context expression-lib))
+    ;; This is a javascript function body. Fall back to node.
+    (('javascript-function-body function-body)
+     (evaluate-using-node (string-append "(function() {" function-body "})()")
+                          context
+                          expression-lib))))
 
 (define (evaluate-using-node expression context expression-lib)
   "Evaluate javascript @var{expression} using the node javascript engine in
diff --git a/tests/javascript.scm b/tests/javascript.scm
index 9f86e7f..4a58f3a 100644
--- a/tests/javascript.scm
+++ b/tests/javascript.scm
@@ -178,4 +178,12 @@
   (evaluate-javascript-expression "$(1 - (2 - 1))"
                                   '()))
 
+(test-equal "evaluate javascript function body"
+  2
+  (evaluate-javascript-expression "${switch (inputs.message) { case \"foo\": return 1; case \"bar\": return 2; default: return 3}}"
+                                  '(("inputs" . (("message" . "bar")
+                                                 ("threads" . 48)))
+                                    ("self" . #f)
+                                    ("runtime" . #f))))
+
 (test-end "javascript")