ludus/prelude.md
Scott Richmond adf7c4e9e3 Updated doc
2023-12-11 16:16:16 -05:00

959 lines
22 KiB
Markdown

# Ludus prelude documentation
These functions are available in every Ludus script.
The documentation for any function can be found within Ludus by passing the function to `doc!`,
e.g., running `doc! (add)` will send the documentation for `add` to the console.
## A few notes
**Naming conventions.** Functions whose name ends with a question mark, e.g., `eq?`, return booleans.
Functions whose name ends with an exclamation point, e.g., `make!`, change state in some way.
In other words, they _do things_ rather than _calculating values_.
Functions whose name includes a slash either convert from one value to another, e.g. `deg/rad`,
or they are variations on a function, e.g. `div/0` as a variation on `div`.
**How entries are formatted.** Each entry has a brief (sometimes too brief!) description of what it does.
It is followed by the patterns for each of its function clauses.
•[abs](#abs)    •[add](#add)    •[and](#and)    •[angle](#angle)    •[append](#append)    •[assert!](#assert)    •[assoc](#assoc)    •[assoc?](#assoc)    •[at](#at)    •[atan/2](#atan/2)    •[back!](#back)    •[background!](#background)    •[bg!](#bg)    •[bgcolor](#bgcolor)    •[bk!](#bk)    •[bool](#bool)    •[bool?](#bool)    •[butlast](#butlast)    •[ceil](#ceil)    •[clear!](#clear)    •[coll?](#coll)    •[colors](#colors)    •[concat](#concat)    •[console](#console)    •[cos](#cos)    •[count](#count)    •[dec](#dec)    •[deg/rad](#deg/rad)    •[deg/turn](#deg/turn)    •[deref](#deref)    •[dict](#dict)    •[diff](#diff)    •[dissoc](#dissoc)    •[dist](#dist)    •[div](#div)    •[div/0](#div/0)    •[div/safe](#div/safe)    •[doc!](#doc)    •[each!](#each)    •[eq?](#eq)    •[err](#err)    •[err?](#err)    •[even?](#even)    •[false?](#false)    •[fd!](#fd)    •[first](#first)    •[floor](#floor)    •[flush!](#flush)    •[fn?](#fn)    •[fold](#fold)    •[forward!](#forward)    •[get](#get)    •[goto!](#goto)    •[gt?](#gt)    •[gte?](#gte)    •[heading](#heading)    •[heading/vector](#heading/vector)    •[home!](#home)    •[inc](#inc)    •[join](#join)    •[keys](#keys)    •[keyword?](#keyword)    •[last](#last)    •[left!](#left)    •[list](#list)    •[lt!](#lt)    •[lt?](#lt)    •[lte?](#lte)    •[make!](#make)    •[map](#map)    •[mod](#mod)    •[mult](#mult)    •[neg](#neg)    •[neg?](#neg)    •[nil?](#nil)    •[not](#not)    •[odd?](#odd)    •[ok](#ok)    •[ok?](#ok)    •[or](#or)    •[ordered?](#ordered)    •[p5_calls](#p5_calls)    •[panic!](#panic)    •[pc!](#pc)    •[pd!](#pd)    •[pencolor](#pencolor)    •[pencolor!](#pencolor)    •[pendown!](#pendown)    •[pendown?](#pendown)    •[penup!](#penup)    •[penwidth](#penwidth)    •[penwidth!](#penwidth)    •[pi](#pi)    •[pos?](#pos)    •[position](#position)    •[print!](#print)    •[prn!](#prn)    •[pu!](#pu)    •[pw!](#pw)    •[rad/deg](#rad/deg)    •[rad/turn](#rad/turn)    •[random](#random)    •[range](#range)    •[render_turtle!](#render_turtle)    •[report!](#report)    •[reset_turtle!](#reset_turtle)    •[rest](#rest)    •[right!](#right)    •[round](#round)    •[rt!](#rt)    •[second](#second)    •[set](#set)    •[show](#show)    •[sin](#sin)    •[slice](#slice)    •[some](#some)    •[some?](#some)    •[square](#square)    •[string](#string)    •[string?](#string)    •[sub](#sub)    •[sum_of_squares](#sum_of_squares)    •[tan](#tan)    •[tau](#tau)    •[turn/deg](#turn/deg)    •[turn/rad](#turn/rad)    •[turtle_commands](#turtle_commands)    •[turtle_state](#turtle_state)    •[turtle_states](#turtle_states)    •[type](#type)    •[unwrap!](#unwrap)    •[unwrap_or](#unwrap_or)    •[update](#update)    •[update!](#update)    •[values](#values)    •[zero?](#zero)
## Function documentation
### abs
Returns the absolute value of a number.```
(0)
(n)
```
### add
Adds numbers or vectors.```
()
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
((x1, y1), (x2, y2))
```
### and
Returns true if all values passed in are truthy.```
()
(x)
(x, y)
(x, y, ...zs)
```
### angle
Calculates the angle between two vectors.```
(v1, v2)
```
### append
Adds an element to a list or set.```
()
(xs as :list)
(xs as :list, x)
(xs as :set)
(xs as :set, x)
```
### assert!
Asserts a condition: returns the value if the value is truthy, panics if the value is falsy. Takes an optional message.```
(value)
(value, message)
```
### assoc
Takes a dict, key, and value, and returns a new dict with the key set to value.```
()
(dict as :dict)
(dict as :dict, key as :keyword, value)
(dict as :dict, (key as :keyword, value))
```
### assoc?
Returns true if a value is an associative collection: a dict, struct, or namespace.```
(assoc as :dict)
(assoc as :struct)
(assoc as :ns)
(_)
```
### at
Returns the element at index n of a list or tuple. Zero-indexed: the first element is at index 0.```
(xs as :list, n as :number)
(xs as :tuple, n as :number)
```
### atan/2
Returns an angle from a slope. Takes an optional keyword argument to specify units. Takes either two numbers or a vector tuple.```
(x as :number, y as :number)
(x, y, :turns)
(x, y, :radians)
(x, y, :degrees)
((x, y))
((x, y), units as :keyword)
```
### back!
Moves the turtle backward by a number of steps. Alias: bk!```
(steps as :number)
```
### background!
Sets the background color behind the turtle and path. Alias: bg!```
(gray as :number)
((r as :number, g as :number, b as :number))
((r as :number, g as :number, b as :number, a as :number))
```
### bg!
Sets the background color behind the turtle and path. Alias: bg!```
(gray as :number)
((r as :number, g as :number, b as :number))
((r as :number, g as :number, b as :number, a as :number))
```
### bgcolor
No documentation available.
### bk!
Moves the turtle backward by a number of steps. Alias: bk!```
(steps as :number)
```
### bool
Returns false if a value is nil or false, otherwise returns true.```
(nil)
(false)
(_)
```
### bool?
Returns true if a value is of type :boolean.```
(false)
(true)
(_)
```
### butlast
Returns a list, omitting the last element.```
(xs as :list)
```
### ceil
Truncates a number towards positive infinity. With negative numbers, it returns the integer part. With positive numbers, returns the next more-positive integer.```
(n as :number)
```
### clear!
Clears the canvas and sends the turtle home.```
()
```
### coll?
Returns true if a value is a collection: dict, struct, list, tuple, or set.```
(coll as :dict)
(coll as :struct)
(coll as :list)
(coll as :tuple)
(coll as :set)
(coll as :ns)
(_)
```
### colors
No documentation available.
### concat
Combines two lists, strings, or sets.```
(x as :string, y as :string)
(xs as :list, ys as :list)
(xs as :set, ys as :set)
(xs, ys, ...zs)
```
### console
No documentation available.
### cos
Returns the cosine of an angle. Default angle measure is turns. An optional keyword argument specifies the units of the angle passed in.```
(a as :number)
(a as :number, :turns)
(a as :number, :degrees)
(a as :number, :radians)
```
### count
Returns the number of elements in a collection (including string).```
(xs as :list)
(xs as :tuple)
(xs as :dict)
(xs as :string)
(xs as :set)
(xs as :struct)
```
### dec
Decrements a number.```
(x as :number)
```
### deg/rad
Converts an angle in degrees to an angle in radians.```
(a as :number)
```
### deg/turn
Converts an angle in degrees to an angle in turns.```
(a as :number)
```
### deref
Resolves a ref into a value.```
(r as :ref)
```
### dict
Takes a struct or ns, and returns it as a dict. Or, takes a list or tuple of (key, value) tuples and returns it as a dict. Returns dicts unharmed.```
(struct as :struct)
(ns_ as :ns)
(dict as :dict)
(list as :list)
(tup as :tuple)
```
### diff
Takes two associate data structures and returns a dict describing their differences. Does this shallowly, offering diffs only for keys in the original dict.```
(d1 as :dict, d2 as :dict)
```
### dissoc
Takes a dict and a key, and returns a new dict with the key and associated value omitted.```
(dict as :dict)
(dict as :dict, key as :keyword)
```
### dist
Returns the distance from the origin to a point described by (x, y).```
(x as :number, y as :number)
((x, y))
```
### div
Divides numbers. Panics on division by zero.```
(x as :number)
(_, 0)
(x as :number, y as :number)
(x, y, ...zs)
```
### div/0
Divides numbers. Returns 0 on division by zero.```
(x as :number)
(_, 0)
(x as :number, y as :number)
(x, y, ...zs)
```
### div/safe
Divides a number. Returns a result tuple.```
(x as :number)
(_, 0)
(x, y)
(x, y, ...zs)
```
### doc!
Prints the documentation of a function to the console.```
(f as :fn)
(_)
```
### each!
Takes a list and applies a function, presumably with side effects, to each element in the list. Returns nil.```
(f! as :fn, [])
(f! as :fn, [x])
(f! as :fn, [...xs])
```
### eq?
Returns true if all arguments have the same value.```
(x)
(x, y)
(x, y, ...zs)
```
### err
Takes a value and wraps it in an :err result tuple, presumably as an error message.```
(msg)
```
### err?
Takes a value and returns true if it is an :err result tuple.```
((:err, _))
(_)
```
### even?
Returns true if a value is an even number, otherwise returns false.```
(x as :number)
(_)
```
### false?
Returns true if a value is false, otherwise returns false. Useful to distinguish between false and nil.```
(false)
(_)
```
### fd!
Moves the turtle forward by a number of steps. Alias: fd!```
(steps as :number)
```
### first
Returns the first element of a list or tuple.```
(xs)
```
### floor
Truncates a number towards negative infinity. With positive numbers, it returns the integer part. With negative numbers, returns the next more-negative integer.```
(n as :number)
```
### flush!
Clears the console, and returns the messages.```
()
```
### fn?
Returns true if an argument is a function.```
(f as :fn)
(_)
```
### fold
Folds a list.```
(f as :fn, xs as :list)
(f as :fn, xs as :list, root)
```
### forward!
Moves the turtle forward by a number of steps. Alias: fd!```
(steps as :number)
```
### get
Takes a dict or struct, key, and optional default value; returns the value at key. If the value is not found, returns nil or the default value. Returns nil or default if the first argument is not a dict or struct.```
(key as :keyword)
(key as :keyword, coll)
(key as :keyword, coll, default)
```
### goto!
Sends the turtle to (x, y) coordinates. If the pen is down, the turtle will draw a path to its new location.```
(x as :number, y as :number)
((x, y))
```
### gt?
Returns true if numbers are in decreasing order.```
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
```
### gte?
Returns true if numbers are in decreasing or flat order.```
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
```
### heading
Returns the turtle's current heading.```
()
```
### heading/vector
Takes a turtle heading, and returns a unit vector of that heading.```
(heading)
```
### home!
Sends the turtle home: to the centre of the screen, pointing up. If the pen is down, the turtle will draw a path to home.```
()
```
### inc
Increments a number.```
(x as :number)
```
### join
Takes a list of strings, and joins them into a single string, interposing an optional separator.```
([])
([str as :string])
(strs as :list)
([str, ...strs], separator as :string)
```
### keys
Takes an associative collection and returns a list of keys in that collection. Returns an empty list on anything other than a collection.```
(coll)
```
### keyword?
Returns true if a value is a keyword, otherwise returns false.```
(kw as :keyword)
(_)
```
### last
Returns the last element of a list or tuple.```
(xs)
```
### left!
Rotates the turtle left, measured in turns. Alias: lt!```
(turns as :number)
```
### list
Takes a value and returns it as a list. For values, it simply wraps them in a list. For collections, conversions are as follows. A tuple->list conversion preservers order and length. Unordered collections do not preserve order. Associative collections return lists of (key, value) tuples.```
(x)
```
### lt!
Rotates the turtle left, measured in turns. Alias: lt!```
(turns as :number)
```
### lt?
Returns true if numbers are in increasing order.```
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
```
### lte?
Returns true if numbers are in increasing or flat order.```
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
```
### make!
Sets the value of a ref.```
(r as :ref, value)
```
### map
Maps over a list.```
(f as :fn, xs)
(kw as :keyword, xs)
```
### mod
Returns the modulus of num and div. Truncates towards negative infinity.```
(num as :number, y as :number)
```
### mult
Multiplies numbers or vectors.```
()
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
(scalar as :number, (x, y))
((x, y), scalar as :number)
```
### neg
Multiplies a number by -1, negating it.```
(n as :number)
```
### neg?
Returns true if a value is a negative number, otherwise returns false.```
(x as :number)
(_)
```
### nil?
Returns true if a value is nil.```
(nil)
(_)
```
### not
Returns false if a value is truthy, true if a value is falsy.```
(nil)
(false)
(_)
```
### odd?
Returns true if a value is an odd number, otherwise returns false.```
(x as :number)
(_)
```
### ok
Takes a value and wraps it in an :ok result tuple.```
(value)
```
### ok?
Takes a value and returns true if it is an :ok result tuple.```
((:ok, _))
(_)
```
### or
Returns true if any value passed in is truthy.```
()
(x)
(x, y)
(x, y, ...zs)
```
### ordered?
Returns true if a value is an indexed collection: list or tuple.```
(coll as :list)
(coll as :tuple)
(_)
```
### p5_calls
No documentation available.
### panic!
Causes Ludus to panic, outputting any arguments as messages.```
()
(...args)
```
### pc!
Changes the turtle's pen color. Takes a single grayscale value, an rgb tuple, or an rgba tuple. Alias: pc!```
(gray as :number)
((r as :number, g as :number, b as :number))
((r as :number, g as :number, b as :number, a as :number))
```
### pd!
Lowers the turtle's pen, causing it to draw. Alias: pd!```
()
```
### pencolor
Returns the turtle's pen color as an (r, g, b, a) tuple.```
()
```
### pencolor!
Changes the turtle's pen color. Takes a single grayscale value, an rgb tuple, or an rgba tuple. Alias: pc!```
(gray as :number)
((r as :number, g as :number, b as :number))
((r as :number, g as :number, b as :number, a as :number))
```
### pendown!
Lowers the turtle's pen, causing it to draw. Alias: pd!```
()
```
### pendown?
Returns the turtle's pen state: true if the pen is down.```
()
```
### penup!
Lifts the turtle's pen, stopping it from drawing. Alias: pu!```
()
```
### penwidth
Returns the turtle's pen width in pixels.```
()
```
### penwidth!
Sets the width of the turtle's pen, measured in pixels. Alias: pw!```
(width as :number)
```
### pi
No documentation available.
### pos?
Returns true if a value is a positive number, otherwise returns false.```
(x as :number)
(_)
```
### position
Returns the turtle's current position.```
()
```
### print!
Sends a text representation of Ludus values to the console.```
(...args)
```
### prn!
Prints the underlying Clojure data structure of a Ludus value.```
(x)
```
### pu!
Lifts the turtle's pen, stopping it from drawing. Alias: pu!```
()
```
### pw!
Sets the width of the turtle's pen, measured in pixels. Alias: pw!```
(width as :number)
```
### rad/deg
Converts an angle in radians to an angle in degrees.```
(a as :number)
```
### rad/turn
Converts an angle in radians to an angle in turns.```
(a as :number)
```
### random
Returns a random number. With zero arguments, returns a random number between 0 (inclusive) and 1 (exclusive). With one argument, returns a random number between 0 and n. With two arguments, returns a random number between m and n.```
()
(n as :number)
(m as :number, n as :number)
```
### range
Returns the set of integers between start (inclusive) and end (exclusive) as a list. With one argument, starts at 0. If end is less than start, returns an empty list.```
(end as :number)
(start as :number, end as :number)
```
### render_turtle!
```
()
```
### report!
Prints a value, then returns it.```
(x)
(msg as :string, x)
```
### reset_turtle!
Resets the turtle to its original state.```
()
```
### rest
Returns all but the first element of a list or tuple, as a list.```
(xs as :list)
(xs as :tuple)
```
### right!
Rotates the turtle right, measured in turns. Alias: rt!```
(turns as :number)
```
### round
Rounds a number to the nearest integer.```
(n as :number)
```
### rt!
Rotates the turtle right, measured in turns. Alias: rt!```
(turns as :number)
```
### second
Returns the second element of a list or tuple.```
(xs)
```
### set
Takes an ordered collection--list or tuple--and turns it into a set.```
(xs as :list)
(xs as :tuple)
```
### show
Returns a text representation of a Ludus value as a string.```
(x)
```
### sin
Returns the sine of an angle. Default angle measure is turns. An optional keyword argument specifies the units of the angle passed in.```
(a as :number)
(a as :number, :turns)
(a as :number, :degrees)
(a as :number, :radians)
```
### slice
Returns a slice of a list, representing a sub-list.```
(xs as :list, end as :number)
(xs as :list, start as :number, end as :number)
```
### some
Takes a possibly nil value and a default value. Returns the value if it's not nil, returns the default if it's nil.```
(nil, default)
(value, _)
```
### some?
Returns true if a value is not nil.```
(nil)
(_)
```
### square
Squares a number.```
(x as :number)
```
### string
Converts a value to a string by using `show`. If it is a string, returns it unharmed. Use this to build up strings of differen kinds of values.```
(x as :string)
(x)
(x, ...xs)
```
### string?
Returns true if a value is a string.```
(x as :string)
(_)
```
### sub
Subtracts numbers or vectors.```
()
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
((x1, y1), (x2, y2))
```
### sum_of_squares
Returns the sum of squares of numbers.```
()
(x as :number)
(x as :number, y as :number)
(x, y, ...zs)
```
### tan
Returns the sine of an angle. Default angle measure is turns. An optional keyword argument specifies the units of the angle passed in.```
(a as :number)
(a as :number, :turns)
(a as :number, :degrees)
(a as :number, :radians)
```
### tau
No documentation available.
### turn/deg
Converts an angle in turns to an angle in degrees.```
(a as :number)
```
### turn/rad
Converts an angle in turns to an angle in radians.```
(a as :number)
```
### turtle_commands
No documentation available.
### turtle_state
Returns the turtle's current state.```
()
```
### turtle_states
No documentation available.
### type
Returns a keyword representing the type of the value passed in.```
(x)
```
### unwrap!
Takes a result tuple. If it's :ok, then returns the value. If it's not :ok, then it panics. If it's not a result tuple, it also panics.```
((:ok, value))
((:err, msg))
(_)
```
### unwrap_or
Takes a value that is a result tuple and a default value. If it's :ok, then it returns the value. If it's :err, returns the default value.```
((:ok, value), _)
((:err, _), default)
```
### update
Takes a dict, key, and function, and returns a new dict with the key set to the result of applying the function to original value held at the key.```
(dict as :dict)
(dict as :dict, key as :keyword, updater as :fn)
```
### update!
Updates a ref by applying a function to its value. Returns the new value.```
(r as :ref, f as :fn)
```
### values
Takes an associative collection and returns a list of values in that collection. Returns an empty list on anything other than a collection.```
(coll)
```
### zero?
Returns true if a number is 0.```
(0)
(_)
```