Hi, I’m Erika Rowland (a.k.a. erikareads). Hi, I’m Erika. I’m an Ops-shaped Software Engineer, Toolmaker, and Resilience Engineering fan. I like Elixir and Gleam, Reading, and Design. She/Her. Constellation Webring Published on Modified on

A Joy to Work With

Today, I’ve been playing Joy, a purely functional concatenative programming language.Thanks to Shae for reminding me of Joy, and for suggesting that it might be useful for systems programming.

Everything in Joy is a function that takes a stack and returns a stack.

Hello world looks like thisSourced from here:

"Hello, world!\n" putchars .

Piece by piece, "Hello, world!\n" puts a literal string on the stack. putchars takes a stack consisting of a single string, and prints it to the console. The . character tells joy to execute the sequence of functions.

Command Line Arguments

My interest in Joy is for short executable programs, so I wanted to know how to learn how to use command line arguments in Joy.

Here’s what I came up withI’m using a joy executable compiled from here:

#!/usr/bin/env joy
argv 1 drop [" " concat] map [putchars] step .

Piece by piece:

argv takes all arguments passed in with the program, including the program’s name, and returns an aggregate (here a list of strings).

1 is a pure function that takes a stack and adds itself to that stack.

drop takes an aggregate and a number, and drops number of elements from the aggregate. In this case, the name of the calling program.

[" " concat] is a quote, which allows me to pass a function unexecuted onto the stack. I believe in this case the concat is partially applied with " " as the second argument.

concat takes two sequences and concatenates them.

map takes an aggregate and a quoted function, and executes the function on each element of the aggregate, returning a stack containing a new aggregate with elements transformed by the function. Here it will take each element from our modified argv aggregate and concatenates them with " ".

step takes an aggregate and a quoted function, and executes the function once for each element of the aggregate. In this case, I call putchars for each string.


$ ./hello.joy hello world
hello world 

I’ve been using the resources found here which have been most useful at making this short program work.

Constellation Webring