Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 18.63 KB | None | 0 0
  1. (def defmacro
  2.     (lambda (name args &body)
  3.       `(progn
  4.      (def ~name (lambda ~args ~@body))
  5.      (setmac! ~name))))
  6.  
  7. (setmac! defmacro)
  8.  
  9. (defmacro defun (name args &body)
  10.   `(def ~name (lambda ~args ~@body)))
  11.  
  12. (defmacro when (c &body)
  13.   `(if ~c (progn ~@body) undefined))
  14.  
  15. (defmacro when-not (c &body)
  16.   `(if ~c undefined (progn ~@body)))
  17.  
  18. (defmacro cond (&pairs)
  19.   (if (null? pairs)
  20.       undefined
  21.       `(if ~(car pairs)
  22.        ~(car (cdr pairs))
  23.        (cond ~@(cdr (cdr pairs))))))
  24.  
  25. (defmacro and (&args)
  26.   (if (null? args)
  27.       true
  28.       `(if ~(car args) ~(cons 'and (cdr args)) false)))
  29.  
  30. (defmacro or (&args)
  31.   (if (null? args)
  32.       false
  33.       (if (null? (cdr args))
  34.       (car args)
  35.       `((lambda (c)
  36.           (if c c ~(cons 'or (cdr args))))
  37.         ~(car args)))))
  38.  
  39. (defun identity (x) x)
  40. (defun even? (x) (= (mod x 2) 0))
  41. (defun odd? (x) (= (mod x 2) 1))
  42.  
  43. (defun macroexpand-1 (expr)
  44.   (if (and (list? expr) (macro? (geti *ns* (car expr))))
  45.       (apply (geti *ns* (car expr)) (cdr expr))
  46.       expr))
  47.  
  48. (defun inc (x) (+ x 1))
  49. (defun dec (x) (- x 1))
  50.  
  51. (defmacro incv! (name amt)
  52.   (setv! amt (or amt 1))
  53.   `(setv! ~name (+ ~name ~amt)))
  54.  
  55. (defmacro decv! (name amt)
  56.   (setv! amt (or amt 1))
  57.   `(setv! ~name (- ~name ~amt)))
  58.  
  59. (def first car)
  60. (defun second (lst) (car (cdr lst)))
  61. (defun third (lst) (car (cdr (cdr lst))))
  62. (defun fourth (lst) (car (cdr (cdr (cdr lst)))))
  63. (defun fifth (lst) (car (cdr (cdr (cdr (cdr lst))))))
  64. (def rest cdr)
  65.  
  66. (defun getter (field)
  67.   (lambda (obj) (geti obj field)))
  68.  
  69. (defun reduce (r lst accum)
  70.   (dumb-loop
  71.    (if (null? lst)
  72.        accum
  73.        (progn
  74.      (setv! accum (r accum (car lst)))
  75.      (setv! lst (cdr lst))
  76.      (continue)))))
  77.  
  78. (defun reverse (lst) (reduce (lambda (accum v) (cons v accum)) lst '()))
  79.  
  80. (defun transform-list (r lst)
  81.   (reverse (reduce r lst '())))
  82.  
  83. (defun map (f lst)
  84.   (transform-list
  85.    (lambda (accum v) (cons (f v) accum))
  86.    lst))
  87.  
  88. (defun filter (p lst)
  89.   (transform-list
  90.    (lambda (accum v) (if (p v) (cons v accum) accum))
  91.    lst))
  92.  
  93. (defun take (n lst)
  94.   (transform-list
  95.    (lambda (accum v)
  96.      (decv! n)
  97.      (if (>= n 0)
  98.      (cons v accum)
  99.      accum))
  100.    lst))
  101.  
  102. (defun drop (n lst)
  103.   (transform-list
  104.    (lambda (accum v)
  105.      (decv! n)
  106.      (if (>= n 0)
  107.      accum
  108.      (cons v accum)))
  109.    lst))
  110.  
  111. (defun every-nth (n lst)
  112.   ((lambda (counter)
  113.      (transform-list
  114.       (lambda (accum v)
  115.     (if (= (mod (incv! counter) n) 0) (cons v accum) accum))
  116.       lst)) -1))
  117.  
  118. (defun nth (n lst)
  119.   (if (= n 0) (car lst) (nth (dec n) (cdr lst))))
  120.    
  121. (defun butlast (n lst)
  122.   (take (- (count lst) n) lst))
  123.  
  124. (defun last (lst)
  125.   (reduce (lambda (accum v) v) lst undefined))
  126.  
  127. (defun count (lst)
  128.   (reduce (lambda (accum v) (inc accum)) lst 0))
  129.    
  130. (defun zip (a &more)
  131.    ((lambda (args)
  132.         (if (reduce (lambda (accum v) (or accum (null? v))) args false)
  133.             null
  134.             (cons (map car args) (apply zip (map cdr args))))) (cons a more)))
  135.  
  136. (defun interleave (&args)
  137.   (if (null? args)
  138.       '()
  139.       (apply concat (apply zip args))))
  140.  
  141. (defmacro let (bindings &body)
  142.   `((lambda ~(every-nth 2 bindings) ~@body)
  143.     ~@(every-nth 2 (cdr bindings))))
  144.  
  145. (defun interpose(x lst)
  146.   (let (fst true)
  147.     (transform-list (lambda (accum v)
  148.               (if fst
  149.               (progn
  150.                 (setv! fst false)
  151.                 (cons v accum))
  152.               (cons v (cons x accum))))
  153.             lst)))
  154.  
  155.  
  156. (defun join (sep lst)
  157.   (reduce str (interpose sep lst) ""))
  158.  
  159. (defun find (f arg lst)
  160.   (let (idx -1)
  161.     (reduce (lambda (accum v)
  162.           (incv! idx)
  163.           (if (f arg v) idx accum))
  164.         lst -1)))
  165.  
  166. (defun flatten (x)
  167.   (if (atom? x) (list x)
  168.       (apply concat (map flatten x))))
  169.  
  170. (defun map-indexed (f lst)
  171.   (let (idx -1)
  172.     (transform-list
  173.      (lambda (accum v) (cons (f v (incv! idx)) accum))
  174.      lst)))
  175.  
  176. ;(defmacro loop (bindings &body)
  177. ;  `(let (recur null)
  178. ;     (setv! recur (lambda ~(every-nth 2 bindings) ~@body))
  179. ;     (recur ~@(every-nth 2 (cdr bindings)))))
  180.  
  181.  
  182. (defmacro loop (bindings &body)
  183.   (let (binding-names (every-nth 2 bindings)
  184.     tmp-binding-names (map (lambda (s) (symbol (str "_" (geti s 'name)))) (every-nth 2 bindings))
  185.         done-flag-sym (gensym)
  186.         res-sym (gensym))
  187.     `(let (~done-flag-sym false
  188.        ~res-sym undefined
  189.        ~@bindings)
  190.        (let (recur (lambda ~tmp-binding-names
  191.              ~@(map (lambda (s) `(setv! ~s ~(symbol (str "_" (geti s 'name))))) binding-names)
  192.              (setv! ~done-flag-sym false)))
  193.      (dumb-loop
  194.       (setv! ~done-flag-sym true)
  195.       (setv! ~res-sym (progn ~@body))
  196.       (if (not ~done-flag-sym)
  197.           (continue)
  198.           ~res-sym))))))
  199.  
  200. (defun partition (n lst)
  201.   (if (null? lst)
  202.       null
  203.       (reverse
  204.        (loop (accum '()
  205.           part (cons (car lst) null)
  206.           rem (cdr lst)
  207.           counter 1)
  208.       (if (null? rem)
  209.           (cons (reverse part) accum)
  210.           (if (= (mod counter n) 0)
  211.           (recur (cons (reverse part) accum) (cons (car rem) null) (cdr rem) (inc counter))
  212.           (recur accum (cons (car rem) part) (cdr rem) (inc counter))))))))
  213.  
  214. (defmacro method (args &body)
  215.   `(lambda ~(cdr args)
  216.       ((lambda (~(car args))
  217.      ~@body) this)))
  218.  
  219. (defmacro defmethod (name obj args &body)
  220.   `(seti! ~obj (quote ~name)
  221.      (lambda ~(cdr args)
  222.     ((lambda (~(car args))
  223.      ~@body) this))))
  224.  
  225. (defun make-instance (proto &args)
  226.   (let (instance (object proto))
  227.     (apply-method (geti proto 'init) instance args)
  228.     instance))
  229.  
  230. (defun geti-safe (obj name)
  231.   (if (in? name obj)
  232.       (geti obj name)
  233.       (error (str "Property '" name "' does not exist in " obj))))
  234.  
  235. (defun call-method-by-name (obj name &args)
  236.   (apply-method (geti-safe obj name) obj args))
  237.  
  238. (defun dot-helper (obj-name reversed-fields)
  239.   (if (null? reversed-fields)
  240.       obj-name
  241.       (if (list? (car reversed-fields))
  242.       `(call-method-by-name
  243.         ~(dot-helper obj-name (cdr reversed-fields))
  244.         (quote ~(car (car reversed-fields)))
  245.         ~@(cdr (car reversed-fields)))
  246.       `(geti-safe ~(dot-helper obj-name (cdr reversed-fields)) (quote ~(car reversed-fields))))))
  247.  
  248. (defmacro . (obj-name &fields)
  249.   (dot-helper obj-name (reverse fields)))
  250.  
  251. (defun at-helper (obj-name reversed-fields)
  252.   (if (null? reversed-fields)
  253.       obj-name
  254.       `(geti ~(at-helper obj-name (cdr reversed-fields)) ~(car reversed-fields))))
  255.  
  256. (defmacro @ (obj-name &fields)
  257.   (at-helper obj-name (reverse fields)))
  258.  
  259. (defun prototype? (p o)
  260.   (. p (isPrototypeOf o)))
  261.  
  262. (defun equal? (a b)
  263.   (cond
  264.     (null? a)   (null? b)
  265.     (symbol? a) (and (symbol? b) (= (. a name) (. b name)))
  266.     (atom? a)   (= a b)
  267.     (list? a)   (and (list? b) (equal? (car a) (car b)) (equal? (cdr a) (cdr b)))))
  268.  
  269. (defun split (p lst)
  270.   (let (res (loop (l1 null
  271.            l2 lst)
  272.            (if (or (null? l2) (p (car l2)))
  273.            (list l1 l2)
  274.            (recur (cons (car l2) l1) (cdr l2)))))
  275.     (list (reverse (first res)) (second res))))
  276.  
  277. (defun any? (lst)
  278.   (if (reduce (lambda (accum v)
  279.         (if accum accum v))
  280.           lst
  281.           false)
  282.       true
  283.       false))
  284.  
  285. (defun splitting-pair (binding-names outer pair)
  286.   (any? (map (lambda (sym) (and (= (find equal? sym outer) -1)
  287.                 (not= (find equal? sym binding-names) -1)))
  288.          (filter (lambda (x) (and (symbol? x)
  289.                       (not (equal? x (first pair)))))
  290.              (flatten (second pair))))))
  291.  
  292. (defun let-helper* (outer binding-pairs body)
  293.   (let (binding-names (map first binding-pairs))
  294.     (let (divs (split (lambda (pair) (splitting-pair binding-names outer pair))
  295.                binding-pairs))
  296.       (if (null? (second divs))
  297.       `(let ~(apply concat (first divs)) ~@body)
  298.       `(let ~(apply concat (first divs))
  299.         ~(let-helper* (concat binding-pairs (map first (first divs))) (second divs) body))))))
  300.  
  301. (defmacro let* (bindings &body)
  302.   (let-helper* '() (partition 2 bindings) body))
  303.  
  304. (defun complement (f) (lambda (x) (not (f x))))
  305.  
  306. (defun compose (f1 f2)
  307.   (lambda (&args)
  308.     (f1 (apply f2 args))))
  309.  
  310. (defun partial (f &args1)
  311.   (lambda (&args2)
  312.     (apply f (concat args1 args2))))
  313.  
  314. (defun partial-method (obj method-field &args1)
  315.   (lambda (&args2)
  316.     (apply-method (geti obj method-field) obj (concat args1 args2))))
  317.  
  318. (defun format (&args)
  319.   (let (rx (regex "%[0-9]+" "gi"))
  320.     (. (car args)
  321.        (replace
  322.     rx (lambda (match)
  323.          (nth (parseInt (. match (substring 1))) (cdr args)))))))
  324.  
  325. (defmacro case (e &pairs)
  326.     (let* (e-name (gensym)
  327.            def-idx (find equal? 'default pairs)
  328.            def-expr (if (= def-idx -1) '(error "Fell out of case!") (nth (inc def-idx) pairs))
  329.            zipped-pairs (partition 2 pairs))
  330.         `(let (~e-name ~e)
  331.             (cond ~@(apply concat
  332.                             (map (lambda (pair) (list `(equal? ~e-name (quote ~(first pair))) (second pair)))
  333.                                  (filter (lambda (pair) (not (equal? (car pair) 'default))) zipped-pairs)))
  334.                     true ~def-expr))))
  335.  
  336. (defun destruct-helper (structure expr)
  337.   (let (expr-name (gensym))
  338.     `(~expr-name ~expr
  339.       ~@(apply concat
  340.            (map-indexed (lambda (v idx)
  341.                   (if (symbol? v)
  342.                   (if (= (. v name 0) "&")
  343.                       `(~(symbol (. v name (slice 1))) (drop ~idx ~expr-name))
  344.                       (if (= (. v name) "_") '() `(~v (nth ~idx ~expr-name))))
  345.                   (destruct-helper v `(nth ~idx ~expr-name))))
  346.                 structure)))))
  347.  
  348. (defmacro destructuring-bind (structure expr &body)
  349.   `(let* ~(if (symbol? structure)
  350.           (list structure expr)
  351.           (destruct-helper structure expr))
  352.      ~@body))
  353.  
  354. (defun macroexpand (expr)
  355.   (if (list? expr)
  356.       (if (macro? (geti *ns* (car expr)))
  357.       (macroexpand (apply (geti *ns* (car expr)) (cdr expr)))
  358.       (map macroexpand expr))
  359.       expr))
  360.  
  361. (defun list-matches? (expr patt)
  362.     (cond
  363.         (equal? (first patt) 'quote)
  364.         (equal? (second patt) expr)
  365.        
  366.         (and (symbol? (first patt)) (= (. (first patt) name 0) "&"))
  367.         (list? expr)
  368.        
  369.         true
  370.         (if (and (list? expr) (not (null? expr)))
  371.             (and (matches? (car expr) (car patt)) (matches? (cdr expr) (cdr patt)))
  372.             false)))
  373.  
  374. (defun matches? (expr patt)
  375.     (cond
  376.         (null? patt) (null? expr)
  377.         (list? patt) (list-matches? expr patt)
  378.         (symbol? patt) true
  379.         true         (error "Invalid pattern!")))
  380.  
  381. (defun pattern->structure (patt)
  382.   (if (and (list? patt) (not (null? patt)))
  383.       (if (equal? (car patt) 'quote)
  384.       '_
  385.       (map pattern->structure patt))
  386.       patt))
  387.  
  388. (defmacro pattern-case (e &pairs)
  389.   (let* (e-name (gensym)
  390.          zipped-pairs (partition 2 pairs))
  391.     `(let (~e-name ~e)
  392.        (cond ~@(apply concat
  393.               (map (lambda (pair)
  394.                  (list `(matches? ~e-name (quote ~(first pair)))
  395.                    `(destructuring-bind ~(pattern->structure (first pair)) ~e-name ~(second pair))))
  396.                zipped-pairs))
  397.          true (error "Fell out of case!")))))
  398.  
  399. (defmacro set! (place v)
  400.   (pattern-case (macroexpand place)
  401.      ('geti obj field) `(seti! ~obj ~field ~v)
  402.      ('geti-safe obj field) `(seti! ~obj ~field ~v)
  403.      any (if (symbol? any)
  404.          `(setv! ~any ~v)
  405.          `(error "Not a settable place!"))))
  406.  
  407. (defmacro inc! (name amt)
  408.   (set! amt (or amt 1))
  409.   `(set! ~name (+ ~name ~amt)))
  410.  
  411. (defmacro dec! (name amt)
  412.   (set! amt (or amt 1))
  413.   `(set! ~name (- ~name ~amt)))
  414.  
  415. (defmacro mul! (name amt)
  416.   `(set! ~name (* ~name ~amt)))
  417. (defmacro div! (name amt)
  418.   `(set! ~name (/ ~name ~amt)))
  419. (defun push (x lst) (reverse (cons x (reverse lst))))
  420. (defmacro push! (x place)
  421.   `(set! ~place (push ~x ~place)))
  422. (defmacro cons! (x place)
  423.   `(set! ~place (cons ~x ~place)))
  424. (defun insert (x pos lst)
  425.   (if (= pos 0)
  426.       (cons x lst)
  427.       (cons (if (null? lst) undefined (car lst)) (insert x (dec pos) (cdr lst)))))
  428. (defmacro -> (x &forms)
  429.   (if (null? forms)
  430.       x
  431.       `(-> ~(push x (car forms)) ~@(cdr forms))))
  432. (defmacro ->> (x &forms)
  433.   (if (null? forms)
  434.       x
  435.       `(->> ~(insert x 1 (car forms)) ~@(cdr forms))))
  436. (defmacro doto (obj-expr &body)
  437.   (let (binding-name (gensym))
  438.     `(let (~binding-name ~obj-expr)
  439.        ~@(map (lambda (v)
  440.         (destructuring-bind (f &args) v
  441.           (cons f (cons binding-name args))))
  442.           body)
  443.        ~binding-name)))
  444. (defun assoc! (obj &kvs)
  445.   (loop (kvs kvs)
  446.      (if (null? kvs)
  447.      obj
  448.      (progn
  449.        (seti! obj (first kvs) (second kvs))
  450.        (recur (cdr (cdr kvs)))))))
  451. (defun deep-assoc! (obj path &kvs)
  452.   (loop (obj obj
  453.      path path
  454.      kvs kvs)
  455.      (if (null? path)
  456.      (apply assoc! (cons obj kvs))
  457.      (recur (if (in? (car path) obj)
  458.             (geti obj (car path))
  459.             (seti! obj (car path) (hashmap)))
  460.         (cdr path) kvs)))
  461.   obj)
  462. (defun deep-geti* (obj path)
  463.   (if (null? path)
  464.       obj
  465.       (let (tmp (geti obj (car path)))
  466.     (if tmp (deep-geti* tmp (cdr path)) undefined))))
  467. (defun deep-geti (obj &path)
  468.   (deep-geti* obj path))
  469. (defun hashmap-shallow-copy (h1)
  470.   (reduce (lambda (h2 key) (seti! h2 key (geti h1 key)) h2) (keys h1) (hashmap)))
  471. (defun assoc (h &kvs)
  472.   (apply assoc! (cons (hashmap-shallow-copy h) kvs)))
  473. (defun update! (h &kfs)
  474.   (loop (kfs kfs)
  475.      (if (null? kfs)
  476.      h
  477.      (let (key (first kfs))
  478.        (seti! h key ((second kfs) (geti h key)))
  479.        (recur (cdr (cdr kfs)))))))
  480. (defun update (h &kfs)
  481.   (apply update! (cons (hashmap-shallow-copy h) kfs)))
  482. (defmacro while (c &body)
  483.   `(loop ()
  484.       (when ~c
  485.     ~@body
  486.     (recur))))
  487. (defun sort (cmp lst)
  488.   (. lst (sort cmp)))
  489. (defun in-range (binding-name start end step)
  490.   (set! step (or step 1))
  491.   (let (data (object null))
  492.     (set! (. data bind) (list binding-name start))
  493.     (set! (. data post) `((inc! ~binding-name ~step)))
  494.     (set! (. data cond) `(~(if (> step 0) '< '>) ~binding-name ~end))
  495.     data))
  496. (defun from (binding-name start step)
  497.   (set! step (or step 1))
  498.   (let (data (object null))
  499.     (set! (. data bind) (list binding-name start))
  500.     (set! (. data post) `((inc! ~binding-name ~step)))
  501.     data))
  502. (defun index-in (binding-name expr)
  503.   (let (len-name (gensym)
  504.     data (object null))
  505.     (set! (. data bind) `(~binding-name 0
  506.               ~len-name (count ~expr)))
  507.     (set! (. data post) `((inc! ~binding-name 1)))
  508.     (set! (. data cond) `(< ~binding-name ~len-name))
  509.     data))
  510. (defun in-list (binding-name expr)
  511.   (let (lst-name (gensym)
  512.     data (object null))
  513.     (set! (. data bind) (list lst-name expr
  514.                   binding-name null))
  515.     (set! (. data pre) `((set! ~binding-name (car ~lst-name))))
  516.     (set! (. data post) `((set! ~lst-name (cdr ~lst-name))))
  517.     (set! (. data cond) `(not (null? ~lst-name)))
  518.     data))
  519. (defun in-array (binding-name expr)
  520.   (let (arr-name (gensym)
  521.     idx-name (gensym)
  522.     data (object null))
  523.     (set! (. data bind) (list arr-name expr
  524.                   idx-name 0
  525.                   binding-name undefined))
  526.     (set! (. data pre) `((set! ~binding-name (@ ~arr-name ~idx-name))))
  527.     (set! (. data post) `((inc! ~idx-name)))
  528.     (set! (. data cond) `(< ~idx-name (. ~arr-name length)))
  529.     data))
  530. (defun iterate-compile-for (form)
  531.   (destructuring-bind (_ binding-name (func-name &args)) form
  532.     (apply (geti *ns* func-name) (cons binding-name args))))
  533. (defun iterate-compile-while (form)
  534.   (let (data (object null))
  535.     (set! (. data cond) (second form))
  536.     data))
  537. (defun iterate-compile-do (form)
  538.   (let (data (object null))
  539.     (set! (. data body) (cdr form))
  540.     data))
  541. (defun iterate-compile-finally (res-name form)
  542.   (let (data (object null))
  543.     (destructuring-bind (_ binding-name &body) form
  544.       (set! (. data bind) (list binding-name undefined))
  545.       (set! (. data finally) (cons `(set! ~binding-name ~res-name) (cdr (cdr form)))))
  546.     data))
  547. (defun iterate-compile-let (form)
  548.   (let (data (object null))
  549.     (set! (. data bind) (second form))
  550.     data))
  551. (defun iterate-compile-collecting (form)
  552.   (let (data (object null)
  553.     accum-name (gensym))
  554.     (set! (. data bind) (list accum-name '()))
  555.     (set! (. data body) `((set! ~accum-name (cons ~(second form) ~accum-name))))
  556.     (set! (. data finally) `((reverse ~accum-name)))
  557.     data))
  558. (defun collect-field (field objs)
  559.   (filter (lambda (x) (not= x undefined))
  560.       (map (getter field) objs)))
  561. (defmacro iterate (&forms)
  562.   (let* (res-name (gensym)
  563.      all (map (lambda (form)
  564.             (case (car form)
  565.               let         (iterate-compile-let form)
  566.               for         (iterate-compile-for form)
  567.               while       (iterate-compile-while form)
  568.               do          (iterate-compile-do form)
  569.               collecting  (iterate-compile-collecting form)
  570.               finally     (iterate-compile-finally res-name form)
  571.               default     (error "Unknown iterate form")))
  572.            forms)
  573.      body-actions (apply concat (collect-field 'body all))
  574.      final-actions (apply concat (map (lambda (v)
  575.                         (push `(set! ~res-name ~(last v)) (butlast 1 v)))
  576.                       (collect-field 'finally all))))
  577.     `(let* ~(concat (list res-name undefined)
  578.             (apply concat (collect-field 'bind all)))
  579.        (loop ()
  580.           (if ~(cons 'and (collect-field 'cond all))
  581.           (progn
  582.             ~@(apply concat (collect-field 'pre all))
  583.             ~@(butlast 1 body-actions)
  584.             (set! ~res-name ~(last body-actions))
  585.             ~@(apply concat (collect-field 'post all))
  586.             (recur))
  587.           (progn
  588.             ~@(if (null? final-actions) (list res-name) final-actions)))))))
  589. (defun add-meta! (obj &kvs)
  590.   (let (meta (geti obj 'meta))
  591.     (when (not meta)
  592.       (set! meta (hashmap))
  593.       (set! (. obj meta) meta)
  594.       (.defineProperty Object obj "meta" (assoc! (hashmap) "enumerable" false "writable" true)))
  595.     (apply assoc! (cons meta kvs))
  596.     obj))
  597. (defun print-meta (x)
  598.   (print (.stringify JSON (. x meta))))
  599. (defmacro defpod (name &fields)
  600.   `(defun ~(symbol (str "make-" name)) ~fields
  601.      (doto (hashmap) ~@(map (lambda (field) `(seti! (quote ~field) ~field)) fields))))
  602. (defun subs (s start end)
  603.   (.slice s start end))
  604. (defun neg? (x) (< x 0))
  605. (defun truncate (x)
  606.   (if (neg? x) (.ceil Math x) (.floor Math x)))
  607. (defun byte (x)
  608.   (let (y (mod (truncate x) 256))
  609.     (if (neg? y) (+ 256 y) y)))
  610. (defun short (x)
  611.   (let (y (mod (truncate x) 65536))
  612.     (if (neg? y) (+ 65536 y) y)))
  613. (defun int (x)
  614.   (let (y (mod (truncate x) 4294967296))
  615.     (if (neg? y) (+ 4294967296 y) y)))
  616. (defun idiv (a b) (truncate (/ a b)))
  617. (defun empty? (x)
  618.   (cond
  619.     (string? x) (= (. x length) 0)
  620.     (list? x) (null? x)
  621.     true (error "Type error in empty?")))
  622. (defmacro with-fields (fields obj &body)
  623.   (let (obj-sym (gensym))
  624.     `(let* (~obj-sym ~obj
  625.         ~@(interleave fields (map (lambda (field) `(. ~obj-sym ~field)) fields)))
  626.        ~@body)))
  627. (defun inside? (x x0 x1)
  628.   (and (>= x x0) (<= x x1)))
  629. (defun clamp (x x0 x1)
  630.   (if (< x x0) x0 (if (> x x1) x1 x)))
  631. (defun randf (min max)
  632.   (+ min (* (- max min) (.random Math))))
  633. (defun randi (min max)
  634.   (int (randf min max)))
  635. (defun random-element (lst)
  636.   (nth (randi 0 (count lst)) lst))
  637. (defun sqrt (x) (. Math (sqrt x)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement