2020-04-18
Fun Factor Libraries
Factor is a programming language I've written about before and in the early days of Factor development I wrote a number of libraries and contributed to development. It's been a while since I've contributed but I still use Factor. The development environment has a very Smalltalk-like feel to it and it includes full documentation and browseable source code of libraries.
This post isn't about Factor the language, but is about some of the neat fun libraries that people have written that shows off the graphical development system a bit.
Minesweeper
The first example is an implementation of the game Minesweeper in Factor. A blog post by the author explains the implementation. To run it inside Factor, do the following:
"minesweeper" run
A new window will open showing the game. Help can be shown with:
"minesweeper" help
XKCD
Another fun example is displaying XKCD comics inside the Factor REPL. The implementation is explained by the author here.
USE: xkcd
latest-xkcd.
...comic displayed here...
random-xkcd.
...comic displayed here...
Wikipedia
If it seems like all the examples I'm using are from the excellent re-factor blog - well, most of them are. This blog post from re-factor shows pulling historical facts from Wikipedia:
USE: wikipedia
USE: calendar
today historical-events.
...a list of historical events from wikipedia for today...
yesterday historical-births.
...a list of historical births from wikipedia for yesterday...
5 weeks ago historical-deaths.
...a list of historical deaths from wikipedia for five weeks ago...
The items in the list are graphical elements that can be manipulated. Left clicking on the coloured words will open a URL in the default web browser. Right clicking allows you to push the element on the Factor stack and manipulate it.
The calendar vocab has a lot of interesting words that allow doing calculations like "5 weeks ago".
Hacker News
There's a hacker-news vocabulary that provides words to list current articles on the Hacker News website. Like the previous Wikipedia example, the graphical elements are clickable objects:
USE: hacker-news
hacker-news-top.
...list of top articles...
hacker-news-show.
...list articles related to showing projects...
CPU 8080 Emulator
A number of years ago I wrote a CPU 8080 emulator in Factor and used this to implement a Space Invaders Emulator and then emulators for a couple of other 8080 arcade games, Balloon Bomber and Lunar Rescue. These examples require the original arcade ROMs and instructions for using them are in the online help:
"rom.space-invaders" run
...opens in a new window...
"rom.balloon-bomber" run
...opens in a new window...
"rom.lunar-rescue" run
...opens in a new window...
"rom.space-invaders" help
...displays help...
Gopher Implementation
Another magical implementation from the re-factor blog, a Gopher server and a graphical Gopher Client. This is a video I made of the gopher client on YouTube:
I also did a video that shows some Factor development tools on the running Gopher client to show how everything is live in Factor:
And More
There's much more buried inside Factor. The list of articles and list of vocabularies from the online help is a good way to explore. This help system is also available offline in a Factor install. By default many libraries aren't loaded when Factor starts but you can force loading everything using load-all
:
load-all
...all vocabs are loaded - prepare to wait for a while...
save
...saves the image so when factor is restarted the vocabs remain loaded...
The benefit of doing this while developing is all the online help, source and words are available via the inbuilt tools like "apropos", "usage", etc.