aboutsummaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/fstring.neb35
1 files changed, 35 insertions, 0 deletions
diff --git a/libs/fstring.neb b/libs/fstring.neb
new file mode 100644
index 0000000..5edddca
--- /dev/null
+++ b/libs/fstring.neb
@@ -0,0 +1,35 @@
+
+; bugs:
+;#16> (fmt "{x} x {")
+;exception! <class 'NameError'> name 'ev' is not defined
+
+
+(func fmt :string (inp :string)
+ ; need two variables
+ ; 1. the current processed string
+ ; 2. the neb code to run
+ ;
+ ; algorithm
+ ; - read characters one by one, adding to result
+ ; - if reach a {
+ ; - read characters one by one, adding to neb code
+ ; - when reach }, try to execute the neb code,
+ ; then append to the end of the result
+ ; - if the end of the string is successfully reached, return the result
+
+ (func brace-parse :[:string] (str :string cur :string)
+ ; returns (remaining value)
+ (if (eq? "}" (first-char str))
+ (list (rest-char str) (->string (eval (parse-neb cur))))
+ (brace-parse (rest-char str) (concat cur (first-char str)))))
+
+ (func inner-parse (str cur)
+ (branch
+ ((eq? 0 (length str)) cur)
+ ((eq? "{" (first-char str))
+ (block
+ (def tmp (brace-parse (rest-char str) ""))
+ (inner-parse (first tmp) (concat cur (first (rest tmp))))))
+ (#true (inner-parse (rest-char str) (concat cur (first-char str))))))
+
+ (inner-parse inp ""))