Janet 1.38.0-73334f3 Documentation
(Other Versions:
1.37.1
1.36.0
1.35.0
1.34.0
1.31.0
1.29.1
1.28.0
1.27.0
1.26.0
1.25.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.0
1.18.1
1.17.1
1.16.1
1.15.0
1.13.1
1.12.2
1.11.1
1.10.1
1.9.1
1.8.1
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.1
)
Core API
Index
% %= * *= *args* *current-file* *debug* *defdyn-prefix* *doc-color* *doc-width* *err* *err-color* *executable* *exit* *exit-value* *ffi-context* *lint-error* *lint-levels* *lint-warn* *macro-form* *macro-lints* *module-cache* *module-loaders* *module-loading* *module-make-env* *module-paths* *out* *peg-grammar* *pretty-format* *profilepath* *redef* *repl-prompt* *syspath* *task-id* + ++ += - -- -= -> ->> -?> -?>> / /= < <= = > >= abstract? accumulate accumulate2 all all-bindings all-dynamics and any? apply array array/clear array/concat array/ensure array/fill array/insert array/join array/new array/new-filled array/peek array/pop array/push array/remove array/slice array/trim array/weak array? as-> as-macro as?-> asm assert assertf bad-compile bad-parse band blshift bnot boolean? bor brshift brushift buffer buffer/bit buffer/bit-clear buffer/bit-set buffer/bit-toggle buffer/blit buffer/clear buffer/fill buffer/format buffer/format-at buffer/from-bytes buffer/new buffer/new-filled buffer/popn buffer/push buffer/push-at buffer/push-byte buffer/push-float32 buffer/push-float64 buffer/push-string buffer/push-uint16 buffer/push-uint32 buffer/push-uint64 buffer/push-word buffer/slice buffer/trim buffer? bundle/add bundle/add-bin bundle/add-directory bundle/add-file bundle/install bundle/installed? bundle/list bundle/manifest bundle/prune bundle/reinstall bundle/replace bundle/topolist bundle/uninstall bundle/update-all bundle/whois bxor bytes? cancel case catseq cfunction? chr cli-main cmp comment comp compare compare< compare<= compare= compare> compare>= compif compile complement comptime compwhen cond coro count curenv debug debug/arg-stack debug/break debug/fbreak debug/lineage debug/stack debug/stacktrace debug/step debug/unbreak debug/unfbreak debugger debugger-env debugger-on-status dec deep-not= deep= def- default default-peg-grammar defdyn defer defglobal defmacro defmacro- defn defn- delay describe dictionary? disasm distinct div doc doc* doc-format doc-of dofile drop drop-until drop-while dyn each eachk eachp edefer eflush empty? env-lookup eprin eprinf eprint eprintf error errorf ev/acquire-lock ev/acquire-rlock ev/acquire-wlock ev/all-tasks ev/call ev/cancel ev/capacity ev/chan ev/chan-close ev/chunk ev/close ev/count ev/deadline ev/do-thread ev/full ev/gather ev/give ev/give-supervisor ev/go ev/lock ev/read ev/release-lock ev/release-rlock ev/release-wlock ev/rselect ev/rwlock ev/select ev/sleep ev/spawn ev/spawn-thread ev/take ev/thread ev/thread-chan ev/to-file ev/with-deadline ev/with-lock ev/with-rlock ev/with-wlock ev/write eval eval-string even? every? extreme false? ffi/align ffi/call ffi/calling-conventions ffi/close ffi/context ffi/defbind ffi/defbind-alias ffi/free ffi/jitfn ffi/lookup ffi/malloc ffi/native ffi/pointer-buffer ffi/pointer-cfunction ffi/read ffi/signature ffi/size ffi/struct ffi/trampoline ffi/write fiber-fn fiber/can-resume? fiber/current fiber/getenv fiber/last-value fiber/maxstack fiber/new fiber/root fiber/setenv fiber/setmaxstack fiber/status fiber? file/close file/flush file/lines file/open file/read file/seek file/tell file/temp file/write filewatch/add filewatch/listen filewatch/new filewatch/remove filewatch/unlisten filter find find-index first flatten flatten-into flush flycheck for forever forv freeze frequencies from-pairs function? gccollect gcinterval gcsetinterval generate gensym geomean get get-in getline getproto group-by has-key? has-value? hash idempotent? identity if-let if-not if-with import import* in inc index-of indexed? int/s64 int/to-bytes int/to-number int/u64 int? interleave interpose invert janet/build janet/config-bits janet/version juxt juxt* keep keep-syntax keep-syntax! keys keyword keyword/slice keyword? kvs label last length lengthable? let load-image load-image-dict loop macex macex1 maclintf make-env make-image make-image-dict map mapcat marshal match math/-inf math/abs math/acos math/acosh math/asin math/asinh math/atan math/atan2 math/atanh math/cbrt math/ceil math/cos math/cosh math/e math/erf math/erfc math/exp math/exp2 math/expm1 math/floor math/frexp math/gamma math/gcd math/hypot math/inf math/int-max math/int-min math/int32-max math/int32-min math/lcm math/ldexp math/log math/log-gamma math/log10 math/log1p math/log2 math/nan math/next math/pi math/pow math/random math/rng math/rng-buffer math/rng-int math/rng-uniform math/round math/seedrandom math/sin math/sinh math/sqrt math/tan math/tanh math/trunc max max-of mean memcmp merge merge-into merge-module min min-of mod module/add-paths module/cache module/expand-path module/find module/loaders module/loading module/paths module/value nan? nat? native neg? net/accept net/accept-loop net/address net/address-unpack net/chunk net/close net/connect net/flush net/listen net/localname net/peername net/read net/recv-from net/send-to net/server net/setsockopt net/shutdown net/write next nil? not not= number? odd? one? or os/arch os/cd os/chmod os/clock os/compiler os/cpu-count os/cryptorand os/cwd os/date os/dir os/environ os/execute os/exit os/getenv os/isatty os/link os/lstat os/mkdir os/mktime os/open os/perm-int os/perm-string os/pipe os/posix-exec os/posix-fork os/proc-close os/proc-kill os/proc-wait os/readlink os/realpath os/rename os/rm os/rmdir os/setenv os/setlocale os/shell os/sigaction os/sleep os/spawn os/stat os/strftime os/symlink os/time os/touch os/umask os/which pairs parse parse-all parser/byte parser/clone parser/consume parser/eof parser/error parser/flush parser/has-more parser/insert parser/new parser/produce parser/state parser/status parser/where partial partition partition-by peg/compile peg/find peg/find-all peg/match peg/replace peg/replace-all pos? postwalk pp prewalk prin prinf print printf product prompt propagate protect put put-in quit range reduce reduce2 repeat repl require resume return reverse reverse! root-env run-context sandbox scan-number seq setdyn short-fn signal slice slurp some sort sort-by sorted sorted-by spit stderr stdin stdout string string/ascii-lower string/ascii-upper string/bytes string/check-set string/find string/find-all string/format string/from-bytes string/has-prefix? string/has-suffix? string/join string/repeat string/replace string/replace-all string/reverse string/slice string/split string/trim string/triml string/trimr string? struct struct/getproto struct/proto-flatten struct/rawget struct/to-table struct/with-proto struct? sum symbol symbol/slice symbol? table table/clear table/clone table/getproto table/new table/proto-flatten table/rawget table/setproto table/to-struct table/weak table/weak-keys table/weak-values table? tabseq take take-until take-while thaw toggle trace tracev true? truthy? try tuple tuple/brackets tuple/join tuple/setmap tuple/slice tuple/sourcemap tuple/type tuple? type unless unmarshal untrace update update-in use values var- varfn varglobal walk warn-compile when when-let when-with with with-dyns with-env with-syms with-vars xprin xprinf xprint xprintf yield zero? zipcoll
(% & xs)
Returns the remainder of dividing the first value of xs by each remaining value.
(% 10 3) # -> 1
(% -10 3) # -> -1
(% 10 -3) # -> 1
(% -10 -3) # -> -1
(% 1.4 1) # -> 0.4
(% -1.4 1) # -> -0.4
(% 1.4 -1) # -> 0.4
(% -1.4 -1) # -> -0.4
(nan? (% 1.4 0)) # -> true
(nan? (% -1.4 0)) # -> true
Community Examples(%= x & ns)
Shorthand for (set x (% x n)).
(var x 10) # -> 10
(%= x 3) # -> 1
x # -> 1
Community Examples(* & xs)
Returns the product of all elements in xs. If xs is empty, returns 1.
(*) # -> 1
(* 10) # -> 10
(* 10 20) # -> 200
(* 1 2 3 4 5 6 7) # -> 5040
# Can take product of array with splice, but 'product' is better
(* ;(range 1 20)) # -> 1.21645100408832e+17
(product (range 1 20)) # -> 1.21645100408832e+17
Community Examples(*= x & ns)
Shorthand for (set x (* x n)).
(var x 100) # -> 100
x # -> 100
(*= x 10) # -> 1000
x # -> 1000
Community ExamplesDynamic bindings that will contain command line arguments at program start.
Enables a built in debugger on errors and other useful features for debugging in a repl.
Optional namespace prefix to add to keywords declared with defdyn
. Use this to prevent keyword collisions
between dynamic bindings.
Whether or not to colorize documentation printed with doc-format
.
Width in columns to print documentation printed with doc-format
.
Whether or not to turn on error coloring in stacktraces and other error messages.
Name of the interpreter executable used to execute this program. Corresponds to argv[0]
in the call to int
main(int argc, char **argv);
.
When set, will cause the current context to complete. Can be set to exit from repl (or file), for example.
Current native library for ffi/bind and other settings
The current lint error level. The error level is the lint level at which compilation will exit with an error and not continue.
A table of keyword alias to numbers denoting a lint level. Can be used to provided custom aliases for numeric lint levels.
The current lint warning level. The warning level is the lint level at which and error will be printed but compilation will continue as normal.
Inside a macro, is bound to the source form that invoked the macro
Bound to an array of lint messages that will be reported by the compiler inside a macro. To indicate an error
or warning, a macro author should use maclintf
.
Dynamic binding for creating new environments for import
, require
, and dofile
. Overrides make-env
.
The implicit base grammar used when compiling PEGs. Any undefined keywords found when compiling a peg will use lookup in this table (if defined).
Path to profile file loaded when starting up the repl.
When set, allow dynamically rebinding top level defs. Will slow generated code and is intended to be used for development.
Allow setting a custom prompt at the default REPL. Not all REPLs will respect this binding.
(var ncmd 0)
(defn my-prompt
`Takes a single argument p, the parser, and returns a prompt string.`
[p]
(++ ncmd)
(string/format "[%d]> " ncmd))
(setdyn :repl-prompt my-prompt)
Community ExamplesWhen spawning a thread or fiber, the task-id can be assigned for concurrency control.
(+ & xs)
Returns the sum of all xs. xs must be integers or real numbers only. If xs is empty, return 0.
(+) # -> 0
(+ 10) # -> 10
(+ 1 2) # -> 3
(+ 1.4 -4.5) # -> -3.1
(+ 1 2 3 4 5 6 7 8 9 10) # -> 55
# Splice can be used to sum arrays, but 'sum' is better
(+ ;(range 101)) # -> 5050
(sum (range 101)) # -> 5050
# Janet can add types that support the :+ or :r+ method
(+ (int/s64 "10") 10) # -> <core/s64 20>
# Bad types give errors
(+ nil 10) # -> error: could not find method :+ for nil, or :r+ for 10
Community Examples(++ x)
Increments the var x by 1.
(var a 0) # -> 0
(set a (+ a 1)) # -> 1
(++ a) # -> 2 (same effect as above)
Community Examples(+= x & ns)
Increments the var x by n.
(var x 100) # -> 100
x # -> 100
(+= x 10) # -> 110
x # -> 110
Community Examples(- & xs)
Returns the difference of xs. If xs is empty, returns 0. If xs has one element, returns the negative value of that element. Otherwise, returns the first element in xs minus the sum of the rest of the elements.
(-) # -> 0
(- 10) # -> -10
(- 1 2) # -> -1
(- 1.4 -4.5) # -> 5.9
# Equivalent to (- first (+ ;rest))
(- 1 2 3 4 5 6 7 8 9 10) # -> -53
# Janet can subtract types that support the :- or :r- method
(- (int/s64 "10") 10) # -> <core/s64 0>
Community Examples(-- x)
Decrements the var x by 1.
(var a 10) # -> 10
(set a (- a 1)) # -> 9
(-- a) # -> 8 (same effect as above)
Community Examples(-= x & ns)
Decrements the var x by n.
(var x 10) # -> 10
(-= x 20) # -> -10
x # -> -10
Community Examples(-> x & forms)
Threading macro. Inserts x as the second value in the first form in forms
, and inserts the modified first
form into the second form in the same manner, and so on. Useful for expressing pipelines of data.
(-> {:a [1 2 3] :b [4 5 6]}
(get :a)
(sum)
((fn [x y] (/ x y)) 2)) # The 6 from the sum is threaded first and binds to x, then 2 binds to y.
# -> 3
Community Examples(->> x & forms)
Threading macro. Inserts x as the last value in the first form in forms
, and inserts the modified first form
into the second form in the same manner, and so on. Useful for expressing pipelines of data.
(-?> x & forms)
Short circuit threading macro. Inserts x as the second value in the first form in forms
, and inserts the
modified first form into the second form in the same manner, and so on. The pipeline will return nil if an
intermediate value is nil. Useful for expressing pipelines of data.
(-?>> x & forms)
Short circuit threading macro. Inserts x as the last value in the first form in forms
, and inserts the
modified first form into the second form in the same manner, and so on. The pipeline will return nil if an
intermediate value is nil. Useful for expressing pipelines of data.
(/ & xs)
Returns the quotient of xs. If xs is empty, returns 1. If xs has one value x, returns the reciprocal of x. Otherwise return the first value of xs repeatedly divided by the remaining values.
(/) # -> 1
(/ 10) # -> 0.1
(/ 10 5) # -> 2
(/ 10 5 4) # -> 0.5
(/ 10 5 4 5) # -> 0.1
# More arguments is the same as repeated division.
(/ ;(range 1 20)) # -> 8.22064e-18
Community Examples(/= x & ns)
Shorthand for (set x (/ x n)).
(var x 10) # -> 10
(/= x 5) # -> 2
x # -> 2
(/= x 0.2) # -> 10
x # -> 10
Community Examples(accumulate f init ind)
Similar to reduce
, but accumulates intermediate values into an array. The last element in the array is what
would be the return value from reduce
. The init
value is not added to the array (the return value will have
the same number of elements as ind
). Returns a new array.
(reduce + 0 [1 2 3 4]) # -> 10
(accumulate + 0 [1 2 3 4]) # -> @[1 3 6 10]
(reduce + 0 []) # -> 0
(accumulate + 0 []) # -> @[]
(reduce string "" ["J" "a" "n" "e" "t"]) # -> "Janet"
(accumulate string "" ["J" "a" "n" "e" "t"]) # -> @["J" "Ja" "Jan" "Jane" "Janet"]
Community Examples(accumulate2 f ind)
The 2-argument version of accumulate
that does not take an initialization value. The first value in ind
will be added to the array as is, so the length of the return value will be (length ind)
.
(all pred ind & inds)
Returns true if (pred item)
is truthy for every item in ind
. Otherwise, returns the first falsey result
encountered. Returns true if ind
is empty.
(all pos? [1 2 3]) # -> true
(all pos? [1 2 -3]) # -> false
(all pos? []) # -> true
(all neg? []) # -> true
(all truthy? [1 2 3]) # -> true
(all truthy? [1 2 nil]) # -> false
# multiple data structures can be handled
(all (fn [x y] (pos? (* x y))) [-1 2] [-2 1]) # -> true
# predicate may not be applied to all values (e.g. 43)
(all |(neg? (+ $0 $1 $2)) [-2 2] [1 -8] [0 1 43]) # -> true
Community Examples(all-bindings &opt env local)
Get all symbols available in an environment. Defaults to the current fiber's environment. If local
is truthy,
will not show inherited bindings (from prototype tables).
(all-dynamics &opt env local)
Get all dynamic bindings in an environment. Defaults to the current fiber's environment. If local
is truthy,
will not show inherited bindings (from prototype tables).
(and & forms)
Evaluates to the last argument if all preceding elements are truthy, otherwise evaluates to the first falsey argument.
(any? ind)
Evaluates to the last element of ind
if all preceding elements are falsey, otherwise evaluates to the first
truthy element.
(apply f & args)
Applies a function f to a variable number of arguments. Each element in args is used as an argument to f, except the last element in args, which is expected to be an array or a tuple. Each element in this last argument is then also pushed as an argument to f.
(apply + (range 10)) # -> 45
(apply + []) # -> 0
(apply + 1 2 3 4 5 6 7 [8 9 10]) # -> 55
(apply + 1 2 3 4 5 6 7 8 9 10) # -> error: expected array or tuple, got 10
# Can also be used to call macros like functions.
# Will return the macro expanded code of the original macro.
(apply for 'x 0 10 ['(print x)])
# -> (do (var _000000 0) (def _000001 10) (while ...
Community Examples(array & items)
Create a new array that contains items. Returns the new array.
(array/clear arr)
Empties an array, setting it's count to 0 but does not free the backing capacity. Returns the modified array.
(array/concat arr & parts)
Concatenates a variable number of arrays (and tuples) into the first argument, which must be an array. If any
of the parts are arrays or tuples, their elements will be inserted into the array. Otherwise, each part in
parts
will be appended to arr
in order. Return the modified array arr
.
(array/ensure arr capacity growth)
Ensures that the memory backing the array is large enough for capacity
items at the given rate of growth.
capacity
and growth
must be integers. If the backing capacity is already enough, then this function does
nothing. Otherwise, the backing memory will be reallocated so that there is enough space.
(array/fill arr &opt value)
Replace all elements of an array with value
(defaulting to nil) without changing the length of the array.
Returns the modified array.
(array/insert arr at & xs)
Insert all xs
into array arr
at index at
. at
should be an integer between 0 and the length of the
array. A negative value for at
will index backwards from the end of the array, inserting after the index such
that inserting at -1 appends to the array. Returns the array.
(array/join arr & parts)
Join a variable number of arrays and tuples into the first argument, which must be an array. Return the
modified array arr
.
(array/new capacity)
Creates a new empty array with a pre-allocated capacity. The same as (array)
but can be more efficient if the
maximum size of an array is known.
(def arr (array/new 100)) # -> @[]
# Now we can fill up the array without triggering a resize
(for i 0 100
(put arr i i))
Community Examples(array/new-filled count &opt value)
Creates a new array of count
elements, all set to value
, which defaults to nil. Returns the new array.
(array/peek arr)
Returns the last element of the array. Does not modify the array.
(array/pop arr)
Remove the last element of the array and return it. If the array is empty, will return nil. Modifies the input array.
(array/push arr & xs)
Push all the elements of xs to the end of an array. Modifies the input array and returns it.
(array/remove arr at &opt n)
Remove up to n
elements starting at index at
in array arr
. at
can index from the end of the array with
a negative index, and n
must be a non-negative integer. By default, n
is 1. Returns the array.
(array/slice arrtup &opt start end)
Takes a slice of array or tuple from start
to end
. The range is half open, [start, end). Indexes can also
be negative, indicating indexing from the end of the array. By default, start
is 0 and end
is the length of
the array. Note that if the range is negative, it is taken as (start, end] to allow a full negative slice
range. Returns a new array.
(array/trim arr)
Set the backing capacity of an array to its current length. Returns the modified array.
(array/weak capacity)
Creates a new empty array with a pre-allocated capacity and support for weak references. Similar to
array/new
.
(as-> x as & forms)
Thread forms together, replacing as
in forms
with the value of the previous form. The first form is the
value x. Returns the last value.
(as-macro f & args)
Use a function or macro literal f
as a macro. This lets any function be used as a macro. Inside a quasiquote,
the idiom (as-macro ,my-custom-macro arg1 arg2...)
can be used to avoid unwanted variable capture of
my-custom-macro
.
(as?-> x as & forms)
Thread forms together, replacing as
in forms
with the value of the previous form. The first form is the
value x. If any intermediate values are falsey, return nil; otherwise, returns the last value.
(asm assembly)
Returns a new function that is the compiled result of the assembly. The syntax for the assembly can be found on the Janet website, and should correspond to the return value of disasm. Will throw an error on invalid assembly.
(assert x &opt err)
Throw an error if x is not truthy. Will not evaluate err
if x is truthy.
(assertf x fmt & args)
Convenience macro that combines assert
and string/format
.
(bad-compile msg macrof where &opt line col)
Default handler for a compile error.
(band & xs)
Returns the bit-wise and of all values in xs. Each x in xs must be an integer.
(blshift x & shifts)
Returns the value of x bit shifted left by the sum of all values in shifts. x and each element in shift must be an integer.
(bor & xs)
Returns the bit-wise or of all values in xs. Each x in xs must be an integer.
(brshift x & shifts)
Returns the value of x bit shifted right by the sum of all values in shifts. x and each element in shift must be an integer.
(brushift x & shifts)
Returns the value of x bit shifted right by the sum of all values in shifts. x and each element in shift must be an integer. The sign of x is not preserved, so for positive shifts the return value will always be positive.
(buffer & xs)
Creates a buffer by concatenating the elements of xs
together. If an element is not a byte sequence, it is
converted to bytes via describe
. Returns the new buffer.
(buffer/bit buffer index)
Gets the bit at the given bit-index. Returns true if the bit is set, false if not.
(buffer/bit-clear buffer index)
Clears the bit at the given bit-index. Returns the buffer.
(buffer/bit-set buffer index)
Sets the bit at the given bit-index. Returns the buffer.
(buffer/bit-toggle buffer index)
Toggles the bit at the given bit index in buffer. Returns the buffer.
(buffer/blit dest src &opt dest-start src-start src-end)
Insert the contents of src
into dest
. Can optionally take indices that indicate which part of src
to copy
into which part of dest
. Indices can be negative in order to index from the end of src
or dest
. Returns
dest
.
(buffer/clear buffer)
Sets the size of a buffer to 0 and empties it. The buffer retains its memory so it can be efficiently refilled. Returns the modified buffer.
(buffer/fill buffer &opt byte)
Fill up a buffer with bytes, defaulting to 0s. Does not change the buffer's length. Returns the modified buffer.
(buffer/format buffer format & args)
Snprintf like functionality for printing values into a buffer. Returns the modified buffer.
(buffer/format-at buffer at format & args)
Snprintf like functionality for printing values into a buffer. Returns the modified buffer.
(buffer/from-bytes & byte-vals)
Creates a buffer from integer parameters with byte values. All integers will be coerced to the range of 1 byte 0-255.
(buffer/new capacity)
Creates a new, empty buffer with enough backing memory for capacity
bytes. Returns a new buffer of length 0.
(buffer/new-filled count &opt byte)
Creates a new buffer of length count
filled with byte
. By default, byte
is 0. Returns the new buffer.
(buffer/popn buffer n)
Removes the last n
bytes from the buffer. Returns the modified buffer.
(buffer/push buffer & xs)
Push both individual bytes and byte sequences to a buffer. For each x in xs, push the byte if x is an integer,
otherwise push the bytesequence to the buffer. Thus, this function behaves like both buffer/push-string
and
buffer/push-byte
. Returns the modified buffer. Will throw an error if the buffer overflows.
(buffer/push-at buffer index & xs)
Same as buffer/push, but copies the new data into the buffer at index index
.
(buffer/push-byte buffer & xs)
Append bytes to a buffer. Will expand the buffer as necessary. Returns the modified buffer. Will throw an error if the buffer overflows.
(buffer/push-float32 buffer order data)
Push the underlying bytes of a 32 bit float data onto the end of the buffer. Returns the modified buffer.
(buffer/push-float64 buffer order data)
Push the underlying bytes of a 64 bit float data onto the end of the buffer. Returns the modified buffer.
(buffer/push-string buffer & xs)
Push byte sequences onto the end of a buffer. Will accept any of strings, keywords, symbols, and buffers. Returns the modified buffer. Will throw an error if the buffer overflows.
(buffer/push-uint16 buffer order data)
Push a 16 bit unsigned integer data onto the end of the buffer. Returns the modified buffer.
(buffer/push-uint32 buffer order data)
Push a 32 bit unsigned integer data onto the end of the buffer. Returns the modified buffer.
(buffer/push-uint64 buffer order data)
Push a 64 bit unsigned integer data onto the end of the buffer. Returns the modified buffer.
(buffer/push-word buffer & xs)
Append machine words to a buffer. The 4 bytes of the integer are appended in twos complement, little endian order, unsigned for all x. Returns the modified buffer. Will throw an error if the buffer overflows.
(buffer/slice bytes &opt start end)
Takes a slice of a byte sequence from start
to end
. The range is half open, [start, end). Indexes can also
be negative, indicating indexing from the end of the end of the array. By default, start
is 0 and end
is
the length of the buffer. Returns a new buffer.
(buffer/trim buffer)
Set the backing capacity of the buffer to the current length of the buffer. Returns the modified buffer.
(bundle/add manifest src &opt dest chmod-mode)
Add files and directories during a bundle install relative to (dyn *syspath*)
. Added paths will be recorded
in the bundle manifest such that they are properly tracked and removed during an upgrade or uninstall.
(bundle/add-bin manifest src &opt dest chmod-mode)
Shorthand for adding scripts during an install. Scripts will be installed to (string (dyn *syspath*) "/bin") by default and will be set to be executable.
(bundle/add-directory manifest dest &opt chmod-mode)
Add a directory during the install process relative to (dyn *syspath*)
(bundle/add-file manifest src &opt dest chmod-mode)
Add files during an install relative to (dyn *syspath*)
(bundle/install path &keys config)
Install a bundle from the local filesystem. The name of the bundle will be inferred from the bundle, or passed
as a parameter :name in config
.
(bundle/installed? bundle-name)
Check if a bundle is installed.
(bundle/list)
Get a list of all installed bundles in lexical order.
(bundle/manifest bundle-name)
Get the manifest for a give installed bundle
(bundle/prune)
Remove all orphaned bundles from the syspath. An orphaned bundle is a bundle that is marked for :auto-remove and is not depended on by any other bundle.
(bundle/reinstall bundle-name &keys new-config)
Reinstall an existing bundle from the local source code.
(bundle/replace bundle-name path &keys new-config)
Reinstall an existing bundle from a new directory. Similar to bundle/reinstall, but installs the replacement bundle from any directory. This is necesarry to replace a package without breaking any dependencies.
(bundle/topolist)
Get topological order of all bundles, such that each bundle is listed after its dependencies.
(bundle/uninstall bundle-name)
Remove a bundle from the current syspath
(bundle/update-all &keys configs)
Reinstall all bundles
(bundle/whois path)
Given a file path, figure out which bundle installed it.
(bxor & xs)
Returns the bit-wise xor of all values in xs. Each in xs must be an integer.
(bytes? x)
Check if x is a string, symbol, keyword, or buffer.
(cancel fiber err)
Resume a fiber but have it immediately raise an error. This lets a programmer unwind a pending fiber. Returns the same result as resume.
(case dispatch & pairs)
Select the body that equals the dispatch value. When pairs
has an odd number of elements, the last is the
default expression. If no match is found, returns nil.
(catseq head & body)
Similar to loop
, but concatenates each element from the loop body into an array and returns that. See loop
for details.
(chr c)
Convert a string of length 1 to its byte (ascii) value at compile time.
(cli-main args)
Entrance for the Janet CLI tool. Call this function with the command line arguments as an array or tuple of strings to invoke the CLI interface.
(cmp x y)
Returns -1 if x is strictly less than y, 1 if y is strictly greater than x, and 0 otherwise. To return 0, x and y must be the exact same type.
(comp & functions)
Takes multiple functions and returns a function that is the composition of those functions.
(compare x y)
Polymorphic compare. Returns -1, 0, 1 for x < y, x = y, x > y respectively. Differs from the primitive
comparators in that it first checks to see whether either x or y implement a compare
method which can compare
x and y. If so, it uses that method. If not, it delegates to the primitive comparators.
(compare< & xs)
Equivalent of <
but using polymorphic compare
instead of primitive comparator.
(compare<= & xs)
Equivalent of <=
but using polymorphic compare
instead of primitive comparator.
(compare= & xs)
Equivalent of =
but using polymorphic compare
instead of primitive comparator.
(compare> & xs)
Equivalent of >
but using polymorphic compare
instead of primitive comparator.
(compare>= & xs)
Equivalent of >=
but using polymorphic compare
instead of primitive comparator.
(compif cnd tru &opt fals)
Check the condition cnd
at compile time -- if truthy, compile tru
, else compile fals
.
(compile ast &opt env source lints)
Compiles an Abstract Syntax Tree (ast) into a function. Pair the compile function with parsing functionality to
implement eval. Returns a new function and does not modify ast. Returns an error struct with keys :line,
:column, and :error if compilation fails. If a lints
array is given, linting messages will be appended to the
array. Each message will be a tuple of the form (level line col message)
.
(complement f)
Returns a function that is the complement to the argument.
(comptime x)
Evals x at compile time and returns the result. Similar to a top level unquote.
(compwhen cnd & body)
Check the condition cnd
at compile time -- if truthy, compile (upscope ;body)
, else compile nil.
(cond & pairs)
Evaluates conditions sequentially until the first true condition is found, and then executes the corresponding body. If there are an odd number of forms, and no forms are matched, the last expression is executed. If there are no matches, returns nil.
(coro & body)
A wrapper for making fibers that may yield multiple values (coroutine). Same as (fiber/new (fn [] ;body)
:yi)
.
(count pred ind & inds)
Count the number of items in ind
for which (pred item)
is true.
(curenv &opt n)
Get the current environment table. Same as (fiber/getenv (fiber/current))
. If n
is provided, gets the nth
prototype of the environment table.
(debug &opt x)
Throws a debug signal that can be caught by a parent fiber and used to inspect the running state of the current fiber. Returns the value passed in by resume.
(debug/arg-stack fiber)
Gets all values currently on the fiber's argument stack. Normally, this should be empty unless the fiber signals while pushing arguments to make a function call. Returns a new array.
(debug/break source line col)
Sets a breakpoint in source
at a given line and column. Will throw an error if the breakpoint location cannot
be found. For example
(debug/break "core.janet" 10 4)
will set a breakpoint at line 10, 4th column of the file core.janet.
(debug/fbreak fun &opt pc)
Set a breakpoint in a given function. pc is an optional offset, which is in bytecode instructions. fun is a function value. Will throw an error if the offset is too large or negative.
(debug/lineage fib)
Returns an array of all child fibers from a root fiber. This function is useful when a fiber signals or errors to an ancestor fiber. Using this function, the fiber handling the error can see which fiber raised the signal. This function should be used mostly for debugging purposes.
(debug/stack fib)
Gets information about the stack as an array of tables. Each table in the array contains information about a stack frame. The top-most, current stack frame is the first table in the array, and the bottom-most stack frame is the last value. Each stack frame contains some of the following attributes:
:c - true if the stack frame is a c function invocation
:source-column - the current source column of the stack frame
:function - the function that the stack frame represents
:source-line - the current source line of the stack frame
:name - the human-friendly name of the function
:pc - integer indicating the location of the program counter
:source - string with the file path or other identifier for the source code
:slots - array of all values in each slot
:tail - boolean indicating a tail call
(debug/stacktrace fiber &opt err prefix)
Prints a nice looking stacktrace for a fiber. Can optionally provide an error value to print the stack trace
with. If prefix
is nil or not provided, will skip the error line. Returns the fiber.
(debug/step fiber &opt x)
Run a fiber for one virtual instruction of the Janet machine. Can optionally pass in a value that will be passed as the resuming value. Returns the signal value, which will usually be nil, as breakpoints raise nil signals.
(debug/unbreak source line column)
Remove a breakpoint with a source key at a given line and column. Will throw an error if the breakpoint cannot be found.
(debug/unfbreak fun &opt pc)
Unset a breakpoint set with debug/fbreak.
(debugger fiber &opt level)
Run a repl-based debugger on a fiber. Optionally pass in a level to differentiate nested debuggers.
An environment that contains dot prefixed functions for debugging.
(debugger-on-status env &opt level is-repl)
Create a function that can be passed to run-context
's :on-status
argument that will drop into a debugger on
errors. The debugger will only start on abnormal signals if the env table has the :debug
dyn set to a truthy
value.
(deep-not= x y)
Like not=
, but mutable types (arrays, tables, buffers) are considered equal if they have identical structure.
Much slower than not=
.
(deep= x y)
Like =
, but mutable types (arrays, tables, buffers) are considered equal if they have identical structure.
Much slower than =
.
(def- name & more)
Define a private value that will not be exported.
# In a file module.janet
(def- private-thing :encapsulated)
(def public-thing :exposed)
# In a file main.janet
(import module)
module/private-thing # -> Unknown symbol
module/public-thing # -> :exposed
# Same as normal def with :private metadata
(def private-thing :private :encapsulated)
Community Examples(default sym val)
Define a default value for an optional argument. Expands to (def sym (if (= nil sym) val sym))
.
The default grammar used for pegs. This grammar defines several common patterns that should make it easier to write more complex patterns.
(defdyn alias & more)
Define an alias for a keyword that is used as a dynamic binding. The alias is a normal, lexically scoped
binding that can be used instead of a keyword to prevent typos. defdyn
does not set dynamic bindings or
otherwise replace dyn
and setdyn
. The alias _must_ start and end with the *
character, usually called
"earmuffs".
(defer form & body)
Run form
unconditionally after body
, even if the body throws an error. Will also run form
if a user
signal 0-4 is received.
# Evaluates to 6 after printing "scope left!"
(defer (print "scope left!")
(+ 1 2 3))
# cleanup will always be called, even if there is a failure
(defer (cleanup)
(step-1)
(step-2)
(if (< 0.1 (math/random)) (error "failure"))
(step-3))
Community Examples(defmacro- name & more)
Define a private macro that will not be exported.
(defn name & more)
Define a function. Equivalent to (def name (fn name [args] ...))
.
(defn simple
[x]
(print (+ x 1)))
# prints 11
(simple 10) # -> nil
(defn long-body
[y]
(print y)
(print (+ y 1))
(print (+ y 2))
(+ y 3))
(defn with-docstring
"This function has a docstring"
[]
(print "hello!"))
(defn with-tags
:tag1 :tag2 :private
"Also has a docstring and a variadic argument 'more'!"
[x y z & more]
[x y z more])
(with-tags 1 2) # compile error: <function with-tags> expects at least 3 arguments, got 2
(with-tags 1 2 3) # -> (1 2 3 ())
(with-tags 1 2 3 4) # -> (1 2 3 (4))
(with-tags 1 2 3 4 5) # -> (1 2 3 (4 5))
# Tags (and other metadata) are (usually) visible in the environment.
(dyn 'with-tags) # -> @{:tag2 true :value <function with-tags> :doc "(with-tags x y z & more)\n\nAlso has a docstring..." :source-map ("repl" 4 1) :tag1 true :private true}
Community Examples(defn- name & more)
Define a private function that will not be exported.
# In a file module.janet
(defn- not-exposed-fn
[x]
(+ x x))
(not-exposed-fn 10) # -> 20
# In a file main.janet
(import module)
(module/not-exposed-fn 10) # -> compile error: unknown symbol module/not-exposed-fn
# Same as
(defn not-exposed-fn
:private
[x]
(+ x x))
Community Examples(delay & forms)
Lazily evaluate a series of expressions. Returns a function that returns the result of the last expression. Will only evaluate the body once, and then memoizes the result.
(def setup-once
(let [setup |(print "running setup")]
(delay
(setup)
"setup complete")))
# first run will print "running setup" followed by "setup complete"
(printf "first run: %s" (setup-once))
# after that, only prints cached value "setup complete"
(printf "second run: %s" (setup-once))
Community Examples(describe x)
Returns a string that is a human-readable description of x
. For recursive data structures, the string
returned contains a pointer value from which the identity of x
can be determined.
(disasm func &opt field)
Returns assembly that could be used to compile the given function. func must be a function, not a c function. Will throw on error on a badly typed argument. If given a field name, will only return that part of the function assembly. Possible fields are:
- :arity - number of required and optional arguments.
- :min-arity - minimum number of arguments function can be called with.
- :max-arity - maximum number of arguments function can be called with.
- :vararg - true if function can take a variable number of arguments.
- :bytecode - array of parsed bytecode instructions. Each instruction is a tuple.
- :source - name of source file that this function was compiled from.
- :name - name of function.
- :slotcount - how many virtual registers, or slots, this function uses. Corresponds to stack space used by function.
- :symbolmap - all symbols and their slots.
- :constants - an array of constants referenced by this function.
- :sourcemap - a mapping of each bytecode instruction to a line and column in the source file.
- :environments - an internal mapping of which enclosing functions are referenced for bindings.
- :defs - other function definitions that this function may instantiate.
(distinct xs)
Returns an array of the deduplicated values in xs
.
(distinct @[1 2 3 2 1]) # -> @[1 2 3]
(distinct [1 2 3 2 1]) # -> @[1 2 3]
(distinct "bookkeeper") # -> @[98 111 107 101 112 114]
(sort (map string/from-bytes
(distinct "bookkeeper"))) # -> @["b" "e" "k" "o" "p" "r"]
Community Examples(div & xs)
Returns the floored division of xs. If xs is empty, returns 1. If xs has one value x, returns the reciprocal of x. Otherwise return the first value of xs repeatedly divided by the remaining values.
(doc &opt sym)
Shows documentation for the given symbol, or can show a list of available bindings. If sym
is a symbol, will
look for documentation for that symbol. If sym
is a string or is not provided, will show all lexical and
dynamic bindings in the current environment containing that string (all bindings will be shown if no string is
given).
(doc* &opt sym)
Get the documentation for a symbol in a given environment. Function form of doc
.
(doc-format str &opt width indent colorize)
Reformat a docstring to wrap a certain width. Docstrings can either be plaintext or a subset of markdown. This allows a long single line of prose or formatted text to be a well-formed docstring. Returns a buffer containing the formatted text.
(doc-of x)
Searches all loaded modules in module/cache for a given binding and prints out its documentation. This does a search by value instead of by name. Returns nil.
(dofile path &named exit env source expander evaluator read parser)
Evaluate a file, file path, or stream and return the resulting environment. :env, :expander, :source,
:evaluator, :read, and :parser are passed through to the underlying run-context
call. If exit
is true, any
top level errors will trigger a call to (os/exit 1)
after printing the error.
(drop n ind)
Drop the first n
elements in an indexed or bytes type. Returns a new tuple or string instance, respectively.
If n
is negative, drops the last n
elements instead.
(drop-until pred ind)
Same as (drop-while (complement pred) ind)
.
(drop-while pred ind)
Given a predicate, remove elements from an indexed or bytes type that satisfy the predicate, and abort on first failure. Returns a new tuple or string, respectively.
(dyn key &opt default)
Get a dynamic binding. Returns the default value (or nil) if no binding found.
(each x ds & body)
Loop over each value in ds
. Returns nil.
# prints 12345
(each x [1 2 3 4 5] (prin x)) # -> nil
# prints 12345
(each y @[1 2 3 4 5] (prin y)) # -> nil
# prints values from struct in an unspecified order
# 21 -or- 12
(each x {:a 1 :b 2} (prin x)) # -> nil
Community Examples(eachk x ds & body)
Loop over each key in ds
. Returns nil.
# keys for tuple/array are 0-based index
# prints 0 1 2 3 4
(eachk i [:a :b :c :d :e] (prin i " ")) # -> nil
# prints 0 1 2 3 4
(eachk i @["a" "b" "c" "d" "e"] (prin i " ")) # -> nil
# prints keys in table/struct in an unspecified order
# prints :b :a
(eachk k {:a 1 :b 2} (prinf "%v " k)) # -> nil
# prints :foo :bar
(eachk k @{:foo "A" :bar "B"} (prinf "%v " k)) # -> nil
Community Examples(eachp x ds & body)
Loop over each (key, value) pair in ds
. Returns nil.
# keys for tuple/array are 0-based index
# prints 0->:a 1->:b 2->:c 3->:d 4->:e
(eachp [i x] [:a :b :c :d :e] (prinf "%v->%v " i x)) # -> nil
# prints 0->"a" 1->"b" 2->"c" 3->"d" 4->"e"
(eachp [i x] @["a" "b" "c" "d" "e"] (prinf "%v->%v " i x)) # -> nil
# key, value from table/struct in an unspecified order
# prints :b -> 2 :a -> 1
(eachp [k v] {:a 1 :b 2} (prinf "%v -> %v " k v)) # -> nil
# prints :foo -> "A" :bar -> "B"
(eachp [k v] @{:foo "A" :bar "B"} (prinf "%v -> %v " k v)) # -> nil
Community Examples(edefer form & body)
Run form
after body
in the case that body terminates abnormally (an error or user signal 0-4). Otherwise,
return last form in body
.
# Half of the time, return "ok", the other
# half of the time, print there was an error and throw "oops".
(edefer (print "there was an error")
(if (< (math/random) 0.5)
(error "oops")
"ok"))
Community Examples(eflush)
Flush (dyn :err stderr)
if it is a file, otherwise do nothing.
(empty? xs)
Check if xs is empty.
(empty? []) # -> true
(empty? [1]) # -> false
(empty? @[]) # -> true
(empty? @{}) # -> true
(empty? "") # -> true
(empty? 0) # -> error: expected iterable type, got 0
Community Examples(env-lookup env)
Creates a forward lookup table for unmarshalling from an environment. To create a reverse lookup table, use the invert function to swap keys and values in the returned table.
(eprin & xs)
Same as prin
, but uses (dyn :err stderr)
instead of (dyn :out stdout)
.
(eprinf fmt & xs)
Like eprintf
but with no trailing newline.
(eprint & xs)
Same as print
, but uses (dyn :err stderr)
instead of (dyn :out stdout)
.
(eprintf fmt & xs)
Prints output formatted as if with (string/format fmt ;xs)
to (dyn :err stderr)
with a trailing newline.
(error e)
Throws an error e that can be caught and handled by a parent fiber.
(errorf fmt & args)
A combination of error
and string/format
. Equivalent to (error (string/format fmt ;args))
.
(ev/acquire-lock lock)
Acquire a lock such that this operating system thread is the only thread with access to this resource. This will block this entire thread until the lock becomes available, and will not yield to other fibers on this system thread.
(ev/acquire-rlock rwlock)
Acquire a read lock an a read-write lock.
(ev/acquire-wlock rwlock)
Acquire a write lock on a read-write lock.
(ev/all-tasks)
Get an array of all active fibers that are being used by the scheduler.
(ev/call f & args)
Call a function asynchronously. Returns a fiber that is scheduled to run the function.
(ev/cancel fiber err)
Cancel a suspended fiber in the event loop. Differs from cancel in that it returns the canceled fiber immediately.
(ev/capacity channel)
Get the number of items a channel will store before blocking writers.
(ev/chan &opt capacity)
Create a new channel. capacity is the number of values to queue before blocking writers, defaults to 0 if not provided. Returns a new channel.
(ev/chan-close chan)
Close a channel. A closed channel will cause all pending reads and writes to return nil. Returns the channel.
(ev/chunk stream n &opt buffer timeout)
Same as ev/read, but will not return early if less than n bytes are available. If an end of stream is reached, will also return early with the collected bytes.
(ev/close stream)
Close a stream. This should be the same as calling (:close stream) for all streams.
(ev/count channel)
Get the number of items currently waiting in a channel.
(ev/deadline sec &opt tocancel tocheck)
Schedules the event loop to try to cancel the tocancel
task as with ev/cancel
. After sec
seconds, the
event loop will attempt cancellation of tocancel
if the tocheck
fiber is resumable. sec
is a number that
can have a fractional part. tocancel
defaults to (fiber/root)
, but if specified, must be a task (root
fiber). tocheck
defaults to (fiber/current)
, but if specified, should be a fiber. Returns tocancel
immediately.
(ev/do-thread & body)
Run some code in a new thread. Suspends the current fiber until the thread is complete, and evaluates to nil.
(ev/gather & bodies)
Run a number of fibers in parallel on the event loop, and join when they complete. Returns the gathered results in an array.
(ev/give channel value)
Write a value to a channel, suspending the current fiber if the channel is full. Returns the channel if the write succeeded, nil otherwise.
(ev/give-supervisor tag & payload)
Send a message to the current supervisor channel if there is one. The message will be a tuple of all of the arguments combined into a single message, where the first element is tag. By convention, tag should be a keyword indicating the type of message. Returns nil.
(ev/go fiber-or-fun &opt value supervisor)
Put a fiber on the event loop to be resumed later. If a function is used, it is wrapped with fiber/new
first.
Optionally pass a value to resume with, otherwise resumes with nil. Returns the fiber. An optional
core/channel
can be provided as a supervisor. When various events occur in the newly scheduled fiber, an
event will be pushed to the supervisor. If not provided, the new fiber will inherit the current supervisor.
(ev/read stream n &opt buffer timeout)
Read up to n bytes into a buffer asynchronously from a stream. n
can also be the keyword :all
to read into
the buffer until end of stream. Optionally provide a buffer to write into as well as a timeout in seconds after
which to cancel the operation and raise an error. Returns the buffer if the read was successful or nil if
end-of-stream reached. Will raise an error if there are problems with the IO operation.
(ev/release-lock lock)
Release a lock such that other threads may acquire it.
(ev/release-rlock rwlock)
Release a read lock on a read-write lock
(ev/release-wlock rwlock)
Release a write lock on a read-write lock
(ev/rselect & clauses)
Similar to ev/select, but will try clauses in a random order for fairness.
(ev/rwlock)
Create a new read-write lock to coordinate threads.
(ev/select & clauses)
Block until the first of several channel operations occur. Returns a tuple of the form [:give chan], [:take chan x], or [:close chan], where a :give tuple is the result of a write and a :take tuple is the result of a read. Each clause must be either a channel (for a channel take operation) or a tuple [channel x] (for a channel give operation). Operations are tried in order such that earlier clauses take precedence over later clauses. Both give and take operations can return a [:close chan] tuple, which indicates that the specified channel was closed while waiting, or that the channel was already closed.
(ev/sleep sec)
Suspend the current fiber for sec seconds without blocking the event loop.
(ev/spawn & body)
Run some code in a new fiber. This is shorthand for (ev/go (fn [] ;body))
.
(ev/spawn-thread & body)
Run some code in a new thread. Like ev/do-thread
, but returns nil immediately.
(ev/take channel)
Read from a channel, suspending the current fiber if no value is available.
(ev/thread main &opt value flags supervisor)
Run main
in a new operating system thread, optionally passing value
to resume with. The parameter main
can either be a fiber, or a function that accepts 0 or 1 arguments. Unlike ev/go
, this function will suspend
the current fiber until the thread is complete. If you want to run the thread without waiting for a result,
pass the :n
flag to return nil immediately. Otherwise, returns nil. Available flags:
-
:n
- return immediately -
:t
- set the task-id of the new thread to value. The task-id is passed in messages to the supervisor channel. -
:a
- don't copy abstract registry to new thread (performance optimization) -
:c
- don't copy cfunction registry to new thread (performance optimization)
(ev/thread-chan &opt limit)
Create a threaded channel. A threaded channel is a channel that can be shared between threads and used to communicate between any number of operating system threads.
(ev/to-file)
Create core/file copy of the stream. This value can be used when blocking IO behavior is needed.
(ev/with-deadline sec & body)
Create a fiber to execute body
, schedule the event loop to cancel the task (root fiber) associated with
body
's fiber, and start body
's fiber by resuming it.
The event loop will try to cancel the root fiber if body
's fiber has not completed after at least sec
seconds.
sec
is a number that can have a fractional part.
(ev/with-lock lock & body)
Run a body of code after acquiring a lock. Will automatically release the lock when done.
(ev/with-rlock lock & body)
Run a body of code after acquiring read access to an rwlock. Will automatically release the lock when done.
(ev/with-wlock lock & body)
Run a body of code after acquiring write access to an rwlock. Will automatically release the lock when done.
(ev/write stream data &opt timeout)
Write data to a stream, suspending the current fiber until the write completes. Takes an optional timeout in seconds, after which will return nil. Returns nil, or raises an error if the write failed.
(eval form &opt env)
Evaluates a form in the current environment. If more control over the environment is needed, use run-context
.
Optionally pass in an env
table with available bindings.
(eval '(+ 1 2 3)) # -> 6
(eval '(error :oops)) # -> error :oops
(eval '(+ nil nil)) # -> error: could not find method :+ for nil or :r+ for nil
Community Examples(eval-string str &opt env)
Evaluates a string in the current environment. If more control over the environment is needed, use
run-context
. Optionally pass in an env
table with available bindings.
(eval-string "(+ 1 2 3 4)") # -> 10
(eval-string ")") # -> error: unexpected closing delimiter )
(eval-string "(bloop)") # -> error: unknown symbol bloop
(eval-string "(+ nil nil)") # -> error: could not find method :+ for nil or :r+ for nil
Community Examples(every? ind)
Evaluates to the last element of ind
if all preceding elements are truthy, otherwise evaluates to the first
falsey element.
(extreme order args)
Returns the most extreme value in args
based on the function order
. order
should take two values and
return true or false (a comparison). Returns nil if args
is empty.
(ffi/align type)
Get the align of an ffi type in bytes.
(ffi/call pointer signature & args)
Call a raw pointer as a function pointer. The function signature specifies how Janet values in args
are
converted to native machine types.
(ffi/calling-conventions)
Get an array of all supported calling conventions on the current architecture. Some architectures may have some FFI functionality (ffi/malloc, ffi/free, ffi/read, ffi/write, etc.) but not support any calling conventions. This function can be used to get all supported calling conventions that can be used on this architecture. All architectures support the :none calling convention which is a placeholder that cannot be used at runtime.
(ffi/close native)
Free a native object. Dereferencing pointers to symbols in the object will have undefined behavior after freeing.
(ffi/context &opt native-path &named map-symbols lazy)
Set the path of the dynamic library to implicitly bind, as well as other global state for ease of creating native bindings.
(ffi/defbind name ret-type & body)
Generate bindings for native functions in a convenient manner.
(ffi/defbind-alias name alias ret-type & body)
Generate bindings for native functions in a convenient manner. Similar to defbind but allows for the janet function name to be different than the FFI function.
(ffi/free pointer)
Free memory allocated with ffi/malloc
. Returns nil.
(ffi/jitfn bytes)
Create an abstract type that can be used as the pointer argument to ffi/call
. The content of bytes
is
architecture specific machine code that will be copied into executable memory.
(ffi/lookup native symbol-name)
Lookup a symbol from a native object. All symbol lookups will return a raw pointer if the symbol is found, else nil.
(ffi/malloc size)
Allocates memory directly using the janet memory allocator. Memory allocated in this way must be freed manually! Returns a raw pointer, or nil if size = 0.
(ffi/native &opt path)
Load a shared object or dll from the given path, and do not extract or run any code from it. This is different
than native
, which will run initialization code to get a module table. If path
is nil, opens the current
running binary. Returns a core/native
.
(ffi/pointer-buffer pointer capacity &opt count offset)
Create a buffer from a pointer. The underlying memory of the buffer will not be reallocated or freed by the garbage collector, allowing unmanaged, mutable memory to be manipulated with buffer functions. Attempts to resize or extend the buffer beyond its initial capacity will raise an error. As with many FFI functions, this is memory unsafe and can potentially allow out of bounds memory access. Returns a new buffer.
(ffi/pointer-cfunction pointer &opt name source-file source-line)
Create a C Function from a raw pointer. Optionally give the cfunction a name and source location for stack traces and debugging.
(ffi/read ffi-type bytes &opt offset)
Parse a native struct out of a buffer and convert it to normal Janet data structures. This function is the
inverse of ffi/write
. bytes
can also be a raw pointer, although this is unsafe.
(ffi/signature calling-convention ret-type & arg-types)
Create a function signature object that can be used to make calls with raw function pointers.
(ffi/struct & types)
Create a struct type definition that can be used to pass structs into native functions.
(ffi/trampoline cc)
Get a native function pointer that can be used as a callback and passed to C libraries. This callback
trampoline has the signature void trampoline(void \*ctx, void \*userdata)
in the given calling convention.
This is the only function signature supported. It is up to the programmer to ensure that the userdata
argument contains a janet function the will be called with one argument, ctx
which is an opaque pointer. This
pointer can be further inspected with ffi/read
.
(ffi/write ffi-type data &opt buffer index)
Append a native type to a buffer such as it would appear in memory. This can be used to pass pointers to structs in the ffi, or send C/C++/native structs over the network or to files. Returns a modified buffer or a new buffer if one is not supplied.
(fiber-fn flags & body)
A wrapper for making fibers. Same as (fiber/new (fn [] ;body) flags)
.
(fiber/can-resume? fiber)
Check if a fiber is finished and cannot be resumed.
(fiber/current)
Returns the currently running fiber.
(fiber/getenv fiber)
Gets the environment for a fiber. Returns nil if no such table is set yet.
(fiber/last-value fiber)
Get the last value returned or signaled from the fiber.
(fiber/maxstack fib)
Gets the maximum stack size in janet values allowed for a fiber. While memory for the fiber's stack is not allocated up front, the fiber will not allocated more than this amount and will throw a stack-overflow error if more memory is needed.
(fiber/new func &opt sigmask env)
Create a new fiber with function body func. Can optionally take a set of signals sigmask
to capture from
child fibers, and an environment table env
. The mask is specified as a keyword where each character is used
to indicate a signal to block. If the ev module is enabled, and this fiber is used as an argument to ev/go
,
these "blocked" signals will result in messages being sent to the supervisor channel. The default sigmask is
:y. For example,
        (fiber/new myfun :e123)
blocks error signals and user signals 1, 2 and 3. The signals are as follows:
- :a - block all signals
- :d - block debug signals
- :e - block error signals
- :t - block termination signals: error + user[0-4]
- :u - block user signals
- :y - block yield signals
- :w - block await signals (user9)
- :r - block interrupt signals (user8)
- :0-9 - block a specific user signal
The sigmask argument also can take environment flags. If any mutually exclusive flags are present, the last flag takes precedence.
- :i - inherit the environment from the current fiber
- :p - the environment table's prototype is the current environment table
(fiber/root)
Returns the current root fiber. The root fiber is the oldest ancestor that does not have a parent.
(fiber/setenv fiber table)
Sets the environment table for a fiber. Set to nil to remove the current environment.
(fiber/setmaxstack fib maxstack)
Sets the maximum stack size in janet values for a fiber. By default, the maximum stack size is usually 8192.
(fiber/status fib)
Get the status of a fiber. The status will be one of:
- :dead - the fiber has finished
- :error - the fiber has errored out
- :debug - the fiber is suspended in debug mode
- :pending - the fiber has been yielded
- :user(0-7) - the fiber is suspended by a user signal
- :interrupted - the fiber was interrupted
- :suspended - the fiber is waiting to be resumed by the scheduler
- :alive - the fiber is currently running and cannot be resumed
- :new - the fiber has just been created and not yet run
(file/close f)
Close a file and release all related resources. When you are done reading a file, close it to prevent a resource leak and let other processes read the file.
(file/flush f)
Flush any buffered bytes to the file system. In most files, writes are buffered for efficiency reasons. Returns the file handle.
(file/lines file)
Return an iterator over the lines of a file.
(file/open path &opt mode buffer-size)
Open a file. path
is an absolute or relative path, and mode
is a set of flags indicating the mode to open
the file in. mode
is a keyword where each character represents a flag. If the file cannot be opened, returns
nil, otherwise returns the new file handle. Mode flags:
r - allow reading from the file
w - allow writing to the file
a - append to the file
Following one of the initial flags, 0 or more of the following flags can be appended:
b - open the file in binary mode (rather than text mode)
+ - append to the file instead of overwriting it
n - error if the file cannot be opened instead of returning nil
See fopen (<stdio.h>, C99) for further details.
(file/read f what &opt buf)
Read a number of bytes from a file f
into a buffer. A buffer buf
can be provided as an optional third
argument, otherwise a new buffer is created. what
can either be an integer or a keyword. Returns the buffer
with file contents. Values for what
:
:all - read the whole file
:line - read up to and including the next newline character
n (integer) - read up to n bytes from the file
(file/seek f &opt whence n)
Jump to a relative location in the file f
. whence
must be one of:
:cur - jump relative to the current file location
:set - jump relative to the beginning of the file
:end - jump relative to the end of the file
By default, whence
is :cur. Optionally a value n
may be passed for the relative number of bytes to seek in
the file. n
may be a real number to handle large files of more than 4GB. Returns the file handle.
(file/tell f)
Get the current value of the file position for file f
.
(file/temp)
Open an anonymous temporary file that is removed on close. Raises an error on failure.
(file/write f bytes)
Writes to a file. 'bytes' must be string, buffer, or symbol. Returns the file.
(filewatch/add watcher path &opt flags)
Add a path to the watcher. Available flags depend on the current OS, and are as follows:
Windows/MINGW (flags correspond to FILE_NOTIFY_CHANGE_* flags in win32 documentation):
:all
- trigger an event for all of the below triggers.:attributes
- FILE_NOTIFY_CHANGE_ATTRIBUTES:creation
- FILE_NOTIFY_CHANGE_CREATION:dir-name
- FILE_NOTIFY_CHANGE_DIR_NAME:last-access
- FILE_NOTIFY_CHANGE_LAST_ACCESS:last-write
- FILE_NOTIFY_CHANGE_LAST_WRITE:security
- FILE_NOTIFY_CHANGE_SECURITY:size
- FILE_NOTIFY_CHANGE_SIZE:recursive
- watch subdirectories recursively
Linux (flags correspond to IN_* flags from <sys/inotify.h>):
:access
- IN_ACCESS:all
- IN_ALL_EVENTS:attrib
- IN_ATTRIB:close-nowrite
- IN_CLOSE_NOWRITE:close-write
- IN_CLOSE_WRITE:create
- IN_CREATE:delete
- IN_DELETE:delete-self
- IN_DELETE_SELF:ignored
- IN_IGNORED:modify
- IN_MODIFY:move-self
- IN_MOVE_SELF:moved-from
- IN_MOVED_FROM:moved-to
- IN_MOVED_TO:open
- IN_OPEN:q-overflow
- IN_Q_OVERFLOW:unmount
- IN_UNMOUNT
On Windows, events will have the following possible types:
:unknown
:added
:removed
:modified
:renamed-old
:renamed-new
On Linux, events will a :type
corresponding to the possible flags, excluding :all
.
(filewatch/listen watcher)
Listen for changes in the watcher.
(filewatch/new channel &opt default-flags)
Create a new filewatcher that will give events to a channel channel. See filewatch/add
for available flags.
When an event is triggered by the filewatcher, a struct containing information will be given to channel as with
ev/give
. The contents of the channel depend on the OS, but will contain some common keys:
:type
-- the type of the event that was raised.:file-name
-- the base file name of the file that triggered the event.:dir-name
-- the directory name of the file that triggered the event.
Events also will contain keys specific to the host OS.
Windows has no extra properties on events.
Linux has the following extra properties on events:
:wd
-- the integer key returned byfilewatch/add
for the path that triggered this.:wd-path
-- the string path for watched directory of file. For files, will be the same as:file-name
, and for directories, will be the same as:dir-name
.:cookie
-- a randomized integer used to associate related events, such as :moved-from and :moved-to events.
(filewatch/remove watcher path)
Remove a path from the watcher.
(filewatch/unlisten watcher)
Stop listening for changes on a given watcher.
(filter pred ind)
Given a predicate, take only elements from an array or tuple for which (pred element)
is truthy. Returns a
new array.
(filter pos? [1 2 3 0 -4 5 6]) # -> @[1 2 3 5 6]
(filter |(> (length $) 3) ["hello" "goodbye" "hi"]) # -> @["hello" "goodbye"]
(filter |(< (chr "A") $) "foo01bar") # -> @[102 111 111 98 97 114]
(string/from-bytes ;(filter |(< (chr "A") $) "foo01bar")) # -> "foobar"
Community Examples(find pred ind &opt dflt)
Find the first value in an indexed collection that satisfies a predicate. Returns dflt
if not found.
(find-index pred ind &opt dflt)
Find the index of indexed type for which pred
is true. Returns dflt
if not found.
(first xs)
Get the first element from an indexed data structure.
(flatten xs)
Takes a nested array (tree) xs
and returns the depth first traversal of it. Returns a new array.
(flatten-into into xs)
Takes a nested array (tree) xs
and appends the depth first traversal of xs
to array into
. Returns into
.
(flush)
Flush (dyn :out stdout)
if it is a file, otherwise do nothing.
(flycheck path &keys kwargs)
Check a file for errors without running the file. Found errors will be printed to stderr in the usual format.
Macros will still be executed, however, so arbitrary execution is possible. Other arguments are the same as
dofile
. path
can also be a file value such as stdin. Returns nil.
(for i start stop & body)
Do a C-style for-loop for side effects. Returns nil.
(forever & body)
Evaluate body forever in a loop, or until a break statement.
(forv i start stop & body)
Do a C-style for-loop for side effects. The iteration variable i
can be mutated in the loop, unlike normal
for
. Returns nil.
(freeze x)
Freeze an object (make it immutable) and do a deep copy, making child values also immutable. Closures, fibers, and abstract types will not be recursively frozen, but all other types will.
(frequencies ind)
Get the number of occurrences of each value in an indexed data structure.
(from-pairs ps)
Takes a sequence of pairs and creates a table from each pair. It is the inverse of pairs
on a table. Returns
a new table.
(function? x)
Check if x is a function (not a cfunction).
(gccollect)
Run garbage collection. You should probably not call this manually.
(gcinterval)
Returns the integer number of bytes to allocate before running an iteration of garbage collection.
(gcsetinterval interval)
Set an integer number of bytes to allocate before running garbage collection. Low values for interval will be slower but use less memory. High values will be faster but use more memory.
(generate head & body)
Create a generator expression using the loop
syntax. Returns a fiber that yields all values inside the loop
in order. See loop
for details.
# An infinite stream of random numbers, but doubled.
(def g (generate [_ :iterate true :repeat 2] (math/random)))
# -> <fiber 0x5562863141E0>
(resume g) # -> 0.487181
(resume g) # -> 0.487181
(resume g) # -> 0.507917
(resume g) # -> 0.507917
# ...
Community Examples(gensym)
Returns a new symbol that is unique across the runtime. This means it will not collide with any already created symbols during compilation, so it can be used in macros to generate automatic bindings.
(geomean xs)
Returns the geometric mean of xs. If empty, returns NaN.
(get ds key &opt dflt)
Get the value mapped to key in data structure ds, and return dflt or nil if not found. Similar to in, but will not throw an error if the key is invalid for the data structure unless the data structure is an abstract type. In that case, the abstract type getter may throw an error.
(get-in ds ks &opt dflt)
Access a value in a nested data structure. Looks into the data structure via a sequence of keys. If value is
not found, and dflt
is provided, returns dflt
.
(getline &opt prompt buf env)
Reads a line of input into a buffer, including the newline character, using a prompt. An optional environment table can be provided for auto-complete. Returns the modified buffer. Use this function to implement a simple interface for a terminal program.
(getproto x)
Get the prototype of a table or struct. Will return nil if x
has no prototype.
(group-by f ind)
Group elements of ind
by a function f
and put the results into a new table. The keys of the table are the
distinct return values from calling f
on the elements of ind
. The values of the table are arrays of all
elements of ind
for which f
called on the element equals that corresponding key.
(has-key? ds key)
Check if a data structure ds
contains the key key
.
# tables
(has-key? @{} 0) # -> false
(has-key? @{:key1 "foo" :key2 "bar"} :key1) # -> true
(has-key? @{:key1 "foo" :key2 "bar"} :key3) # -> false
# structs
(has-key? {} 0) # -> false
(has-key? {:key1 "foo" :key2 "bar"} :key1) # -> true
(has-key? {:key1 "foo" :key2 "bar"} :key3) # -> false
# buffers, tuples and arrays check for index as key
(has-key? "" 0) # -> false
(has-key? "a" 0) # -> true
(has-key? "a" 1) # -> false
(has-key? [] 0) # -> false
(has-key? ["a" "b" "c"] 1) # -> true
(has-key? ["a" "b" "c"] 4) # -> false
(has-key? @[] 0) # -> false
(has-key? @["a" "b" "c"] 1) # -> true
(has-key? @["a" "b" "c"] 4) # -> false
Community Examples(has-value? ds value)
Check if a data structure ds
contains the value value
. Will run in time proportional to the size of ds
.
# tables
(has-value? @{} 0) # -> false
(has-value? @{:key1 "foo" :key2 "bar"} "foo") # -> true
(has-value? @{:key1 "foo" :key2 "bar"} "hello") # -> false
(has-value? @{:key1 "foo" :key2 "bar"} nil) # -> false
# structs
(has-value? {} 0) # -> false
(has-value? {:key1 "foo" :key2 "bar"} "foo") # -> true
(has-value? {:key1 "foo" :key2 "bar"} "hello") # -> false
(has-value? {:key1 "foo" :key2 "bar"} nil) # -> false
# buffers - individual values are bytes
(has-value? "" 0) # -> false
(has-value? "" nil) # -> false
(has-value? "abc" 97) # -> true
(has-value? "abc" "a") # -> false
(has-value? "abc" 'a) # -> false
# tuples
(has-value? [] 0) # -> false
(has-value? ["a" "b" "c"] "a") # -> true
(has-value? ["a" "b" "c"] 'a) # -> false
(has-value? ["a" "b" "c"] 97) # -> false
# arrays
(has-value? @[] 0) # -> false
(has-value? @["a" "b" "c"] "a") # -> true
(has-value? @["a" "b" "c"] 'a) # -> false
(has-value? @["a" "b" "c"] 97) # -> false
Community Examples(hash value)
Gets a hash for any value. The hash is an integer can be used as a cheap hash function for all values. If two values are strictly equal, then they will have the same hash value.
(idempotent? x)
Check if x is a value that evaluates to itself when compiled.
(if-let bindings tru &opt fal)
Make multiple bindings, and if all are truthy, evaluate the tru
form. If any are false or nil, evaluate the
fal
form. Bindings have the same syntax as the let
macro.
(if-not condition then &opt else)
Shorthand for (if (not condition) else then)
.
(if-with [binding ctor dtor] truthy &opt falsey)
Similar to with
, but if binding is false or nil, evaluates the falsey path. Otherwise, evaluates the truthy
path. In both cases, ctor
is bound to binding.
(import path & args)
Import a module. First requires the module, and then merges its symbols into the current environment,
prepending a given prefix as needed. (use the :as or :prefix option to set a prefix). If no prefix is provided,
use the name of the module as a prefix. One can also use ":export true
" to re-export the imported symbols. If
":exit true
" is given as an argument, any errors encountered at the top level in the module will cause
(os/exit 1)
to be called. Dynamic bindings will NOT be imported. Use :fresh to bypass the module cache. Use
:only [foo bar baz]
to only import select bindings into the current environment.
(import* path & args)
Function form of import
. Same parameters, but the path and other symbol parameters should be strings instead.
(in ds key &opt dflt)
Get value in ds at key, works on associative data structures. Arrays, tuples, tables, structs, strings, symbols, and buffers are all associative and can be used. Arrays, tuples, strings, buffers, and symbols must use integer keys that are in bounds or an error is raised. Structs and tables can take any value as a key except nil and will return nil or dflt if not found.
(index-of x ind &opt dflt)
Find the first key associated with a value x in a data structure, acting like a reverse lookup. Will not look
at table prototypes. Returns dflt
if not found.
(int/s64 value)
Create a boxed signed 64 bit integer from a string value or a number.
(int/to-bytes value &opt endianness buffer)
Write the bytes of an int/s64
or int/u64
into a buffer. The buffer
parameter specifies an existing buffer
to write to, if unset a new buffer will be created. Returns the modified buffer. The endianness
parameter
indicates the byte order:
-
nil
(unset): system byte order -
:le
: little-endian, least significant byte first -
:be
: big-endian, most significant byte first
(int/to-number value)
Convert an int/u64 or int/s64 to a number. Fails if the number is out of range for an int64.
(int/u64 value)
Create a boxed unsigned 64 bit integer from a string value or a number.
(int? x)
Check if x can be exactly represented as a 32 bit signed two's complement integer.
(interleave & cols)
Returns an array of the first elements of each col, then the second elements, etc.
(interpose sep ind)
Returns a sequence of the elements of ind
separated by sep
. Returns a new array.
(invert ds)
Given an associative data structure ds
, returns a new table where the keys of ds
are the values, and the
values are the keys. If multiple keys in ds
are mapped to the same value, only one of those values will
become a key in the returned table.
The flag set of config options from janetconf.h which is used to check if native modules are compatible with the host program.
(juxt & funs)
Macro form of juxt*
. Same behavior but more efficient.
(juxt* & funs)
Returns the juxtaposition of functions. In other words, ((juxt* a b c) x)
evaluates to [(a x) (b x) (c x)]
.
(keep pred ind & inds)
Given a predicate pred
, return a new array containing the truthy results of applying pred
to each element
in the indexed collection ind
. This is different from filter
which returns an array of the original
elements where the predicate is truthy.
# returns an array of truthy results of predicate
(keep identity [false :x nil true]) # -> @[:x true]
# keep values > 1, equivalent to filter
(keep (fn [x] (when (> x 1) x)) @[0 1 2 3]) # -> @[2 3]
# for all members > 2, keep the square
(keep (fn [x] (when (> x 2) (* x x))) [0 1 3 4 5]) # -> @[9 16 25]
Community Examples(keep-syntax before after)
Creates a tuple with the tuple type and sourcemap of before
but the elements of after
. If either one of its
arguments is not a tuple, returns after
unmodified. Useful to preserve syntactic information when
transforming an ast in macros.
(keep-syntax! before after)
Like keep-syntax
, but if after
is an array, it is coerced into a tuple. Useful to preserve syntactic
information when transforming an ast in macros.
(keyword & xs)
Creates a keyword by concatenating the elements of xs
together. If an element is not a byte sequence, it is
converted to bytes via describe
. Returns the new keyword.
(keyword/slice bytes &opt start end)
Same as string/slice, but returns a keyword.
(kvs dict)
Takes a table or struct and returns and array of key value pairs like @[k v k v ...]
. Returns a new array.
(label name & body)
Set a label point that is lexically scoped. name
should be a symbol that will be bound to the label.
(last xs)
Get the last element from an indexed data structure.
(length ds)
Returns the length or count of a data structure in constant time as an integer. For structs and tables, returns the number of key-value pairs in the data structure.
(lengthable? x)
Check if x is a bytes, indexed, or dictionary.
(let bindings & body)
Create a scope and bind values to symbols. Each pair in bindings
is assigned as if with def
, and the body
of the let
form returns the last value.
(load-image image)
The inverse operation to make-image
. Returns an environment.
A table used in combination with unmarshal
to unmarshal byte sequences created by make-image
, such that
(load-image bytes)
is the same as (unmarshal bytes load-image-dict)
.
(loop head & body)
A general purpose loop macro. This macro is similar to the Common Lisp loop macro, although intentionally much smaller in scope. The head of the loop should be a tuple that contains a sequence of either bindings or conditionals. A binding is a sequence of three values that define something to loop over. Bindings are written in the format:
        binding :verb object/expression
where binding
is a binding as passed to def, :verb
is one of a set of keywords, and object
is any
expression. Each subsequent binding creates a nested loop within the loop created by the previous binding.
The available verbs are:
:iterate
-- repeatedly evaluate and bind to the expression while it is truthy.:range
-- loop over a range. The object should be a two-element tuple with a start and end value, and an optional positive step. The range is half open, [start, end).:range-to
-- same as :range, but the range is inclusive [start, end].:down
-- loop over a range, stepping downwards. The object should be a two-element tuple with a start and (exclusive) end value, and an optional (positive!) step size.:down-to
-- same as :down, but the range is inclusive [start, end].:keys
-- iterate over the keys in a data structure.:pairs
-- iterate over the key-value pairs as tuples in a data structure.:in
-- iterate over the values in a data structure or fiber.
loop
also accepts conditionals to refine the looping further. Conditionals are of the form:
        :modifier argument
where :modifier
is one of a set of keywords, and argument
is keyword-dependent. :modifier
can be one of:
:while expression
-- breaks from the current loop ifexpression
is falsey.:until expression
-- breaks from the current loop ifexpression
is truthy.:let bindings
-- defines bindings inside the current loop as passed to thelet
macro.:before form
-- evaluates a form for a side effect before the next inner loop.:after form
-- same as:before
, but the side effect happens after the next inner loop.:repeat n
-- repeats the next inner loopn
times.:when condition
-- only evaluates the current loop body whencondition
is truthy.:unless condition
-- only evaluates the current loop body whencondition
is falsey.
The loop
macro always evaluates to nil.
# prints 0123456789 (not followed by newline)
(loop [x :range [0 10]]
(prin x)) # -> nil
# Cartesian product (nested loops)
# prints 00010203101112132021222330313233
# Same as (for x 0 4 (for y 0 4 (prin x y)))
(loop [x :range [0 4]
y :range [0 4]]
(prin x y)) # -> nil
# prints bytes of "hello, world" as numbers
(loop [character :in "hello, world"]
(print character)) # -> nil
# prints 1, 2, and 3, in an unspecified order
(loop [value :in {:a 1 :b 2 :c 3}]
(print value)) # -> nil
# prints 0 to 99 inclusive
(loop [x :in (range 100)]
(print x)) # -> nil
# Complex body
(loop [x :in (range 10)]
(print x)
(print (inc x))
(print (+ x 2))) # -> nil
# prints n, n+1, n+2 (for n = 0 through 9) each time through the loop
# 0
# 1
# 2
# ...
# 9
# 10
# 11
# Iterate over keys
(loop [k :keys {:a 1 :b 2 :c 3}]
(print k)) # -> nil
# print a, b, and c in an unspecified order
(loop [index :keys [:a :b :c :d]]
(print index)) # -> nil
# print 0, 1, 2, and 3 in order.
(defn print-pairs
[x]
(loop [[k v] :pairs x]
(printf "[%v]=%v" k v)))
(print-pairs [:a :b :c]) # -> nil
# prints
# [0]=:a
# [1]=:b
# [2]=:c
(print-pairs {:a 1 :b 2 :c 3}) # -> nil
# prints
# [:a]=1
# [:b]=2
# [:c]=3
# Some modifiers - allow early termination and conditional execution
# of the loop
(loop [x :range [0 100] :when (even? x)]
(print x)) # -> nil
# prints even numbers 0, 2, 4, ..., 98
(loop [x :range [1 100] :while (pos? (% x 7))]
(print x)) # -> nil
# prints 1, 2, 3, 4, 5, 6
# Consume fibers as generators
(def f
(fiber/new
(fn []
(for i 0 100
(yield i)))))
(loop [x :in f]
(print x)) # -> nil
# print 0, 1, 2, ... 99
# Modifiers in nested loops
(loop [x :range [0 10]
:after (print)
y :range [0 x]]
(prin y " ")) # -> nil
# prints
# 0
# 0 1
# 0 1 2
# 0 1 2 3
# 0 1 2 3 4
# 0 1 2 3 4 5
# 0 1 2 3 4 5 6
# 0 1 2 3 4 5 6 7
# 0 1 2 3 4 5 6 7 8
Community Examples(macex x &opt on-binding)
Expand macros completely. on-binding
is an optional callback for whenever a normal symbolic binding is
encountered. This allows macros to easily see all bindings used by their arguments by calling macex
on their
contents. The binding itself is also replaced by the value returned by on-binding
within the expanded macro.
(macex1 x &opt on-binding)
Expand macros in a form, but do not recursively expand macros. See macex
docs for info on on-binding
.
(maclintf level fmt & args)
When inside a macro, call this function to add a linter warning. Takes a fmt
argument like string/format
,
which is used to format the message.
(make-env &opt parent)
Create a new environment table. The new environment will inherit bindings from the parent environment, but new bindings will not pollute the parent environment.
(make-image env)
Create an image from an environment returned by require
. Returns the image source as a string.
A table used in combination with marshal
to marshal code (images), such that (make-image x)
is the same as
(marshal x make-image-dict)
.
(map f ind & inds)
Map a function over every value in a data structure and return an array of the results.
# inc is applied to every value of the input data structure
(map inc [7 8 9]) # -> @[8 9 10]
# multiple data structures can be handled
(map array [:x :y] [-1 1]) # -> @[@[:x -1] @[:y 1]]
# result array has length of the shortest input data structure
(map |(pos? (+ ;$&)) [1 2 3] [-1 -2 -3] [0 1]) # -> @[false true]
Community Examples(mapcat f ind & inds)
Map a function over every element in an array or tuple and use array/concat
to concatenate the results.
(marshal x &opt reverse-lookup buffer no-cycles)
Marshal a value into a buffer and return the buffer. The buffer can then later be unmarshalled to reconstruct the initial value. Optionally, one can pass in a reverse lookup table to not marshal aliased values that are found in the table. Then a forward lookup table can be used to recover the original value when unmarshalling.
(match x & cases)
Pattern matching. Match an expression x
against any number of cases. Each case is a pattern to match against,
followed by an expression to evaluate to if that case is matched. Legal patterns are:
symbol -- a pattern that is a symbol will match anything, binding
x
's value to that symbol.array or bracket tuple -- an array or bracket tuple will match only if all of its elements match the corresponding elements in
x
. Use& rest
at the end of an array or bracketed tuple to bind all remaining values torest
.table or struct -- a table or struct will match if all values match with the corresponding values in
x
.tuple -- a tuple pattern will match if its first element matches, and the following elements are treated as predicates and are true.
_
symbol -- the last special case is the_
symbol, which is a wildcard that will match any value without creating a binding.
While a symbol pattern will ordinarily match any value, the pattern (@ <sym>)
, where <sym> is any symbol,
will attempt to match x
against a value already bound to <sym>
, rather than matching and rebinding it.
Any other value pattern will only match if it is equal to x
. Quoting a pattern with '
will also treat the
value as a literal value to match against.
(math/atan2 y x)
Returns the arctangent of y/x. Works even when x is 0.
(math/atanh x)
Returns the hyperbolic arctangent of x.
(math/ceil x)
Returns the smallest integer value number that is not less than x.
(math/erfc x)
Returns the complementary error function of x.
(math/floor x)
Returns the largest integer value number that is not greater than x.
(math/frexp x)
Returns a tuple of (mantissa, exponent) from number.
(math/gcd x y)
Returns the greatest common divisor between x and y.
(math/hypot a b)
Returns c from the equation c^2 = a^2 + b^2.
The maximum contiguous integer representable by a double (-(2^53))
The minimum contiguous integer representable by a double (2^53)
The maximum contiguous integer representable by a 32 bit signed integer
The minimum contiguous integer representable by a 32 bit signed integer
(math/lcm x y)
Returns the least common multiple of x and y.
(math/ldexp m e)
Creates a new number from a mantissa and an exponent.
(math/log1p x)
Returns (log base e of x) + 1 more accurately than (+ (math/log x) 1)
(math/next x y)
Returns the next representable floating point value after x in the direction of y.
(math/random)
Returns a uniformly distributed random number between 0 and 1.
(math/rng &opt seed)
Creates a Pseudo-Random number generator, with an optional seed. The seed should be an unsigned 32 bit integer or a buffer. Do not use this for cryptography. Returns a core/rng abstract type.
(math/rng-buffer rng n &opt buf)
Get n random bytes and put them in a buffer. Creates a new buffer if no buffer is provided, otherwise appends to the given buffer. Returns the buffer.
(math/rng-int rng &opt max)
Extract a random integer in the range [0, max) for max > 0 from the RNG. If max is 0, return 0. If no max is given, the default is 2^31 - 1.
(math/rng-uniform rng)
Extract a random number in the range [0, 1) from the RNG.
(math/seedrandom seed)
Set the seed for the random number generator. seed
should be an integer or a buffer.
(math/trunc x)
Returns the integer between x and 0 nearest to x.
(max-of args)
Returns the numeric maximum of the argument sequence.
(memcmp a b &opt len offset-a offset-b)
Compare memory. Takes two byte sequences a
and b
, and return 0 if they have identical contents, a negative
integer if a is less than b, and a positive integer if a is greater than b. Optionally take a length and
offsets to compare slices of the bytes sequences.
(merge & colls)
Merges multiple tables/structs into one new table. If a key appears in more than one collection in colls
,
then later values replace any previous ones. Returns the new table.
(merge-into tab & colls)
Merges multiple tables/structs into table tab
. If a key appears in more than one collection in colls
, then
later values replace any previous ones. Returns tab
.
(merge-module target source &opt prefix export only)
Merge a module source into the target
environment with a prefix
, as with the import
macro. This lets
users emulate the behavior of import
with a custom module table. If export
is truthy, then merged functions
are not marked as private. Returns the modified target environment. If a tuple or array only
is passed, only
merge keys in only
.
(min-of args)
Returns the numeric minimum of the argument sequence.
(mod & xs)
Returns the result of applying the modulo operator on the first value of xs with each remaining value. (mod x
0)
is defined to be x
.
(module/add-paths ext loader)
Add paths to module/paths
for a given loader such that the generated paths behave like other module types,
including relative imports and syspath imports. ext
is the file extension to associate with this module type,
including the dot. loader
is the keyword name of a loader in module/loaders
. Returns the modified
module/paths
.
A table, mapping loaded module identifiers to their environments.
(module/expand-path path template)
Expands a path template as found in module/paths
for module/find
. This takes in a path (the argument to
require) and a template string, to expand the path to a path that can be used for importing files. The
replacements are as follows:
:all: -- the value of path verbatim.
:@all: -- Same as :all:, but if
path
starts with the @ character, the first path segment is replaced with a dynamic binding(dyn <first path segment as keyword>)
.:cur: -- the directory portion, if any, of (dyn :current-file)
:dir: -- the directory portion, if any, of the path argument
:name: -- the name component of path, with extension if given
:native: -- the extension used to load natives, .so or .dll
:sys: -- the system path, or (dyn :syspath)
(module/find path)
Try to match a module or path name from the patterns in module/paths
. Returns a tuple (fullpath kind) where
the kind is one of :source, :native, or :image if the module is found, otherwise a tuple with nil followed by
an error message.
A table of loading method names to loading functions. This table lets require
and import
load many
different kinds of files as modules.
A table, mapping currently loading modules to true. Used to prevent circular dependencies.
The list of paths to look for modules, templated for module/expand-path
. Each element is a two-element tuple,
containing the path template and a keyword :source, :native, or :image indicating how require
should load
files found at these paths.
A tuple can also contain a third element, specifying a filter that prevents module/find
from searching that
path template if the filter doesn't match the input path. The filter can be a string or a predicate function,
and is often a file extension, including the period.
(module/value module sym &opt private)
Given a module table, get the value bound to a symbol sym
. If private
is truthy, will also resolve private
module symbols. If no binding is found, will return nil.
(nat? x)
Check if x can be exactly represented as a non-negative 32 bit signed two's complement integer.
(native path &opt env)
Load a native module from the given path. The path must be an absolute or relative path on the file system, and is usually a .so file on Unix systems, and a .dll file on Windows. Returns an environment table that contains functions and other values from the native module.
(net/accept stream &opt timeout)
Get the next connection on a server stream. This would usually be called in a loop in a dedicated fiber. Takes an optional timeout in seconds, after which will raise an error. Returns a new duplex stream which represents a connection to the client.
(net/accept-loop stream handler)
Shorthand for running a server stream that will continuously accept new connections. Blocks the current fiber until the stream is closed, and will return the stream.
(net/address host port &opt type multi)
Look up the connection information for a given hostname, port, and connection type. Returns a handle that can
be used to send datagrams over network without establishing a connection. On Posix platforms, you can use :unix
for host to connect to a unix domain socket, where the name is given in the port argument. On Linux, abstract
unix domain sockets are specified with a leading '@' character in port. If multi
is truthy, will return all
address that match in an array instead of just the first.
(net/address-unpack address)
Given an address returned by net/address, return a host, port pair. Unix domain sockets will have only the path in the returned tuple.
(net/chunk stream nbytes &opt buf timeout)
Same a net/read, but will wait for all n bytes to arrive rather than return early. Takes an optional timeout in seconds, after which will raise an error.
(net/connect host port &opt type bindhost bindport)
Open a connection to communicate with a server. Returns a duplex stream that can be used to communicate with the server. Type is an optional keyword to specify a connection type, either :stream or :datagram. The default is :stream. Bindhost is an optional string to select from what address to make the outgoing connection, with the default being the same as using the OS's preferred address.
(net/flush stream)
Make sure that a stream is not buffering any data. This temporarily disables Nagle's algorithm. Use this to make sure data is sent without delay. Returns stream.
(net/listen host port &opt type no-reuse)
Creates a server. Returns a new stream that is neither readable nor writeable. Use net/accept or
net/accept-loop be to handle connections and start the server. The type parameter specifies the type of network
connection, either a :stream (usually tcp), or :datagram (usually udp). If not specified, the default is
:stream. The host and port arguments are the same as in net/address. The last boolean parameter no-reuse
will
disable the use of SO_REUSEADDR and SO_REUSEPORT when creating a server on some operating systems.
(net/localname stream)
Gets the local address and port in a tuple in that order.
(net/peername stream)
Gets the remote peer's address and port in a tuple in that order.
(net/read stream nbytes &opt buf timeout)
Read up to n bytes from a stream, suspending the current fiber until the bytes are available. n
can also be
the keyword :all
to read into the buffer until end of stream. If less than n bytes are available (and more
than 0), will push those bytes and return early. Takes an optional timeout in seconds, after which will raise
an error. Returns a buffer with up to n more bytes in it, or raises an error if the read failed.
(net/recv-from stream nbytes buf &opt timeout)
Receives data from a server stream and puts it into a buffer. Returns the socket-address the packet came from. Takes an optional timeout in seconds, after which will raise an error.
(net/send-to stream dest data &opt timeout)
Writes a datagram to a server stream. dest is a the destination address of the packet. Takes an optional timeout in seconds, after which will raise an error. Returns stream.
(net/server host port &opt handler type no-reuse)
Start a server asynchronously with net/listen
and net/accept-loop
. Returns the new server stream.
(net/setsockopt stream option value)
set socket options.
supported options and associated value types:
- :so-broadcast boolean
- :so-reuseaddr boolean
- :so-keepalive boolean
- :ip-multicast-ttl number
- :ip-add-membership string
- :ip-drop-membership string
- :ipv6-join-group string
- :ipv6-leave-group string
(net/shutdown stream &opt mode)
Stop communication on this socket in a graceful manner, either in both directions or just reading/writing from
the stream. The mode
parameter controls which communication to stop on the socket.
-
:wr
is the default and prevents both reading new data from the socket and writing new data to the socket. -
:r
disables reading new data from the socket. -
:w
disable writing data to the socket.
Returns the original socket.
(net/write stream data &opt timeout)
Write data to a stream, suspending the current fiber until the write completes. Takes an optional timeout in seconds, after which will raise an error. Returns nil, or raises an error if the write failed.
(next ds &opt key)
Gets the next key in a data structure. Can be used to iterate through the keys of a data structure in an unspecified order. Keys are guaranteed to be seen only once per iteration if the data structure is not mutated during iteration. If key is nil, next returns the first key. If next returns nil, there are no more keys to iterate through.
(not= & xs)
Check if any values in xs are not equal. Returns a boolean.
(or & forms)
Evaluates to the last argument if all preceding elements are falsey, otherwise evaluates to the first truthy element.
(os/arch)
Check the ISA that janet was compiled for. Returns one of:
:x86
:x64
:arm
:aarch64
:riscv32
:riscv64
:sparc
:wasm
:s390
:s390x
:unknown
(os/cd path)
Change current directory to path. Returns nil on success, errors on failure.
(os/chmod path mode)
Change file permissions, where mode
is a permission string as returned by os/perm-string
, or an integer as
returned by os/perm-int
. When mode
is an integer, it is interpreted as a Unix permission value, best
specified in octal, like 8r666 or 8r400. Windows will not differentiate between user, group, and other
permissions, and thus will combine all of these permissions. Returns nil.
(os/clock &opt source format)
Return the current time of the requested clock source.
The source
argument selects the clock source to use, when not specified the default is :realtime
:
- :realtime: Return the real (i.e., wall-clock) time. This clock is affected by discontinuous jumps in the system time
- :monotonic: Return the number of whole + fractional seconds since some fixed point in time. The clock is guaranteed to be non-decreasing in real time.
- :cputime: Return the CPU time consumed by this process (i.e. all threads in the process)
The format
argument selects the type of output, when not specified the default is :double
:
- :double: Return the number of seconds + fractional seconds as a double
- :int: Return the number of seconds as an integer
- :tuple: Return a 2 integer tuple [seconds, nanoseconds]
(os/compiler)
Get the compiler used to compile the interpreter. Returns one of:
:gcc
:clang
:msvc
:unknown
(os/cpu-count &opt dflt)
Get an approximate number of CPUs available on for this process to use. If unable to get an approximation, will return a default value dflt.
(os/cryptorand n &opt buf)
Get or append n
bytes of good quality random data provided by the OS. Returns a new buffer or buf
.
(os/date &opt time local)
Returns the given time as a date struct, or the current time if time
is not given. Returns a struct with
following key values. Note that all numbers are 0-indexed. Date is given in UTC unless local
is truthy, in
which case the date is formatted for the local timezone.
:seconds - number of seconds [0-61]
:minutes - number of minutes [0-59]
:hours - number of hours [0-23]
:month-day - day of month [0-30]
:month - month of year [0, 11]
:year - years since year 0 (e.g. 2019)
:week-day - day of the week [0-6]
:year-day - day of the year [0-365]
:dst - if Day Light Savings is in effect
(os/dir dir &opt array)
Iterate over files and subdirectories in a directory. Returns an array of paths parts, with only the file name or directory name and no prefix.
(os/execute args &opt flags env)
Execute a program on the system and return the exit code. args
is an array/tuple of strings. The first string
is the name of the program and the remainder are arguments passed to the program. flags
is a keyword made
from the following characters that modifies how the program executes:
- :e - enables passing an environment to the program. Without 'e', the current environment is inherited.
- :p - allows searching the current PATH for the program to execute. Without this flag, the first element of
args
must be an absolute path. - :x - raises error if exit code is non-zero.
- :d - prevents the garbage collector terminating the program (if still running) and calling the equivalent of
os/proc-wait
(allows zombie processes).
env
is a table/struct mapping environment variables to values. It can also contain the keys :in, :out, and
:err, which allow redirecting stdio in the subprocess. :in, :out, and :err should be core/file or core/stream
values. If core/stream values are used, the caller is responsible for ensuring pipes do not cause the program
to block and deadlock.
(os/exit &opt x force)
Exit from janet with an exit code equal to x. If x is not an integer, the exit with status equal the hash of x.
If force
is truthy will exit immediately and skip cleanup code.
(os/getenv variable &opt dflt)
Get the string value of an environment variable.
(os/isatty &opt file)
Returns true if file
is a terminal. If file
is not specified, it will default to standard output.
(os/link oldpath newpath &opt symlink)
Create a link at newpath that points to oldpath and returns nil. Iff symlink is truthy, creates a symlink. Iff symlink is falsey or not provided, creates a hard link. Does not work on Windows.
(os/lstat path &opt tab|key)
Like os/stat, but don't follow symlinks.
(os/mkdir path)
Create a new directory. The path will be relative to the current directory if relative, otherwise it will be an absolute path. Returns true if the directory was created, false if the directory already exists, and errors otherwise.
(os/mktime date-struct &opt local)
Get the broken down date-struct time expressed as the number of seconds since January 1, 1970, the Unix epoch.
Returns a real number. Date is given in UTC unless local
is truthy, in which case the date is computed for
the local timezone.
Inverse function to os/date.
(os/open path &opt flags mode)
Create a stream from a file, like the POSIX open system call. Returns a new stream. mode
should be a file
mode as passed to os/chmod
, but only if the create flag is given. The default mode is 8r666. Allowed flags
are as follows:
- :r - open this file for reading
- :w - open this file for writing
- :c - create a new file (O_CREATE)
- :e - fail if the file exists (O_EXCL)
- :t - shorten an existing file to length 0 (O_TRUNC)
Posix-only flags:
- :a - append to a file (O_APPEND)
- :x - O_SYNC
- :C - O_NOCTTY
Windows-only flags:
- :R - share reads (FILE_SHARE_READ)
- :W - share writes (FILE_SHARE_WRITE)
- :D - share deletes (FILE_SHARE_DELETE)
- :H - FILE_ATTRIBUTE_HIDDEN
- :O - FILE_ATTRIBUTE_READONLY
- :F - FILE_ATTRIBUTE_OFFLINE
- :T - FILE_ATTRIBUTE_TEMPORARY
- :d - FILE_FLAG_DELETE_ON_CLOSE
- :b - FILE_FLAG_NO_BUFFERING
(os/perm-int bytes)
Parse a 9-character permission string and return an integer that can be used by chmod.
(os/perm-string int)
Convert a Unix octal permission value from a permission integer as returned by os/stat
to a human readable
string, that follows the formatting of Unix tools like ls
. Returns the string as a 9-character string of r,
w, x and - characters. Does not include the file/directory/symlink character as rendered by ls
.
(os/pipe &opt flags)
Create a readable stream and a writable stream that are connected. Returns a two-element tuple where the first
element is a readable stream and the second element is the writable stream. flags
is a keyword set of flags
to disable non-blocking settings on the ends of the pipe. This may be desired if passing the pipe to a
subprocess with os/spawn
.
- :W - sets the writable end of the pipe to a blocking stream.
- :R - sets the readable end of the pipe to a blocking stream.
By default, both ends of the pipe are non-blocking for use with the ev
module.
(os/posix-exec args &opt flags env)
Use the execvpe or execve system calls to replace the current process with an interface similar to os/execute. However, instead of creating a subprocess, the current process is replaced. Is not supported on Windows, and does not allow redirection of stdio.
(os/posix-fork)
Make a fork
system call and create a new process. Return nil if in the new process, otherwise a core/process
object (as returned by os/spawn). Not supported on all systems (POSIX only).
(os/proc-close proc)
Close pipes created for subprocess proc
by os/spawn
if they have not been closed. Then, if proc
is not
being waited for, wait. If this function waits, when proc
completes, return the exit code of proc
.
Otherwise, return nil.
(os/proc-kill proc &opt wait signal)
Kill the subprocess proc
by sending SIGKILL to it on POSIX systems, or by closing the process handle on
Windows. If proc
has already completed, raise an error. If wait
is truthy, will wait for proc
to complete
and return the exit code (this will raise an error if proc
is being waited for). Otherwise, return proc
. If
signal
is provided, send it instead of SIGKILL. Signal keywords are named after their C counterparts but in
lowercase with the leading SIG stripped. signal
is ignored on Windows.
(os/proc-wait proc)
Suspend the current fiber until the subprocess proc
completes. Once proc
completes, return the exit code of
proc
. If called more than once on the same core/process value, will raise an error. When creating
subprocesses using os/spawn
, this function should be called on the returned value to avoid zombie processes.
(os/readlink path)
Read the contents of a symbolic link. Does not work on Windows.
(os/realpath path)
Get the absolute path for a given path, following ../, ./, and symlinks. Returns an absolute path as a string.
(os/rename oldname newname)
Rename a file on disk to a new path. Returns nil.
(os/rmdir path)
Delete a directory. The directory must be empty to succeed.
(os/setenv variable value)
Set an environment variable.
(os/setlocale &opt locale category)
Set the system locale, which affects how dates and numbers are formatted. Passing nil to locale will return the current locale. Category can be one of:
- :all (default)
- :collate
- :ctype
- :monetary
- :numeric
- :time
Returns the new locale if set successfully, otherwise nil. Note that this will affect other functions such as
os/strftime
and even printf
.
(os/shell str)
Pass a command string str directly to the system shell.
(os/sigaction which &opt handler interrupt-interpreter)
Add a signal handler for a given action. Use nil for the handler
argument to remove a signal handler. All
signal handlers are the same as supported by os/proc-kill
.
(os/sleep n)
Suspend the program for n
seconds. n
can be a real number. Returns nil.
(os/spawn args &opt flags env)
Execute a program on the system and return a core/process value representing the spawned subprocess. Takes the
same arguments as os/execute
but does not wait for the subprocess to complete. Unlike os/execute
, the value
:pipe
can be used for :in, :out and :err keys in env
. If used, the returned core/process will have a
writable stream in the :in field and readable streams in the :out and :err fields. On non-Windows systems, the
subprocess PID will be in the :pid field. The caller is responsible for waiting on the process (e.g. by calling
os/proc-wait
on the returned core/process value) to avoid creating zombie process. After the subprocess
completes, the exit value is in the :return-code field. If flags
includes 'x', a non-zero exit code will
cause a waiting fiber to raise an error. The use of :pipe
may fail if there are too many active file
descriptors. The caller is responsible for closing pipes created by :pipe
(either individually or using
os/proc-close
). Similar to os/execute
, the caller is responsible for ensuring pipes do not cause the
program to block and deadlock.
(os/stat path &opt tab|key)
Gets information about a file or directory. Returns a table if the second argument is a keyword, returns only that information from stat. If the file or directory does not exist, returns nil. The keys are:
:dev - the device that the file is on
:mode - the type of file, one of :file, :directory, :block, :character, :fifo, :socket, :link, or :other
:int-permissions - A Unix permission integer like 8r744
:permissions - A Unix permission string like "rwxr--r--"
:uid - File uid
:gid - File gid
:nlink - number of links to file
:rdev - Real device of file. 0 on Windows
:size - size of file in bytes
:blocks - number of blocks in file. 0 on Windows
:blocksize - size of blocks in file. 0 on Windows
:accessed - timestamp when file last accessed
:changed - timestamp when file last changed (permissions changed)
:modified - timestamp when file last modified (content changed)
(os/strftime fmt &opt time local)
Format the given time as a string, or the current time if time
is not given. The time is formatted according
to the same rules as the ISO C89 function strftime(). The time is formatted in UTC unless local
is truthy, in
which case the date is formatted for the local timezone.
(os/symlink oldpath newpath)
Create a symlink from oldpath to newpath, returning nil. Same as (os/link oldpath newpath true)
.
(os/time)
Get the current time expressed as the number of whole seconds since January 1, 1970, the Unix epoch. Returns a real number.
(os/touch path &opt actime modtime)
Update the access time and modification times for a file. By default, sets times to the current time.
(os/which)
Check the current operating system. Returns one of:
:windows
:mingw
:cygwin
:macos
:web - Web assembly (emscripten)
:linux
:freebsd
:openbsd
:netbsd
:dragonfly
:bsd
:posix - A POSIX compatible system (default)
May also return a custom keyword specified at build time.
(pairs x)
Get the key-value pairs of an associative data structure.
(parse str)
Parse a string and return the first value. For complex parsing, such as for a repl with error handling, use the parser api.
(parse-all str)
Parse a string and return all parsed values. For complex parsing, such as for a repl with error handling, use the parser api.
(parser/byte parser b)
Input a single byte b
into the parser byte stream. Returns the parser.
(parser/clone p)
Creates a deep clone of a parser that is identical to the input parser. This cloned parser can be used to continue parsing from a good checkpoint if parsing later fails. Returns a new parser.
(parser/consume parser bytes &opt index)
Input bytes into the parser and parse them. Will not throw errors if there is a parse error. Starts at the byte
index given by index
. Returns the number of bytes read.
(parser/eof parser)
Indicate to the parser that the end of file was reached. This puts the parser in the :dead state.
(parser/error parser)
If the parser is in the error state, returns the message associated with that error. Otherwise, returns nil.
Also flushes the parser state and parser queue, so be sure to handle everything in the queue before calling
parser/error
.
(parser/flush parser)
Clears the parser state and parse queue. Can be used to reset the parser if an error was encountered. Does not reset the line and column counter, so to begin parsing in a new context, create a new parser.
(parser/has-more parser)
Check if the parser has more values in the value queue.
(parser/insert parser value)
Insert a value into the parser. This means that the parser state can be manipulated in between chunks of bytes. This would allow a user to add extra elements to arrays and tuples, for example. Returns the parser.
(parser/new)
Creates and returns a new parser object. Parsers are state machines that can receive bytes and generate a stream of values.
(parser/produce parser &opt wrap)
Dequeue the next value in the parse queue. Will return nil if no parsed values are in the queue, otherwise will
dequeue the next value. If wrap
is truthy, will return a 1-element tuple that wraps the result. This tuple
can be used for source-mapping purposes.
(parser/state parser &opt key)
Returns a representation of the internal state of the parser. If a key is passed, only that information about the state is returned. Allowed keys are:
:delimiters - Each byte in the string represents a nested data structure. For example, if the parser state is '(["', then the parser is in the middle of parsing a string inside of square brackets inside parentheses. Can be used to augment a REPL prompt.
:frames - Each table in the array represents a 'frame' in the parser state. Frames contain information about the start of the expression being parsed as well as the type of that expression and some type-specific information.
(parser/status parser)
Gets the current status of the parser state machine. The status will be one of:
:pending - a value is being parsed.
:error - a parsing error was encountered.
:root - the parser can either read more values or safely terminate.
(parser/where parser &opt line col)
Returns the current line number and column of the parser's internal state. If line is provided, the current line number of the parser is first set to that value. If column is also provided, the current column number of the parser is also first set to that value.
(partition n ind)
Partition an indexed data structure ind
into tuples of size n
. Returns a new array.
(partition-by f ind)
Partition elements of a sequential data structure by a representative function f
. Partitions split when (f
x)
changes values when iterating to the next element x
of ind
. Returns a new array of arrays.
(peg/compile peg)
Compiles a peg source data structure into a <core/peg>. This will speed up matching if the same peg will be
used multiple times. Will also use (dyn :peg-grammar)
to supplement the grammar of the peg for otherwise
undefined peg keywords.
(peg/find peg text &opt start & args)
Find first index where the peg matches in text. Returns an integer, or nil if not found.
(peg/find-all peg text &opt start & args)
Find all indexes where the peg matches in text. Returns an array of integers.
(peg/match peg text &opt start & args)
Match a Parsing Expression Grammar to a byte string and return an array of captured values. Returns nil if text does not match the language defined by peg. The syntax of PEGs is documented on the Janet website.
(peg/replace peg subst text &opt start & args)
Replace first match of peg
in text
with subst
, returning a new buffer. The peg does not need to make
captures to do replacement. If subst
is a function, it will be called with the matching text followed by any
captures. If no matches are found, returns the input string in a new buffer.
(peg/replace-all peg subst text &opt start & args)
Replace all matches of peg
in text
with subst
, returning a new buffer. The peg does not need to make
captures to do replacement. If subst
is a function, it will be called with the matching text followed by any
captures.
(postwalk f form)
Do a post-order traversal of a data structure and call (f x)
on every visitation.
(pp x)
Pretty-print to stdout or (dyn *out*)
. The format string used is (dyn *pretty-format* "%q")
.
(prewalk f form)
Similar to postwalk
, but do pre-order traversal.
(prin & xs)
Same as print
, but does not add trailing newline.
(print & xs)
Print values to the console (standard out). Value are converted to strings if they are not already. After
printing all values, a newline character is printed. Use the value of (dyn :out stdout)
to determine what to
push characters to. Expects (dyn :out stdout)
to be either a core/file or a buffer. Returns nil.
(printf fmt & xs)
Prints output formatted as if with (string/format fmt ;xs)
to (dyn :out stdout)
with a trailing newline.
(product xs)
Returns the product of xs. If xs is empty, returns 1.
(product []) # -> 1
(product @[1 2 3]) # -> 6
(product [0 1 2 3]) # -> 0
(product (range 1 10)) # -> 362880
# Product over byte values [0-255] in a string
(product "hello") # -> 13599570816
# Product over values in a table or struct
(product {:a 1 :b 2 :c 4}) # -> 8
Community Examples(prompt tag & body)
Set up a checkpoint that can be returned to. tag
should be a value that is used in a return
statement, like
a keyword.
(propagate x fiber)
Propagate a signal from a fiber to the current fiber and set the last value of the current fiber to x
. The
signal value is then available as the status of the current fiber. The resulting stack trace from the current
fiber will include frames from fiber. If fiber is in a state that can be resumed, resuming the current fiber
will first resume fiber
. This function can be used to re-raise an error without losing the original stack
trace.
(protect & body)
Evaluate expressions, while capturing any errors. Evaluates to a tuple of two elements. The first element is true if successful, false if an error, and the second is the return value or error.
(put ds key value)
Associate a key with a value in any mutable associative data structure. Indexed data structures (arrays and buffers) only accept non-negative integer keys, and will expand if an out of bounds value is provided. In an array, extra space will be filled with nils, and in a buffer, extra space will be filled with 0 bytes. In a table, putting a key that is contained in the table prototype will hide the association defined by the prototype, but will not mutate the prototype table. Putting a value nil into a table will remove the key from the table. Returns the data structure ds.
(put-in ds ks v)
Put a value into a nested data structure ds
. Looks into ds
via a sequence of keys. Missing data structures
will be replaced with tables. Returns the modified, original data structure.
(quit &opt value)
Tries to exit from the current repl or run-context. Does not always exit the application. Works by setting the
:exit dynamic binding to true. Passing a non-nil value
here will cause the outer run-context to return that
value.
(range & args)
Create an array of values [start, end) with a given step. With one argument, returns a range [0, end). With two arguments, returns a range [start, end). With three, returns a range with optional step size.
(range 10) # -> @[0 1 2 3 4 5 6 7 8 9]
(range 5 10) # -> @[5 6 7 8 9]
(range 5 10 2) # -> @[5 7 9]
(range 5 11 2) # -> @[5 7 9]
(range 10 0 -1) # -> @[10 9 8 7 6 5 4 3 2 1]
Community Examples(reduce f init ind)
Reduce, also know as fold-left in many languages, transforms an indexed type (array, tuple) with a function to
produce a value by applying f
to each element in order. f
is a function of 2 arguments, (f accum el)
,
where accum
is the initial value and el
is the next value in the indexed type ind
. f
returns a value
that will be used as accum
in the next call to f
. reduce
returns the value of the final call to f
.
(reduce2 f ind)
The 2-argument version of reduce
that does not take an initialization value. Instead, the first element of
the array is used for initialization. If ind
is empty, will evaluate to nil.
(repeat n & body)
Evaluate body n times. If n is negative, body will be evaluated 0 times. Evaluates to nil.
(repl &opt chunks onsignal env parser read)
Run a repl. The first parameter is an optional function to call to get a chunk of source code that should
return nil for end of file. The second parameter is a function that is called when a signal is caught. One can
provide an optional environment table to run the repl in, as well as an optional parser or read function to
pass to run-context
.
(require path & args)
Require a module with the given name. Will search all of the paths in module/paths
. Returns the new
environment returned from compiling and running the file.
(resume fiber &opt x)
Resume a new or suspended fiber and optionally pass in a value to the fiber that will be returned to the last yield in the case of a pending fiber, or the argument to the dispatch function in the case of a new fiber. Returns either the return result of the fiber's dispatch function, or the value from the next yield call in fiber.
(reverse t)
Reverses the order of the elements in a given array or tuple and returns a new array. If a string or buffer is provided, returns a buffer instead.
(reverse [1 2 3]) # -> @[3 2 1]
(reverse "abcdef") # -> @"fedcba"
Community Examples(reverse! t)
Reverses the order of the elements in a given array or buffer and returns it mutated.
(run-context opts)
Run a context. This evaluates expressions in an environment, and encapsulates the parsing, compilation, and
evaluation. Returns (in environment :exit-value environment)
when complete. opts
is a table or struct of
options. The options are as follows:
:chunks
-- callback to read into a buffer - default is getline:on-parse-error
-- callback when parsing fails - default is bad-parse:env
-- the environment to compile against - default is the current env:source
-- source path for better errors (use keywords for non-paths) - default is :<anonymous>:on-compile-error
-- callback when compilation fails - default is bad-compile:on-compile-warning
-- callback for any linting error - default is warn-compile:evaluator
-- callback that executes thunks. Signature is (evaluator thunk source env where):on-status
-- callback when a value is evaluated - default is debug/stacktrace.:fiber-flags
-- what flags to wrap the compilation fiber with. Default is :ia.:expander
-- an optional function that is called on each top level form before being compiled.:parser
-- provide a custom parser that implements the same interface as Janet's built-in parser.:read
-- optional function to get the next form, called like(read env source)
. Overrides all parsing.
(sandbox & forbidden-capabilities)
Disable feature sets to prevent the interpreter from using certain system resources. Once a feature is disabled, there is no way to re-enable it. Capabilities can be:
- :all - disallow all (except IO to stdout, stderr, and stdin)
- :env - disallow reading and write env variables
- :ffi - disallow FFI (recommended if disabling anything else)
- :ffi-define - disallow loading new FFI modules and binding new functions
- :ffi-jit - disallow calling
ffi/jitfn
- :ffi-use - disallow using any previously bound FFI functions and memory-unsafe functions.
- :fs - disallow access to the file system
- :fs-read - disallow read access to the file system
- :fs-temp - disallow creating temporary files
- :fs-write - disallow write access to the file system
- :hrtime - disallow high-resolution timers
- :modules - disallow load dynamic modules (natives)
- :net - disallow network access
- :net-connect - disallow making outbound network connections
- :net-listen - disallow accepting inbound network connections
- :sandbox - disallow calling this function
- :signal - disallow adding or removing signal handlers
- :subprocess - disallow running subprocesses
(scan-number str &opt base)
Parse a number from a byte sequence and return that number, either an integer or a real. The number must be in the same format as numbers in janet source code. Will return nil on an invalid number. Optionally provide a base - if a base is provided, no radix specifier is expected at the beginning of the number.
(seq head & body)
Similar to loop
, but accumulates the loop body into an array and returns that. See loop
for details.
(seq [x :range [0 5]] (* 2 x)) # -> @[0 2 4 6 8]
Community Examples(short-fn arg &opt name)
Shorthand for fn
. Arguments are given as $n
, where n
is the 0-indexed argument of the function. $
is
also an alias for the first (index 0) argument. The $&
symbol will make the anonymous function variadic if it
appears in the body of the function, and can be combined with positional arguments.
# a function that doubles its arguments
((fn [n] (+ n n)) 10) # -> 20
((short-fn (+ $ $)) 10) # -> 20
# pipe reader macro offers terser expression
(|(+ $ $) 10) # -> 20
# $0 is also the first (zero-th) argument
(|(+ $0 $0) 10) # -> 20
# handling multiple arguments: $0, $1, ...
(|(string $0 $1) "hi" "ho") # -> "hiho"
# variadic function
(|(apply + $&) 1 2 3) # -> 6
# structs and some other things work too
(|{:a 1}) # -> {:a 1}
Community Examples(signal what x)
Raise a signal with payload x. what
can be an integer from 0 through 7 indicating user(0-7), or one of:
- :ok
- :error
- :debug
- :yield
- :user(0-7)
- :interrupt
- :await
(slice x &opt start end)
Extract a sub-range of an indexed data structure or byte sequence.
(slice @[1 2 3]) # -> (1 2 3)
(slice @[:a :b :c] 1) # -> (:b :c)
(slice [:a :b :c :d :e] 2 4) # -> (:c :d)
(slice [:a :b :c :d :e] 2 -1) # -> (:c :d :e)
(slice [:a :b :c :d :e] 2 -2) # -> (:c :d)
(slice [:a :b :c :d :e] 2 -4) # -> ()
(slice [:a :b :c :d :e] 2 -10) # -> error: end index -10 out of range [-6,5]
(slice "abcdefg" 0 2) # -> "ab"
(slice @"abcdefg" 0 2) # -> "ab"
Community Examples(slurp path)
Read all data from a file with name path
and then close the file.
(some pred ind & inds)
Returns nil if (pred item)
is false or nil for every item in ind
. Otherwise, returns the first truthy
result encountered.
(sort ind &opt before?)
Sorts ind
in-place, and returns it. Uses quick-sort and is not a stable sort. If a before?
comparator
function is provided, sorts elements using that, otherwise uses <
.
(sort-by f ind)
Sorts ind
in-place by calling a function f
on each element and comparing the result with <
.
(sorted ind &opt before?)
Returns a new sorted array without modifying the old one. If a before?
comparator function is provided, sorts
elements using that, otherwise uses <
.
(sorted-by f ind)
Returns a new sorted array that compares elements by invoking a function f
on each element and comparing the
result with <
.
(spit path contents &opt mode)
Write contents
to a file at path
. Can optionally append to the file.
(string & xs)
Creates a string by concatenating the elements of xs
together. If an element is not a byte sequence, it is
converted to bytes via describe
. Returns the new string.
(string/ascii-lower str)
Returns a new string where all bytes are replaced with the lowercase version of themselves in ASCII. Does only a very simple case check, meaning no unicode support.
(string/ascii-upper str)
Returns a new string where all bytes are replaced with the uppercase version of themselves in ASCII. Does only a very simple case check, meaning no unicode support.
(string/bytes str)
Returns a tuple of integers that are the byte values of the string.
(string/check-set set str)
Checks that the string str
only contains bytes that appear in the string set
. Returns true if all bytes in
str
appear in set
, false if some bytes in str
do not appear in set
.
(string/find patt str &opt start-index)
Searches for the first instance of pattern patt
in string str
. Returns the index of the first character in
patt
if found, otherwise returns nil.
(string/find-all patt str &opt start-index)
Searches for all instances of pattern patt
in string str
. Returns an array of all indices of found
patterns. Overlapping instances of the pattern are counted individually, meaning a byte in str
may contribute
to multiple found patterns.
(string/format format & values)
Similar to C's snprintf
, but specialized for operating with Janet values. Returns a new string.
The following conversion specifiers are supported, where the upper case specifiers generate upper case output:
-
c
: ASCII character. -
d
,i
: integer, formatted as a decimal number. -
x
,X
: integer, formatted as a hexadecimal number. -
o
: integer, formatted as an octal number. -
f
,F
: floating point number, formatted as a decimal number. -
e
,E
: floating point number, formatted in scientific notation. -
g
,G
: floating point number, formatted in its shortest form. -
a
,A
: floating point number, formatted as a hexadecimal number. -
s
: formatted as a string, precision indicates padding and maximum length. -
t
: emit the type of the given value. -
v
: format with (describe x) -
V
: format with (string x) -
j
: format to jdn (Janet data notation).
The following conversion specifiers are used for "pretty-printing", where the upper-case variants generate colored output. These specifiers can take a precision argument to specify the maximum nesting depth to print.
-
p
,P
: pretty format, truncating if necessary -
m
,M
: pretty format without truncating. -
q
,Q
: pretty format on one line, truncating if necessary. -
n
,N
: pretty format on one line without truncation.
(string/from-bytes & byte-vals)
Creates a string from integer parameters with byte values. All integers will be coerced to the range of 1 byte 0-255.
(string/has-prefix? pfx str)
Tests whether str
starts with pfx
.
(string/has-suffix? sfx str)
Tests whether str
ends with sfx
.
(string/join parts &opt sep)
Joins an array of strings into one string, optionally separated by a separator string sep
.
(string/repeat bytes n)
Returns a string that is n
copies of bytes
concatenated.
(string/replace patt subst str)
Replace the first occurrence of patt
with subst
in the string str
. If subst
is a function, it will be
called with patt
only if a match is found, and should return the actual replacement text to use. Will return
the new string if patt
is found, otherwise returns str
.
(string/replace-all patt subst str)
Replace all instances of patt
with subst
in the string str
. Overlapping matches will not be counted, only
the first match in such a span will be replaced. If subst
is a function, it will be called with patt
once
for each match, and should return the actual replacement text to use. Will return the new string if patt
is
found, otherwise returns str
.
(string/reverse str)
Returns a string that is the reversed version of str
.
(string/slice bytes &opt start end)
Returns a substring from a byte sequence. The substring is from index start
inclusive to index end
,
exclusive. All indexing is from 0. start
and end
can also be negative to indicate indexing from the end of
the string. Note that if start
is negative it is exclusive, and if end
is negative it is inclusive, to
allow a full negative slice range.
(string/split delim str &opt start limit)
Splits a string str
with delimiter delim
and returns an array of substrings. The substrings will not
contain the delimiter delim
. If delim
is not found, the returned array will have one element. Will start
searching for delim
at the index start
(if provided), and return up to a maximum of limit
results (if
provided).
# substrings split by delimiter
(string/split "," "x,y,z") # -> @["x" "y" "z"]
# delimiter not found so result has one element
(string/split "!" "1 2 3") # -> @["1 2 3"]
# start searching part-way through
(string/split "," "a,e,i,o" 3) # -> @["a,e" "i" "o"]
# limit number of results
(string/split ";" "a;b;c;d;e" 0 3) # -> @["a" "b" "c;d;e"]
# delimiter should be non-empty
(string/split "" "word") # -> error: expected non-empty pattern
Community Examples(string/trim str &opt set)
Trim leading and trailing whitespace from a byte sequence. If the argument set
is provided, consider only
characters in set
to be whitespace.
# trim leading and trailing whitespace
(string/trim " foo ") # -> "foo"
# default whitespace includes " \t\r\n\v\f"
(string/trim "\t bar\n\r\f") # -> "bar"
# provide custom set of characters to trim
(string/trim "_.foo_bar. \n" " ._\n") # -> "foo_bar"
Community Examples(string/triml str &opt set)
Trim leading whitespace from a byte sequence. If the argument set
is provided, consider only characters in
set
to be whitespace.
# trim leading/left side whitespace
(string/triml " foo ") # -> "foo "
# default whitespace includes " \t\r\n\v\f"
(string/triml "\t bar\n\r\f") # -> "bar\n\r\f"
# provide custom set of characters to triml
(string/triml "_.foo_bar. \n" " ._\n") # -> "foo_bar. \n"
Community Examples(string/trimr str &opt set)
Trim trailing whitespace from a byte sequence. If the argument set
is provided, consider only characters in
set
to be whitespace.
# trim trailing/right side whitespace
(string/trimr " foo ") # -> " foo"
# default whitespace includes " \t\r\n\v\f"
(string/trimr "\t bar\n\r\f") # -> "\t bar"
# provide custom set of characters to trimr
(string/trimr "_.foo_bar. \n" " ._\n") # -> "_.foo_bar"
Community Examples(struct & kvs)
Create a new struct from a sequence of key value pairs. kvs is a sequence k1, v1, k2, v2, k3, v3, ... If kvs has an odd number of elements, an error will be thrown. Returns the new struct.
(struct/getproto st)
Return the prototype of a struct, or nil if it doesn't have one.
(struct/proto-flatten st)
Convert a struct with prototypes to a struct with no prototypes by merging all key value pairs from recursive prototypes into one new struct.
(struct/rawget st key)
Gets a value from a struct st
without looking at the prototype struct. If st
does not contain the key
directly, the function will return nil without checking the prototype. Returns the value in the struct.
(struct/to-table st &opt recursive)
Convert a struct to a table. If recursive is true, also convert the table's prototypes into the new struct's prototypes as well.
(struct/with-proto proto & kvs)
Create a structure, as with the usual struct constructor but set the struct prototype as well.
(sum xs)
Returns the sum of xs. If xs is empty, returns 0.
(sum []) # -> 0
(sum @[1]) # -> 1
(sum (range 100)) # -> 4950
# Sum over bytes values [0-255] in a string
(sum "hello") # -> 532
# Sum over values in a table or struct
(sum {:a 1 :b 2 :c 4}) # -> 7
Community Examples(symbol & xs)
Creates a symbol by concatenating the elements of xs
together. If an element is not a byte sequence, it is
converted to bytes via describe
. Returns the new symbol.
(symbol/slice bytes &opt start end)
Same as string/slice, but returns a symbol.
(table & kvs)
Creates a new table from a variadic number of keys and values. kvs is a sequence k1, v1, k2, v2, k3, v3, ... If kvs has an odd number of elements, an error will be thrown. Returns the new table.
(table/clear tab)
Remove all key-value pairs in a table and return the modified table tab
.
(table/clone tab)
Create a copy of a table. Updates to the new table will not change the old table, and vice versa.
(table/getproto tab)
Get the prototype table of a table. Returns nil if the table has no prototype, otherwise returns the prototype.
(table/new capacity)
Creates a new empty table with pre-allocated memory for capacity
entries. This means that if one knows the
number of entries going into a table on creation, extra memory allocation can be avoided. Returns the new
table.
(table/proto-flatten tab)
Create a new table that is the result of merging all prototypes into a new table.
(table/rawget tab key)
Gets a value from a table tab
without looking at the prototype table. If tab
does not contain the key
directly, the function will return nil without checking the prototype. Returns the value in the table.
(table/setproto tab proto)
Set the prototype of a table. Returns the original table tab
.
(table/to-struct tab &opt proto)
Convert a table to a struct. Returns a new struct.
(table/weak capacity)
Creates a new empty table with weak references to keys and values. Similar to table/new
. Returns the new
table.
(table/weak-keys capacity)
Creates a new empty table with weak references to keys and normal references to values. Similar to table/new
.
Returns the new table.
(table/weak-values capacity)
Creates a new empty table with normal references to keys and weak references to values. Similar to table/new
.
Returns the new table.
(tabseq head key-body & value-body)
Similar to loop
, but accumulates key value pairs into a table. See loop
for details.
(take n ind)
Take the first n elements of a fiber, indexed or bytes type. Returns a new array, tuple or string,
respectively. If n
is negative, takes the last n
elements instead.
(take-until pred ind)
Same as (take-while (complement pred) ind)
.
(take-while pred ind)
Given a predicate, take only elements from a fiber, indexed, or bytes type that satisfy the predicate, and abort on first failure. Returns a new array, tuple, or string, respectively.
(thaw ds)
Thaw an object (make it mutable) and do a deep copy, making child value also mutable. Closures, fibers, and abstract types will not be recursively thawed, but all other types will
(toggle value)
Set a value to its boolean inverse. Same as (set value (not value))
.
(trace func)
Enable tracing on a function. Returns the function.
(tracev x)
Print to stderr a value and a description of the form that produced that value. Evaluates to x.
(try body catch)
Try something and catch errors. body
is any expression, and catch
should be a form, the first element of
which is a tuple. This tuple should contain a binding for errors and an optional binding for the fiber wrapping
the body. Returns the result of body
if no error, or the result of catch
if an error.
(tuple & items)
Creates a new tuple that contains items. Returns the new tuple.
(tuple/brackets & xs)
Creates a new bracketed tuple containing the elements xs.
(tuple/join & parts)
Create a tuple by joining together other tuples and arrays.
(tuple/setmap tup line column)
Set the sourcemap metadata on a tuple. line and column indicate should be integers.
(tuple/slice arrtup [,start=0 [,end=(length arrtup)]])
Take a sub-sequence of an array or tuple from index start
inclusive to index end
exclusive. If start
or
end
are not provided, they default to 0 and the length of arrtup
, respectively. start
and end
can also
be negative to indicate indexing from the end of the input. Note that if start
is negative it is exclusive,
and if end
is negative it is inclusive, to allow a full negative slice range. Returns the new tuple.
(tuple/sourcemap tup)
Returns the sourcemap metadata attached to a tuple, which is another tuple (line, column).
(tuple/type tup)
Checks how the tuple was constructed. Will return the keyword :brackets if the tuple was parsed with brackets, and :parens otherwise. The two types of tuples will behave the same most of the time, but will print differently and be treated differently by the compiler.
(type x)
Returns the type of x
as a keyword. x
is one of:
:nil
:boolean
:number
:array
:tuple
:table
:struct
:string
:buffer
:symbol
:keyword
:function
:cfunction
:fiber
or another keyword for an abstract type.
(type nil) # -> :nil
(type true) # -> :boolean
(type false) # -> :boolean
(type 1) # -> :number
(type :key) # -> :keyword
(type (int/s64 "100")) # -> :core/s64
Community Examples(unless condition & body)
Shorthand for (when (not condition) ;body)
.
(unmarshal buffer &opt lookup)
Unmarshal a value from a buffer. An optional lookup table can be provided to allow for aliases to be resolved. Returns the value unmarshalled from the buffer.
(untrace func)
Disables tracing on a function. Returns the function.
(update ds key func & args)
For a given key in data structure ds
, replace its corresponding value with the result of calling func
on
that value. If args
are provided, they will be passed along to func
as well. Returns ds
, updated.
(update-in ds ks f & args)
Update a value in a nested data structure ds
. Looks into ds
via a sequence of keys, and replaces the value
found there with f
applied to that value. Missing data structures will be replaced with tables. Returns the
modified, original data structure.
(use & modules)
Similar to import
, but imported bindings are not prefixed with a module identifier. Can also import multiple
modules in one shot.
(values x)
Get the values of an associative data structure.
(var- name & more)
Define a private var that will not be exported.
(varfn name & body)
Create a function that can be rebound. varfn
has the same signature as defn
, but defines functions in the
environment as vars. If a var name
already exists in the environment, it is rebound to the new function.
Returns a function.
(walk f form)
Iterate over the values in ast and apply f
to them. Collect the results in a data structure. If ast is not a
table, struct, array, or tuple, returns form.
(warn-compile msg level where &opt line col)
Default handler for a compile warning.
(when condition & body)
Evaluates the body when the condition is true. Otherwise returns nil.
(when-let bindings & body)
Same as (if-let bindings (do ;body))
.
(when-with [binding ctor dtor] & body)
Similar to with, but if binding is false or nil, returns nil without evaluating the body. Otherwise, the same
as with
.
(with [binding ctor dtor] & body)
Evaluate body
with some resource, which will be automatically cleaned up if there is an error in body
.
binding
is bound to the expression ctor
, and dtor
is a function or callable that is passed the binding.
If no destructor (dtor
) is given, will call :close on the resource.
# Print all of poetry.txt, and close the file when done,
# even when there is an error.
(with [f (file/open "poetry.txt")]
(print (:read f :all)))
Community Examples(with-dyns bindings & body)
Run a block of code in a new fiber that has some dynamic bindings set. The fiber will not mask errors or signals, but the dynamic bindings will be properly unset, as dynamic bindings are fiber-local.
(with-env env & body)
Run a block of code with a given environment table
(with-syms syms & body)
Evaluates body
with each symbol in syms
bound to a generated, unique symbol.
(with-vars vars & body)
Evaluates body
with each var in vars
temporarily bound. Similar signature to let
, but each binding must
be a var.
(xprin to & xs)
Print to a file or other value explicitly (no dynamic bindings). The value to print to is the first argument,
and is otherwise the same as prin
. Returns nil.
(xprinf to fmt & xs)
Like prinf
but prints to an explicit file or value to
. Returns nil.
(xprint to & xs)
Print to a file or other value explicitly (no dynamic bindings) with a trailing newline character. The value to
print to is the first argument, and is otherwise the same as print
. Returns nil.
(xprintf to fmt & xs)
Like printf
but prints to an explicit file or value to
. Returns nil.
(yield &opt x)
Yield a value to a parent fiber. When a fiber yields, its execution is paused until another thread resumes it. The fiber will then resume, and the last yield call will return the value that was passed to resume.
(zipcoll ks vs)
Creates a table from two arrays/tuples. Returns a new table.