Re: Factor

Factor: the language, the theory, and the practice.

SMAC

Friday, October 27, 2023

Recently, I was looking into the Zig programming language and bumped into this video tutorial:

It presents an example – in the spirit of Fizz buzz – called SMAC, which is basically a program that converts the first million numbers into strings or "SMAC" (if the number is divisible by 7 or ends with a 7) and prints them out. This is then implemented in three different forms:

  1. single-threaded
  2. multi-threaded, and
  3. networked using sockets.

We first start with the basics, a word to check if a number is SMAC or not:

: smac? ( n -- ? )
    { [ 7 mod 0 = ] [ 10 mod 7 = ] } 1|| ;

And then a word that converts a number into its string representation or SMAC:

: smac ( n -- str )
    dup smac? [ drop "SMAC" ] [ number>string ] if ;

Single-Threaded

The simplest example – run in a single-thread – iteratively prints to the output-stream.

: smac. ( n -- )
    [1..b] [ smac print ] each ;

Trying it out, you can see that it works:

IN: scratchpad 20 smac.
1
2
3
4
5
6
SMAC
8
9
10
11
12
13
SMAC
15
16
SMAC
18
19
20

Multi-Threaded

Slightly more complex, the multi-threaded example splits the numbers into four n-groups, computes them as a future in four background threads, and then waits for those computations to finish and iteratively prints them out.

: smac. ( n -- )
    [1..b] 4 <n-groups>
    [ '[ _ [ smac ] map ] future ] map
    [ ?future [ print ] each ] each ;

It produces the same output as the single-threaded smac. word above.

Networked

The simple networked example creates a server configured to print n results when a client connects:

: smac-server ( n -- server )
    utf8 <threaded-server>
        "smac" >>name
        7979 >>insecure
        swap '[ _ smac. ] >>handler ;

You can run it:

IN: scratchpad 20 smac-server start-server

And then try it out:

$ nc localhost 7979
1
2
3
4
5
6
SMAC
8
9
10
11
12
13
SMAC
15
16
SMAC
18
19
20

A fun example for learning about a few introductory concepts in Factor!