1
5
mirror of https://github.com/vinc/moros.git synced 2024-06-18 06:57:10 +00:00
moros/dsk/lib/lisp/core.lsp
Vincent Ollivier 87eb51d1ff
Improve lisp (#449)
* Add sort function

* Add slice function

* Fix empty string conversion into number

* Fix failing test

* Update test memory in makefile

* Add string to slice

* Add string to length

* Replace builtin lines with split and trim

* Fix splitting on empty pattern

* Fix slice for strings

* Add uniq

* Refactor slice

* Refactor sort to accept any expression

* Add contains?

* Add chunks

* Split default_env

* Add filter and intersection to core lib

* Update doc

* Update set to return value instead of symbol

* Add splice for variadic functions
2022-12-12 18:43:51 +01:00

138 lines
2.5 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 (filter f ls)
(if (nil? ls) nil
(if (f (first ls))
(cons (first ls) (filter f (rest ls)))
(filter f (rest ls)))))
(define (intersection a b)
(filter (function (x) (contains? b x)) a))
(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 (function (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 "/dev/clk/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))))
(define (lines contents)
(split (trim contents) "\n"))
(define (words contents)
(split contents " "))
(define (chars contents)
(split contents ""))