Use of symbolic expressions. Three types of objects : atoms (truc, 1234, *hello*, etc.), lists (sequences of atoms within parens separated by spaces) and strings (aka not the underwear). Stuff’s cas insensitive. Variables are not typed, but objects are.

```; Comments are made with semi-colons. Example :
(+ (* (/ 9 5) 60) 32) ; == (60 * 9 / 5) + 62)```

## Basics

`(f x) ; == f(x)`
`(* 1 ), (+ 1 ), (- 1 ), (/ 1 ), (sqrt 1), (expt 1 2), (min 1 ), (max 1 ), (abs 1), (mod 1), (round 1), (sin 1), (cos 1), (tan 1)`
`t ; True, Nil ; False, '(stuff) ; Raw input`

## Lists

`'(A B C )`
`(first [L]), (second [L]), ..., (tenth [L]), (nth N [L]), (rest [L]) ; == [L].tail, (last [L]), (length [L]), (car [L]) ; == (first [L]), (cdr [L]) ; == (rest [L])`
`(cons A [L]) ; == A :: [L], (append [L] [L]) ; == [L] ++ [L], (list ) ; create list`

## Predicates

`Type-checking. Return T if same type, NIL if not. Format: (stuffp 1) == 1 typeoff stuff.`
`(listp 1), (numberp 1), (integerp 1), (stringp 1), (evenp 1), (oddp 1)`
`(atom 1) ; == not a string nor a list, (= 1 ), (> 1 ), (< 1 ), (<= 1 ), (>= 1 ), (/= 1 ), (null [L]) ; == isEmpty, (equal [L] [L]), (eql 1 2) ; == (1 == 2), (not 1), (and 1 ), (or 1 )`

## Var and flow

`(setq foo bar) ; == (var foo = bar), (setf foo bar) ; == setq, '(stuff)`
`(defun name (args) body) ; == def name(args) {body}`
`(if cond then [else]) ; == if(cond) then else`
`(cond (test1 result1) [(testn resultn)]) ; == When there is a T, return the corresponding result and stops.`
`(progn (stuff1) [(stuffn)]) ; Do every stuffs and returns the value of the last stuff.`
`(loop ...) ; Do NOT use.`

## Misc

`(load name) ; Load and evaluate the file name.`
`(print stuff) ; Prints stuff and returns the value of stuff.`

## Example: Factorial

```(defun fact (n)
(if (not (integerp n))
"Invalid argument"
(if (< n 2)
1
(* n (fact (- n 1)))
)
)
)```