______ _ _
| _ \ | | (_)
| | | |__ _ _ __ | | _ ___ _ __
| | | / _ | '_ \| | | / __| '_ \
| |/ / (_| | | | | |___| \__ \ |_) |
|___/ \__,_|_| |_\_____/_|___/ .__/
| |
|_|
To get a basic REPL
go run cmd/danlisp/danlisp.go
To run a file
go run cmd/danlisp/danlisp.go <filename>
There are example programs here
DanLisp uses paranthesized prefix notation, which will be familiar to anyone who has seen any other Lisp-like language.
There are three types of literal so far; strings, numbers and nil.
eg
3
3.0
3.35
"foo"
"bar"
nil
All the basic mathematical operators are present
(+ 2 2)
(- 12 7)
(* 5 2)
(/ 100 5)
Equality is a single =
(= 2 2)
Operators can be nested unambiguously
(+ 2 (- 10 5))
(+ (- 2 10) 5)
There are also logical operators for comparison, lt
and gt
for less than and greater than.
(lt 2 10)
(gt 1000 10)
There are boolean operators for combining conditions
(and (= 2 2) (= 4 (+ 2 2)))
(or (= 2 2) (= 5 (+ 2 2)))
Printing to stdout
is done with prn
(prn "Hello world")
(set name "Dan")
(prn "Hello" name)
If prn
is given more than one argument it will print them all with a seperating space.
Variables can be declared using set
(set i 10)
(set name "Dan")
Variables are fully mutable. Example of incrememnting a variable.
(set count 1)
(set count (+ count 1))
It is possible to overwrite any builtin functions and keywords with user defined variables but don't do this.
The if
function will execute the first branch if the condition is true, and the second if it is false. It has the form
(if cond
true-branch
false-branch)
For example
(if (gt 99999 n)
(prn n "is a really big number")
(prn n "is not that big"))
Any value that is not nil
will evaluate to true
. For conveniance the symbol t
is provided and is set to true.
There is one type of loop in DanLisp currently, the while
loop of the form.
(while cond
body)
For example to print "hello world" forever,
(while t
(prn "hello world"))
You can simulate a for
loop with a more verbose while
,
(set i 1)
(while (lt i 10)
(prn "Square of" i "is" (* i i))
(set i (+ i 1)))
Functions can be defined using defn
in the form of
(defn function-name (arglist)
body)
For example a function that says hello
(defn say-hello (name)
(prn "Hello" name))
or a function to add two numbers
(defn adder (a b)
(+ a b))
The last expression in the function will implicitly be the return value. There is no way to return early.