Login
7 branches 0 tags
Ben (X13/Arch) Simplified things a little 0643405 9 days ago 1260 Commits
nujel / stdlib / core / core.nuj
;;; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
;;; This project uses the MIT license, a copy should be included under /LICENSE
;;;
;;; Contains native nujel implementations of some
;;; core language constructs and essential macros

(def otherwise #t)

(defmacro += (val inc)
          `(set! ~val (+ ~val ~inc)))

(def let (let*
              (defn let/arg (arg)
                    (when arg
                      (when (or (not (pair? arg))
                                (not (symbol? (car arg))))
                        (throw (list :invalid-let-form "Please fix the structure of the let form" arg)))
                      `(def ~(car arg) ~(cadr arg))))

              (defn let/args (args)
                    (if-not args #nil
                            (cons (let/arg (car args))
                                  (let/args (cdr args)))))
              (defmacro let (bindings . body)
                        "Evalutes to BODY if PRED is true"
                        `(let* (do ~@(let/args bindings) ~@body)))))

(defn boolean (v)
      "Coerce to boolean"
      :inline
      :cat :boolean-operations
      :related not

      (if v #t #f))

(defn not (v)
      "Return true if V is false"
      :inline
      :cat :boolean-operations
      :related boolean

      (if v #f #t))

(defn identity (α) :inline
      "Returns its argument"
      α)

(defn caar (p)
      "(car (car p))"
      :inline
      :cat :list-manipulation
      :related cadr
      :related car
      :related cdr

      (car (car p)))

(defn cdar (p)
      "(cdr (car p))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (cdr (car p)))

(defn cddr (p)
      "(cdr (cdr p))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (cdr (cdr p)))

(defn cadar (p)
      "(car (cdr (car p)))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (car (cdr (car p))))

(defn caddr (p)
      "(car (cdr (cdr p)))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (car (cdr (cdr p))))

(defn cdddr (p)
      "(cdr (cdr (cdr p)))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (cdr (cdr (cdr p))))

(defn cadddr (p)
      "(car (cdr (cdr (cdr p))))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (car (cdr (cdr (cdr p)))))

(defn cddddr (p)
      "(cdr (cdr (cdr (cdr p))))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (cdr (cdr (cdr (cdr p)))))

(defn caddddr (p)
      "(car (cdr (cdr (cdr (cdr p)))))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (car (cdr (cdr (cdr (cdr p))))))

(defn cdddddr (p)
      "(cdr (cdr (cdr (cdr (cdr p)))))"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr

      (cdr (cdr (cdr (cdr (cdr p))))))

(defmacro exception (type description value)
          `(throw (list ~type ~description ~value)))