# data/function

## `(-> x &funcs)`

Macro defined at lib/data/function.lisp:59:2

Chain a series of method calls together. If the list contains `<>` then the value is placed there, otherwise the expression is invoked with the previous entry as an argument.

### Example

``````> (-> '(1 2 3)
.   (map succ <>)
.   (map (cut * <> 2) <>))
out = (4 6 8)
``````

## `(as-is x)`

Defined at lib/data/function.lisp:134:2

Return the value `X` unchanged.

### Example

``````> (map as-is '(1 2 3))
out = (1 2 3)
``````

## `(call x key &args)`

Defined at lib/data/function.lisp:158:2

Index `X` with `KEY` and invoke the resulting function with `ARGS`.

### Example

``````> (define tbl { :add + })
> (call tbl :add 1 2 3)
out = 6
``````

## `(comp &fs)`

Defined at lib/data/function.lisp:112:2

Return the pointwise composition of all functions in `FS`.

### Example:

``````> ((comp succ (cut + <> 2) (cut * <> 2))
.  2)
out = 7
``````

## `(compose f g)`

Defined at lib/data/function.lisp:98:2

Return the pointwise composition of functions `F` and `G`.

### Example:

``````> ((compose (cut + <> 2) (cut * <> 2))
.  2)
out = 6
``````

## `(const x)`

Defined at lib/data/function.lisp:144:2

Return a function which always returns `X`. This is equivalent to the `K` combinator in `SK` combinator calculus.

### Example

``````> (define x (const 1))
> (x 2)
out = 1
> (x "const")
out = 1
``````

## `(cut &func)`

Macro defined at lib/data/function.lisp:16:2

Partially apply a function `FUNC`, where each `<>` is replaced by an argument to a function. Values are evaluated every time the resulting function is called.

### Example

``````> (define double (cut * <> 2))
> (double 3)
out = 6
``````

## `(cute &func)`

Macro defined at lib/data/function.lisp:37:2

Partially apply a function `FUNC`, where each `<>` is replaced by an argument to a function. Values are evaluated when this function is defined.

### Example

``````> (define double (cute * <> 2))
> (double 3)
out = 6
``````

## `(id x)`

Defined at lib/data/function.lisp:124:2

Return the value `X` unmodified.

### Example

``````> (map id '(1 2 3))
out = (1 2 3)
``````

## `(invokable? x)`

Defined at lib/data/function.lisp:80:2

Test if the expression `X` makes sense as something that can be applied to a set of arguments.

### Example

``````> (invokable? invokable?)
out = true
> (invokable? nil)
out = false
> (invokable? (setmetatable {} { :__call (lambda (x) (print! "hello")) }))
out = true
``````

## `(self x key &args)`

Defined at lib/data/function.lisp:169:2

Index `X` with `KEY` and invoke the resulting function with `X` and `ARGS`.

### Example

``````> (define tbl { :get (lambda (self key) (.> self key))
.               :x 1
.               :y 2 })
> (self tbl :get :x)
out = 1
``````

## `(slot? symb)`

Defined at lib/data/function.lisp:3:2

Test whether `SYMB` is a slot. For this, it must be a symbol, whose contents are `<>`.

### Example

``````> (slot? '<>)
out = true
> (slot? 'not-a-slot)
out = false
``````