Login
7 branches 0 tags
Ben (X13/Arch) Some code cleanup af62864 4 years ago 219 Commits
nujel / stdlib / core.nuj
;; Contains various little pieces that were implemented in nujel instead of
;; C because of various reasons

[defun length [a]
        "Returns the length of a"
        [cond [[string? a] [string/length a]]
              [[pair? a] [list-length a]]
              [#t 0]
        ]
]

[defun describe/thing [o]
       "Describe a specific value O"
       [def doc [closure o]]
       [cat [str/write [doc :arguments]] " - " [doc :documentation]]
]

[defun describe/string [a]
       "Descibe whatever value string A resolves to"
       [describe/thing [resolve [str->sym a]]]
]

[defun describe [fun] "Describe FUN, if there is documentation available"
       [if [string? fun]
           [describe/string fun]
           [describe/thing fun]]
]

[defun arr-fill! [a v i]
        "Fills array a with value v"
        [cond [[>= [int i] [arr-length a]] a]
              [#t [arr-set! a [int i] v] [arr-fill! a v [+ 1 i]]]
        ]
]

[defun lognand [...l]
        "Returns the Nand of its arguments"
        [lognot [apply logand ...l]]
]

[defun mem []
       "Return some pretty printed memory usage information"
       [def info [memory-info]]
       [cat [ansi-white  "Memory Info"] "\n"
            [ansi-green  "Values:   "] [getf info :value]   "\n"
            [ansi-blue   "Closures: "] [getf info :closure] "\n"
            [ansi-red    "Arrays:   "] [getf info :array]   "\n"
            [ansi-yellow "STrings:  "] [getf info :string]  "\n"
            [ansi-cyan   "NFunc:    "] [getf info :native-function] "\n"
            [ansi-purple "Vectors:  "] [getf info :vector] "\n"
            [ansi-pink   "Symbols:  "] [getf info :symbol] "\n"
            ansi-reset
       ]
]

[defun wrap-value [val min max] "Constrains VAL to be within MIN and MAX, wrapping it around"
        [+ min [% [- val min] [- max min]]]
]

[defun symbol-table [off len environment]
       "Return a list of LEN symbols defined in ENVIRONMENT starting at OFF"
       [when-not environment [set! environment root-closure]]
       [when-not off [set! off 0]]
       [when-not len [set! len 9999999]]
       [sublist [environment [symbol-table*]] off [+ off len] #nil]
]

[defun describe/closure [c]
       [when c
             [def info [closure c]]
             [when [and info [info :call]]
                   [cat [ansi-blue [str/write c]]
                                 " - "
                                 [str/write [info :data]]
                                 "\r\n"
                                 [describe/closure [closure-parent c]]]]]
]