Didactic Lisp interpreter in Python
REPL mode:
$ python lispy.py
lispy v0.0.1
>>> (quote 1 2 3)
(1 2 3)
>>> (+ 1 2 3)
6
>>> (+ 1 2 (+ 3 4) 5)
15
Interpreter mode:
$ python lispy.py hello_world.lisp
Hello, world!
$ python test_lispy.pyquote: Avoid evaluation of the given argument
>>> (quote foo)
foo
>>> (quote (1 2 foo))
(1 2 foo)defun: Define functions in global scope
>>> (defun area (r)
(* 3.14 (pow r 2)))
:area
>>> (area 10)
314.0if: Conditional expression
>>> (set password "123456")
nil
>>> (if (= (get password) "123456")
(write "Logged in")
(write "Wrong password"))
Logged in
nil
>>> (set password "654321")
nil
>>> (if (= (get password) "123456")
(write "Logged in")
(write "Wrong password"))
Wrong password
nillet: Create local variables
>>> (let ((x 1)
(y 2))
(+ x y))
3progn: Execute sequential expressions
>>> (progn
(write "Hello")
(write "What's your name?"))
Hello
What's your name?
nilatom: Return true for all values except lists
>>> (atom nil)
t
>>> (atom t)
t
>>> (atom 1)
t
>>> (atom 1.5)
t
>>> (atom "abc")
t
>>> (atom (list 1 2 3))
nilcar: Return first value of a list or nil
>>> (car (1 2 3))
1
>>> (car (1 2))
1
>>> (car (1))
1
>>> (car ())
nil
>>> (car nil)
nilcdr: Return tail of list or nil
>>> (cdr (1 2 3))
(2 3)
>>> (cdr (1 2))
(2)
>>> (cdr (1))
nil
>>> (cdr ())
nil
>>> (cdr nil)
nilcons: Append element to given list
>>> (cons 1 nil)
(1)
>>> (cons 1 (list 2 3))
(1 2 3)
>>> (cons 1 (cons 2 (cons 3 nil)))
(1 2 3)set: Set value to global variable
>>> (set (quote *foo*) 42)
nilget: Get value from previous defined global variable
>>> (set (quote *foo*) 42)
nil
>>> (get (quote *foo*))
42list: Create list evaluating the given arguments
>>> (list 1)
(1)
>>> (list 1 2 (+ 3 4))
(1 2 7)= or eq: Verify whether two elements are equivalents
>>> (= 1 1)
t
>>> (= 1 1.0)
t
>>> (= 1 2)
nil
>>> (= 1 "a")
nil+ or sum: Sum all arguments
>>> (+ 1 2 3)
6
>>> (sum 1 2 (+ 3 4) 5)
15- or sub: Subtract two arguments
>>> (- 1 2)
-1
>>> (sub 1 (- 2 3))
2* or mul: Multiply all arguments
>>> (* 1 2 3)
6
>>> (mul 1 2 (* 3 4))
24/ or div: Divide two arguments
>>> (/ 1 2)
0.5
>>> (div 1 (/ 2 3))
1.5
`pow`: Raise the first element to the power defined in the second one
```lisp
>>> (pow 10 3)
1000
>>> (pow 25 (/ 1 2))
5.0write: Write string to the standard output
>>> (write "Hello, world!")
Hello, world!
nilread: Return string read from standard input
>>> (set name (read))
Joe
nil
>>> (get name)
Joe
>>> (set age (int (read)))
25
nil
>>> (get age)
25concat: Concatenate strings
>>> (concat "Hello" ", " "world" "!")
Hello, world!float: Cast value to float number
>>> (float 10)
10.0int: Cast value to integer number
>>> (int 10.0)
10
>>> (int 10.5)
10str: Cast value to string
>>> (str 10)
10
>>> (str 10.5)
10.5