# Core Library

The definitions provided by this library operate on functions to produce new functions.

## Functions

### length

Returns the length of the value. For stream-like values, this is how many values are in the stream. For strings, this is how many characters are in the string. For numeric values, this is how many base-10 digits are in the non-fractional part (i.e., the base-10 magnitude of the absolute value).

**N.B.:** This function will not expand streams. If the tail of the stream is a promise to generate more values, the length of the stream will be `inf`

, using the sense of “unbounded” rather than the colloquial sense of “too large to count.”

#### Examples

```
length("The big bad bear") = 16
length(1..5) = 5
length(list-cons(1..3, 5..6)) = inf
length(12.345) = 2
length(-234) = 3
```

#### Implementation

This is implemented internally.

### list-cons

Creates a new stream that acts as if the two given streams are concatenated.

#### Examples

```
list-cons(1..4, 6..10) = [ 1, 2, 3, 4, 6, 7, 8, 9, 10 ]
```

#### Implementation

```
list-cons := y-combinator(
(self, first, second) :> (
(?first) : [ first', self(self, first..., second) ]
( ) : second
)
)
```

### nest

Composes a function with itself a given number of times.

#### Examples

```
nest(f, 3) = f . f . f = { f(f(f(#))) }/1
```

#### Implementation

```
nest := y-combinator(
(self, function, count) :> (
(count > 3) : function . function . function . self(self, function, count-3)
(count = 3) : function . function . function
(count = 2) : function . function
(count = 1) : function
( ) : { () }/1
)
)
```