| CI | status |
|---|---|
| Travis CI | |
| AppVeyor | |
| CircleCI | |
| CodeShip |
This is the interpreter of Lice language, a dialect of Lisp, run on JVM platform.
It supports call-by-value, call-by-name, call-by-need(we sometimes call it lazy evaluation) at the same time. Functions and values are treated as the same. Dynamic scoping, because I can't find a better scoping solution for a interpreted language.
See FeatureTest to learn more about the language's features.
Also, as the main repo for the Lice language, this repo will not be updated very frequently.
Instead, I do language feature experiments in The tiny version of Lice, which is more actively updated and not guarenteed be backward capable.
Once a feature is finished and tested, and not considered harmful, I'll copy the codes here and publish releases.
; print a string (print "Hello " "World" "\n") ; travel through a range (for-each i (.. 1 10) (print i "\n")) ; define a call-by-name function (defexpr fold ls init op (for-each index-var ls (-> init (op init index-var)))) ; invoke the function defined above (fold (.. 1 4) 0 +) ; passing a call-by-value lambda to a call-by-value lambda ((lambda op (op 3 4)) (lambda a b (+ (* a a) (* b b)))) ; to define a call-by-need lambda, use `lazy`. To use Lice with build tools, first add jcenter to your repositories list.
With gradle, add this to your dependencies list:
compile 'org.lice:lice:3.3.2'Or with maven:
<dependency> <groupId>org.lice</groupId> <artifactId>lice</artifactId> <version>3.3.2</version> <type>pom</type> </dependency>Or with ivy:
<dependency org='org.lice' name='lice' rev='3.3.2'> <artifact name='lice' ext='pom'/> </dependency>Alternatively, you can download the nightly jar for the newest commit on AppVeyor.
import javax.script.*; public class LiceScriptEngineTest { public static void main() throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName("lice"); engine.eval("(-> x 10)"); engine.eval("(print x)"); } }Code to run:
; loops (def loop count block (|> (-> i 0) (while (< i count) (|> (block i) (-> i (+ i 1)))))) ; invoking the function (loop 200000 (lambda i (|> (defexpr let x y block (|> (-> x y) ; this is actually an issue of lice. (block) (undef x))) (let reimu 100 (lambda (|> x)))))) (print "loop count: " i) Environment: Ubuntu Linux 16.04, HotSpot 1.8u151, Intel core i7 4720HQ 2.6 GHz
| Condition | Time |
|---|---|
Lice call Java using extern | 350ms |
| Lice call Java using Lice API | 295ms |
| Pure Java | 13ms |
| Pure Lice | 897ms |
| Java call Lice using Lice API | 629ms |
Lice has handy APIs for interacting with Java.
; declare an extern function ; must be a static Java function (extern "java.util.Objects" "equals") ; calling the extern function (equals 1 1) This project provides handy APIs for running Lice codes from Java.
class SomeClass { public static void main(String[] args){ // Running Lice System.out.println(Lice.run("(+ 1 1)")); // prints 2 System.out.println(Lice.run(new File("example.lice"))); // run codes in a file // Lice API SymbolList env = new SymbolList(); Lice.run("(def blablabla a (+ a a)) (-> myVar 233)", env); env.extractLiceFunction("blablabla").invoke(233); // result: 466 int var = ((Number) env.extractLiceVariable("myVar")).intValue(); // result: 233 } }