Expressions language for Clojure(Script) and JavaScript inspired by Microsoft Excel ™
In some applications, the lion's share of business logic is concentrated in dynamic expressions. Often they are not even part of the code base and are stored in a database, files, or somewhere in the cloud. And sometimes these expressions need to be accessed non-technical personnel, like managers or call centers operators. Making them learn clojure or python is not fair. This library is designed to combine the best of two completely different worlds: the most understandable syntax from Excel and the speed of Clojure.
[io.xapix/axel-f "1.0.6"](set-env! :dependencies #(conj % [io.xapix/axel-f "1.0.6"])){:deps {io.xapix/axel-f {:mvn/version "1.0.6"}}}Please checkout the documentation for JavaScript package
(require '[axel-f.core :as axel-f])
;; Compile Excel-like formula into executable function
(def foo (axel-f/compile "AVERAGE({1, 2, 3})"))
(foo)
;; => 2
((axel-f/compile "SUM(1, 2, AVERAGE({4,5,6}), foo.bar, foo.baz[*].x)")
{:foo {:bar 1
:baz [{:x 5}
{:x 7}
{:x 8}]}})
;; => 29
;; axel-f.core/analyze function returns used variables
(axel-f/analyze "SUM(1, 2, AVERAGE({4,5,6}), foo.bar, foo.baz[*].x)")
;; => {:vars (("foo" "bar") ("foo" "baz" "*" "x"))}
In addition to a formula, the run function can accept execution context as a second argument. Context can be any valid Clojure(Script) object. In the formula you can select the data from context by using object reference operators:
foo.bar.bazfoo[*].bar
foo[*][*] we support nested vectors (vector of vectors of vectors ...)foo[*].bar[*].bazfoo[1].barfoo[SUM(x, 10)].bar_ can be used as a self reference. When used in special functions (MAP, FILTER, SORT) will reference single item of collection.#'' or just a string: #'bar > baz'[0].foo or 'foo -> bar'.bazFILTER or SORT possibly can return nested data structure and this data can be used as a root reference object: FILTER(_.x = 1, _)[0].x with context [{:x 2} {:x 1} {:x 3}] returns 1 as expected.True/False/true/false'Some String', "Some String"){1, 2 TRUE})Any expression can be used as an operand for any operator. axel-f has the same operator precedence as in Excel. To change a precendence of operators you can use round brackets ((2+2)*2 => 8)
-/+, eg. "-1") Can be used for coercing boolean into number (--TRUE => 1)2.4%) axel-f uses float as replacement (2.4% => 0.024).+/-)* and /)>)>=)<)<=)=)<>)^)&)Please check the wiki page
Copyright © 2018 Xapix GmbH, and contributors
Distributed under the Eclipse Public License, the same as Clojure.
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |