mlisp/stdlib/stdlib.lsp

178 lines
5.0 KiB
Common Lisp

; not a bool
(defun not (x) (if x nil 1))
(defun is-pos? (n) (> n nil))
(defun is-neg? (n) (< n nil))
(defun neg (n) (- 0 n))
(defun dec (n) (- n 1))
(defun inc (n) (+ n 1))
(defun string-ltrim (str)
(string-rltrim str " \n\r\t" "ltrim"))
(defun string-rtrim (str)
(string-rltrim str " \n\r\t" "rtrim"))
(defun string-trim (str)
(string-rltrim str " \n\r\t" "trim"))
(defun string-rpad (str length pad_char)
(string-pad str length pad_char "rpad"))
(defun string-lpad (str length pad_char)
(string-pad str length pad_char "lpad"))
(defun string-upcase (str)
(string-case str "upper"))
(defun string-downcase (str)
(string-case str "lower"))
(defun string-join (lst sep)
(do
(define rslt "")
(define i 0)
(for e lst
(if (= i 0)
(do (define rslt (display e)) (define i 1))
(define rslt (+ rslt (display sep) (display e)))
))
rslt
))
(defun itok (ascii) (sprintf "%c" (list ascii)))
(defun ktoi (char) (int (sprintf "%d" (list char))))
; pause for interval of seconds
(defun sleep (time)
(system-cmd (+ "sleep " (string time))))
(defun get-env (var)
(second (system-cmd (+ "echo ${" var "} | tr -d \"\n\""))))
(defun third (l) (index l 2))
(defun fourth (l) (index l 3))
(defun fifth (l) (index l 4))
(defun sixth (l) (index l 5))
(defun seventh (l) (index l 6))
(defun eight (l) (index l 7))
(defun nineth (l) (index l 8))
(defun tenth (l) (index l 9))
(defun nth (i l) (index l (- i 1)))
; return 1 when list contains item otherwise 0
(defun member (lst itm)
(do
; TODO check if is empty list
(define found_index -1)
(define i 0)
(define lst_len (len lst))
(while (and (< i lst_len) (= found_index -1))
(if (= itm (index lst i))
(define found_index i)
(define i (+ i 1))
))
; TODO when nil will be implemented itm / nil
(if (!= -1 found_index)
1
nil)
))
(defun make-list-of (size val)
(do
(define lst '())
(define i 0)
(while (< i size)
(define lst (push lst val))
(define i (inc i)))
lst
))
(defun make-list (size)
(make-list-of size nil))
(defun empty-list? (lst) (and (= (type lst) "list") (= (len lst) 0)))
(defun uniq (lst)
(do
(define rslt '())
(define i 0)
(define lst_len (len lst))
(while (< i lst_len)
(define e (index lst i))
(if (not (member rslt e))
(define rslt (push rslt e)))
(define i (inc i)))
rslt
))
(defun flatten (lst)
(do
(define rslt '())
(for e lst
(if (= (type e) "list")
(do
(for ee (flatten e)
(define rslt (push rslt ee))))
(define rslt (push rslt e))
))
rslt
))
(defun quick-sort-by (l cmp)
(if (<= (len l) 1)
l
(do
(define pivot (first l))
(+
(quick-sort-by (filter (lambda (n) (cmp pivot n)) l) cmp)
(list pivot)
(quick-sort-by (tail (filter (lambda (n) (not (cmp pivot n))) l)) cmp)
))
))
(defun quick-sort (l)
(quick-sort-by l (lambda (a b) (> a b))))
(defun quick-sort-reverse (l)
(quick-sort-by l (lambda (a b) (> b a))))
(defun start-of-day (datetime) (str-to-date (+ (date-to-str datetime "%Y-%m-%d") " " "00:00:00") "%Y-%m-%d %H:%M:%S"))
(defun end-of-day (datetime) (str-to-date (+ (date-to-str datetime "%Y-%m-%d") " " "23:59:59") "%Y-%m-%d %H:%M:%S"))
(defun start-of-month (datetime) (str-to-date (+ (date-to-str datetime "%Y-%m") "-01 00:00:00") "%Y-%m-%d %H:%M:%S"))
(defun start-of-next-month (datetime) (date-add (start-of-month datetime) 1 "month"))
(defun end-of-next-month (datetime) (date-add (end-of-month datetime) 1 "month"))
(defun end-of-month (datetime) (date-add (date-add (start-of-month datetime) 1 "month") -1 "second"))
(defun start-of-prev-month (datetime) (date-add (start-of-month datetime) -1 "month"))
(defun end-of-prev-month (datetime) (date-add (end-of-month datetime) -1 "month"))
(defun start-of-year (datetime) (str-to-date (+ (date-to-str datetime "%Y") "-01-01 00:00:00") "%Y-%m-%d %H:%M:%S"))
(defun end-of-year (datetime) (str-to-date (+ (date-to-str datetime "%Y") "-12-31 23:59:59") "%Y-%m-%d %H:%M:%S"))
; from list of lists creates csv string
; (print (make-csv '(("r1c1" "r1c2") ("r2c1" "r2c2"))))
(defun make-csv (csv_list)
(do
(define rows_str "")
(define r 0)
(for row csv_list
(define cols_str "")
(define c 0)
(for col row
(if (= c 0)
(define cols_str col)
(define cols_str (+ cols_str "," (display col))))
(define c (inc c)))
(if (= r 0)
(define rows_str cols_str)
(define rows_str (+ rows_str "\n" cols_str)))
(define r (inc r)))
rows_str
))