View on GitHub

Streem

🦬 STREEEEEEEEEEM 🦬

Standard

Streem has standard functions for processing strings, I/O, CSV, hashtables and bar graphs.

Built-in objects

Standard I/O

The ‘stdin’, ‘stdout’ and ‘stderr’ are file descriptors used for the standard I/O operations.

Built-in functions

Stream contains a variety of built-in functions. Note that they can return streams.

puts() - print a string to standard output

The puts() function can be used for printing to standard output.

./hello-world.strm

# Output: HELLO, world
s = "HELLO, world"
puts(s)

The print() function is an alias to the puts() function.

Reverse an array

An array can be reversed using a ‘reverse’ function. Instead of a new array, a stream is created.

./countdown.strm

x = [1, 2, 3]
reverse(x) | stdout
# Output:
# 3
# 2
# 1

exit(status)

Terminates with a specified value. Useful in Shell scripts.

./success.strm

./streem -e "exit(1)" || echo "failure"
# Output: failure

./failure.strm

./streem -e "exit(0)" && echo "success"
# Output: success

zip() - zip two streams

Creates a quasi-dictionary structure that consists of the keys given in the left argument and values in the right argument. Both arguments are arrays. The output array consists of an array of two-element arrays. The first is the key, and the second is the value.

./sheet.strm

rows = [["cell_1", "cell_2", "cell_3"],
        ["cell_4", "cell_5", "cell_6"],
        ["cell_7", "cell_8", "cell_9"]]
columns = ["column_1", "column_2", "column_3"]
zip(columns, rows) | stdout

# Output:
# ["column_1", ["cell_1", "cell_2", "cell_3"]]
# ["column_2", ["cell_4", "cell_5", "cell_6"]]
# ["column_3", ["cell_7", "cell_8", "cell_9"]]

& - zip two arrays

The & operator is an alias to the zip() function.

./matrix.strm

seq(3) & seq(3) | stdout
[1, 1]
[2, 2]
[3, 3]

# Output:
# [1, 1]
# [2, 2]
# [3, 3]

./zip-with-counter.strm

You can zip streams as well, not just arrays.

# Input:
# HELLO,
# @stagyrite
# 🐍

stdin & seq(3) | stdout

# Output:
# ["HELLO,", 1]
# ["@stagyrite", 2]
# ["🐍", 3]

Streaming bar graph

A trivial example that counts down from 3 to 0.

./stag-countdown.strm

graph = graph_bar()
[3, 2, 1, 0] | graph

It can be filled with numbers from the range 1 to 250.

stag-linear.strm

graph = graph_bar()
seq(250) | graph

Random numbers

The random number generator is not fully implemented. Random numbers can be acquired only by modifying the source code.

There’s an ability to generate random numbers.

rand_seed() - generate a random seed

It generates a string that can be used as a random seed.

rand() - instantiate a stream of random numbers

It takes one argument, which is a random seed. If no arguments are provided, it uses a randomly generated seed.

It starts to emit floating-point numbers. e.g., 0.978470, 0.396758, 0.241088, etc.

rand_norm() - instantiate a streem of normal (or Gaussian) random numbers

Generate Gaussian noise using the Marsaglia polar method.

sample() - retrieves a sample of data

Pass a number n to retrieve the n-th element from a stream.

String manipulation

Strings can be transformed and manipulated with a set of built-in functions.

number() - converts a string to a number

You need to parse out an integer or a floating-point number from a string, possibly user input. The ‘number()’ function returns a number that can be used with mathematical operators.

# Output: 58
eight = number("8")
seven = number("7.0")
puts(eight * seven)