1
5
mirror of https://github.com/vinc/moros.git synced 2024-06-19 07:27:06 +00:00
moros/dsk/lib/lisp/core.lsp
Vincent Ollivier ab9b488a49
Update lisp doc and examples (#428)
* Update documentation

* Add macro?

* Rewrite and and or with macros

* Move string-join

* Update built-in autocompletion

* Use define instead of def in core and examples

* Add changelog to doc

* Move aliases to lib

* Add let macro

* Add caar cadr cdar cddr functions

* Add fixme

* Fix let macro
2022-11-01 11:02:50 +01:00

120 lines
2.1 KiB
Plaintext

(load "/lib/lisp/alias.lsp")
(define (eq? x y)
(eq x y))
(define (atom? x)
(atom x))
(define (string? x)
(eq? (type x) "string"))
(define (boolean? x)
(eq? (type x) "boolean"))
(define (symbol? x)
(eq? (type x) "symbol"))
(define (number? x)
(eq? (type x) "number"))
(define (list? x)
(eq? (type x) "list"))
(define (function? x)
(eq? (type x) "function"))
(define (macro? x)
(eq? (type x) "macro"))
(define nil '())
(define (nil? x)
(eq? x nil))
(define (not x)
(if x false true))
(define-macro (or x y)
`(if ,x true (if ,y true false)))
(define-macro (and x y)
`(if ,x (if ,y true false) false))
(define-macro (let params values body)
`((function ,params ,body) ,@values))
(define (caar x)
(car (car x)))
(define (cadr x)
(car (cdr x)))
(define (cdar x)
(cdr (car x)))
(define (cddr x)
(cdr (cdr x)))
(define (rest x)
(cdr x))
(define (first x)
(car x))
(define (second x)
(first (rest x)))
(define (third x)
(second (rest x)))
(define (reduce f ls)
(if (nil? (rest ls)) (first ls)
(f (first ls) (reduce f (rest ls)))))
(define (map f ls)
(if (nil? ls) nil
(cons
(f (first ls))
(map f (rest ls)))))
(define (reverse x)
(if (nil? x) x
(append (reverse (rest x)) (cons (first x) '()))))
(define (range i n)
(if (= i n) nil
(append (list i) (range (+ i 1) n))))
(define (string-join ls s)
(reduce (fn (x y) (string x s y)) ls))
(define (read-line)
(bytes->string (reverse (rest (reverse (read-file-bytes "/dev/console" 256))))))
(define (read-char)
(bytes->string (read-file-bytes "/dev/console" 4)))
(define (print exp)
(do
(append-file-bytes "/dev/console" (string->bytes (string exp)))
'()))
(define (println exp)
(print (string exp "\n")))
(define (uptime)
(bytes->number (read-file-bytes "/dev/clk/uptime" 8) "float"))
(define (realtime)
(bytes->number (read-file-bytes "realtime" 8) "float"))
(define (write-file path str)
(write-file-bytes path (string->bytes str)))
(define (append-file path str)
(append-file-bytes path (string->bytes str)))
(define (regex-match? pattern str)
(not (nil? (regex-find pattern str))))