aboutsummaryrefslogtreecommitdiff
path: root/src/lux/base.clj
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lux/base.clj43
1 files changed, 29 insertions, 14 deletions
diff --git a/src/lux/base.clj b/src/lux/base.clj
index cd5801660..a8649816a 100644
--- a/src/lux/base.clj
+++ b/src/lux/base.clj
@@ -151,14 +151,21 @@
[["lux;Left" _]]
inputs))))
-(defmacro exec [steps return]
+(defmacro |do [steps return]
(assert (not= 0 (count steps)) "The steps can't be empty!")
(assert (= 0 (rem (count steps) 2)) "The number of steps must be even!")
(reduce (fn [inner [label computation]]
(case label
- :let `(let ~computation ~inner)
+ :let `(|let ~computation ~inner)
;; else
- `(bind ~computation (fn [~label] ~inner))))
+ ;; `(bind ~computation
+ ;; (fn [val#]
+ ;; (matchv ::M/objects [val#]
+ ;; [~label]
+ ;; ~inner)))
+ `(bind ~computation
+ (fn [~label] ~inner))
+ ))
return
(reverse (partition 2 steps))))
@@ -253,7 +260,7 @@
(return init)
[["lux;Cons" [x xs*]]]
- (exec [init* (f init x)]
+ (|do [init* (f init x)]
(fold% f init* xs*))))
(defn folds [f init xs]
@@ -299,6 +306,14 @@
[["lux;Cons" [[k v] plist*]]]
(|cons k (|keys plist*))))
+(defn |vals [plist]
+ (matchv ::M/objects [plist]
+ [["lux;Nil" _]]
+ (|list)
+
+ [["lux;Cons" [[k v] plist*]]]
+ (|cons v (|vals plist*))))
+
(defn |interpose [sep xs]
(matchv ::M/objects [xs]
[["lux;Nil" _]]
@@ -318,7 +333,7 @@
(return xs)
[["lux;Cons" [x xs*]]]
- (exec [y (f x)
+ (|do [y (f x)
;; :let [_ (prn '<name> 1 (class y))
;; _ (prn '<name> 2 (aget y 0))]
ys (<name> f xs*)]
@@ -351,7 +366,7 @@
"}}"))
(defn if% [text-m then-m else-m]
- (exec [? text-m]
+ (|do [? text-m]
(if ?
then-m
else-m)))
@@ -374,7 +389,7 @@
(fail message)))
(defn comp% [f-m g-m]
- (exec [temp g-m]
+ (|do [temp g-m]
(f-m temp)))
(defn pass [m-value]
@@ -388,7 +403,7 @@
(defn sequence% [m-values]
(matchv ::M/objects [m-values]
[["lux;Cons" [head tail]]]
- (exec [_ head]
+ (|do [_ head]
(sequence% tail))
[_]
@@ -447,13 +462,13 @@
((exhaust% step) state*)
[["lux;Left" msg]]
- ((exec [? source-consumed?]
+ ((|do [? source-consumed?]
(if ?
(return nil)
(fail* msg)))
state)
;; (if (= "[Reader Error] EOF" msg)
- ;; ((exec [? source-consumed?
+ ;; ((|do [? source-consumed?
;; :let [_ (prn '? ?)]]
;; (return nil))
;; state)
@@ -606,7 +621,7 @@
(|list)))
(def get-module-name
- (exec [module get-current-module-env]
+ (|do [module get-current-module-env]
(return (get$ "lux;name" module))))
(defn with-scope [name body]
@@ -620,9 +635,9 @@
output))))
(defn with-closure [body]
- (exec [closure-info (try-all% (|list (exec [top get-top-local-env]
+ (|do [closure-info (try-all% (|list (|do [top get-top-local-env]
(return (T true (->> top (get$ "lux;inner-closures") str))))
- (exec [global get-current-module-env]
+ (|do [global get-current-module-env]
(return (T false (->> global (get$ "lux;inner-closures") str))))))]
(matchv ::M/objects [closure-info]
[[local? closure-name]]
@@ -643,7 +658,7 @@
)))
(def get-scope-name
- (exec [module-name get-module-name]
+ (|do [module-name get-module-name]
(fn [state]
(return* state (->> state (get$ "lux;local-envs") (|map #(get$ "lux;name" %)) |reverse (|cons module-name))))))