Skip to content

matheusportela/lispy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lispy

Didactic Lisp interpreter in Python

Usage

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!

Test

$ python test_lispy.py

Standard Library

quote: 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.0

if: 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
nil

let: Create local variables

>>> (let ((x 1)
          (y 2))
      (+ x y))
3

progn: Execute sequential expressions

>>> (progn
      (write "Hello")
      (write "What's your name?"))
Hello
What's your name?
nil

atom: 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))
nil

car: Return first value of a list or nil

>>> (car (1 2 3))
1
>>> (car (1 2))
1
>>> (car (1))
1
>>> (car ())
nil
>>> (car nil)
nil

cdr: Return tail of list or nil

>>> (cdr (1 2 3))
(2 3)
>>> (cdr (1 2))
(2)
>>> (cdr (1))
nil
>>> (cdr ())
nil
>>> (cdr nil)
nil

cons: 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)
nil

get: Get value from previous defined global variable

>>> (set (quote *foo*) 42)
nil
>>> (get (quote *foo*))
42

list: 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.0

write: Write string to the standard output

>>> (write "Hello, world!")
Hello, world!
nil

read: Return string read from standard input

>>> (set name (read))
Joe
nil
>>> (get name)
Joe
>>> (set age (int (read)))
25
nil
>>> (get age)
25

concat: Concatenate strings

>>> (concat "Hello" ", " "world" "!")
Hello, world!

float: Cast value to float number

>>> (float 10)
10.0

int: Cast value to integer number

>>> (int 10.0)
10
>>> (int 10.5)
10

str: Cast value to string

>>> (str 10)
10
>>> (str 10.5)
10.5

About

Didactic Lisp interpreter in Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages