Login
7 branches 0 tags
Ben (X13/Arch) Some more documentation for the stdlib c8c25d9 2 years ago 942 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
      [deftest #t [boolean #t]]
      [deftest #f [boolean #nil]]
      [deftest #f [boolean #f]]
      [deftest #t [boolean 0]]
      [deftest #t [boolean 1]]
      [deftest #t [boolean 0.1]]
      [deftest #t [boolean ""]]
      [deftest #t [boolean "a"]]

      [if v #t #f]]

[defn not [v]
      "Return true if V is false"
      :inline
      :cat :boolean-operations
      :related boolean
      [deftest #f [not #t]]
      [deftest #t [not #f]]
      [deftest #t [not [< 5 1]]]
      [deftest #t [not [= #f #t]]]
      [deftest #t [not [< 3 2]]]
      [deftest #t [not [>= "2" 3]]]

      [if v #f #t]]

[defn identity [α] :inline
      "Returns its argument"
      α]

[defn list arguments
      "Return ARGUMENTS as a list"
      arguments]

[defn caar [p]
      "[car [car p]]"
      :inline
      :cat :list-manipulation
      :related cadr
      :related car
      :related cdr
      [deftest #t [caar '[[#t] #f]]]

      [car [car p]]]

[defn cadr [p]
      "[car [cdr p]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cadr '[#f #t #f]]]

      [car [cdr p]]]

[defn cdar [p]
      "[cdr [car p]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cdar '[[#f . #t] #f]]]
      [deftest [#t] [cdar '[[#f #t] #f]]]

      [cdr [car p]]]

[defn cddr [p]
      "[cdr [cdr p]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cddr '[#f #f . #t]]]
      [deftest [#t] [cddr '[#f #f #t]]]

      [cdr [cdr p]]]

[defn cadar [p]
      "[car [cdr [car p]]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cadar '[[#f #t] #f]]]

      [car [cdr [car p]]]]

[defn caddr [p]
      "[car [cdr [cdr p]]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [caddr '[#f #f #t]]]

      [car [cdr [cdr p]]]]

[defn cdddr [p]
      "[cdr [cdr [cdr p]]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cdddr '[#f #f #f . #t]]]
      [deftest [#t] [cdddr '[#f #f #f #t]]]

      [cdr [cdr [cdr p]]]]

[defn cadddr [p]
      "[car [cdr [cdr [cdr p]]]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cadddr '[#f #f #f #t]]]

      [car [cdr [cdr [cdr p]]]]]

[defn cddddr [p]
      "[cdr [cdr [cdr [cdr p]]]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [cddddr '[#f #f #f #f . #t]]]

      [cdr [cdr [cdr [cdr p]]]]]

[defn caddddr [p]
      "[car [cdr [cdr [cdr [cdr p]]]]]"
      :inline
      :cat :list-manipulation
      :related caar
      :related car
      :related cdr
      [deftest #t [caddddr '[#f #f #f #f #t]]]

      [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
      [deftest #t [cdddddr '[#f #f #f #f #f. #t]]]

      [cdr [cdr [cdr [cdr [cdr p]]]]]]

[defmacro exception [type description value]
          `[throw [list ~type ~description ~value [current-lambda]]]]