Login
7 branches 0 tags
Ben (X13/Arch) Added `[optimize fun]`, might speed up code by about 33%. 895b881 4 years ago 187 Commits
nujel / stdlib / 0_core.nuj
; Contains native nujel implementations of some
; core language constructs and essential macros

[defmacro comment [...body]
          "Does nothing"
          0
]

[defun not [v]
           "Return true if V is false"
           [if v #f #t]
]

[defun list [...arguments]
        "Return ARGUMENTS as a list"
        ...arguments
]

[defun default [arg default-value]
        "Returns ARG or DEFAULT-VALUE if ARG is #nil"
        [if arg arg default-value]
]

[defun caar [p]
        "[car [car p]]"
        [car [car p]]
]

[defun cadr [p]
        "[car [cdr p]]"
        [car [cdr p]]
]

[defun cdar [p]
        "[cdr [car p]]"
        [cdr [car p]]
]

[defun cddr [p]
        "[cdr [cdr p]]"
        [cdr [cdr p]]
]

[defun cadar [p]
        "[cdr [car p]]"
        [car [cdr [car p]]]
]

[defun caddr [p]
        "[car [cdr [cdr p]]]"
        [car [cdr [cdr p]]]
]

[defun cdddr [p]
        "[cdr [cdr [cdr p]]]"
        [cdr [cdr [cdr p]]]
]

[defun cadddr [p]
        "[car [cdr [cdr [cdr p]]]]"
        [car [cdr [cdr [cdr p]]]]
]

[defmacro if-not [pred then else]
          `[if ~pred ~else ~then]
]

[defmacro if-let [binding then else]
          `[let* [def ~[car binding] ~[cadr binding]]
                 [if ~[car binding] ~then ~else]
           ]
]

[defmacro when-let [binding ...body]
          `[if-let ~binding ~[cons 'do ...body] #nil]
]

[defmacro when-not [pred ...body]
          "Evalutes to BODY if PRED is false"
          `[if ~pred #nil [do ~@...body]]
]

[defmacro when [pred ...body]
          "Evalutes to BODY if PRED is true"
          `[if ~pred [do ~@...body] #nil]
]

[defun let/arg [arg]
       [when-not [pair? arg] [throw `[:invalid-let-form "Please fix the structure of the let form" ~arg]]]
       [when-not [symbol? [car arg]] [throw `[:invalid-let-form "Please fix the structure of the let form" ~arg]]]
       `[def ~[car arg] ~[cadr arg]]
]
[defun let/args [args]
       [if args
           [cons [let/arg [car args]]
                 [let/args [cdr args]]]
           #nil]
]
[defmacro let [bindings ...body]
          "Evalutes to BODY if PRED is true"
          `[let* [do ~@[let/args bindings] ~@...body]]
]

[def gensym/counter 0]
[defun gensym []
       [set! gensym/counter [+ 1 gensym/counter]]
       [str->sym ["GenSym-" gensym/counter]]
]