application/octet-stream
•
2.10 KB
•
66 lines
;; 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]
]