application/octet-stream
•
3.19 KB
•
149 lines
;;; 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)))