Homespring: "Because programming isn't like a river,
but it damn well ought to be!"
Jeff Binder
News
4/15 - Minor update to the interpreter, standard and tutorial: Homespring
now has a better way to deal with completely blank programs. An example of
a completely blank program is now included (man, was that program easy to
write). I also fixed a typo on this page.
What is Homespring?
Homespring is a bizarre programming language in the spirit of INTERCAL and Befunge.
It is designed to superficially resemble English, but hide beneath it a
structure so needlessly complicated and ridiculously impractical that it
brings tears to the eyes. Instead of being an excessively low-level
language, like most of these efforts are, Homespring aims to be
excessively high-level, as you shall see.
What does the name mean?
Homespring stands for Hatchery Oblivion through Marshy Energy from
Snowmelt Powers Rapids Insulated but Not Great. Once you see the
language you'll know why. One might also call it HOtMEfSPRIbNG, if one
so desires. HS will do in a pinch.
What's it like?
Programming in Homespring is hard, mainly because it is so different
from other languages. The language closest to Homespring is Hunter,
in that it relies on autonomous agents to carry information. Although
unlike Hunter, HS has the environment changing the agents, not the other
way around. HS also has an extremely rigid structure that you basically
have to work around.
As I've said, it's designed to resemble English. It doesn't cheat all
that much either. Although it's case insensitive, the periods are
lexically significant, and most of the words you see are actually
keywords.
Even though the most trivial programs can be fiendishly difficult to
write in Homespring, programming it is still kind of interesting and
fun. It's also fun to know you've written a working program that looks
like the one just below.
Is it Turing-complete?
Maybe. It hasn't been proven or disproven yet. It looks like it might be,
or atleast it might be close. I plan to try and write a Turing-machine
emulator in it next, so that will settle it.
What does it look like?
Here's a simple program that copies input to output:
.
(that's a period followed by a blank line.) OK, that's not a very good
example. Here's a Hello World program written in Homespring:
Universe of bear hatchery says
Hello. World!.
It
powers the marshy things;
the power of the snowmelt overrides.
Keep in mind that the spaces are all required.
What's it good for?
Writing a program that copies input to output. Actually, it's so slow
it's not very good for that.
Then why?
Why not?
What documentation is there?
There's the Language Specification (pdf; 100k), but it's
not very useful as a tutorial or as a reference or as anything else.
There's also the Tutorial, which is your
best bet.
How about some more examples?
That's not really a question, but OK.
Here's another Hello World:
Universe of marshy force. Field
sense
shallows the hatchery saying
Hello,. World!.
Hydro. Power spring
sometimes; snowmelt
powers snowmelt always.
Here's the 'Hi, what's your name?' 'Hi, $name!' program that's often
seen in programming tutorials:
Universe marshy now. The marshy
stuff evaporates downstream. Sense rapids
upstream. Killing. Device
downstream. Sense shallows and say Hi,.
That powers
the force. Field sense shallows hatchery power.
Hi .. What's. your. name?.
Hydro. Power spring
when snowmelt then powers
insulated bear
hatchery !.
Powers
felt; powers
feel snowmelt themselves.
This program asks the user a question and tells them whether they
answered correctly.
Universe alive with youth.
Fountain bear Marshy
evaporates downstream. Sense
rapids
upstream. Killing. Device
downstream. Sense shallows you. lie!.
Powers force.
Field sense shallows the hatchery but
what's. six. times. four?.
Hydro. Power spring
with snowmelt which has
powers enough.
It powers snowmelt at least.
Marshy lock upstream. Sense bear now.
24 powers drive
snowmelt away.
Insulated bear
hatchery time, rightyo!.
HYDRO. Power spring
with snowmelt first.
And now, the tour de force, a program that adds two single-digit
numbers together. When running it, make sure you wait for the prompts
to enter the numbers, and keep in mind that it's VERY slow.
Universe is marshy but evaporates
downstream. Sense the rapids reverse. Down
bridge is now marsh:
Marshy marshy marshy marshy
marshy marshy marshy marshy marshy marshy now.
All evaporates downstream. Sense
the rapids now:
Rapids rapids rapids rapids
rapids rapids rapids rapids sensed.
Ugh +.
Take powers
from
snowmelt therefore;
the current time is of youth. Fountain is young. Bear cannot
reverse. Down inverse. Lock
young. Switch young. Range. Switch clone to the
switch itself. Now inverse. Lock
narrows down:
Powers
to append. Up go all young. Bear time evaporates
then. Therefore:
Spawn power. Invert evaporates
it. Down force. Down reverse. Down net. The
net reverses force.
Now try:
Add add add add add add add now.
It is not possible; now count:
0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18+.
You can now pump
in reverse. Down lock goes;
narrows lock down:
Inverse. Lock young. Range. Sense
0n 1n 2n 3n 4n 5n 6n 7n 8n 9n
Powers lock time now.
Inverse. Lock young. Range. Sense
0n 1n 2n 3n 4n 5n 6n 7n 8n 9n
Powers
snowmelt now.
Powers
all:
Bear hatchery n
powers
insulated bear hatchery ?.
Hydro. Power spring as
snowmelt
powers snowmelt then, and disengage.
HYDRO!!
Downloads
Download a tarball of everything (tar.bz2; 72k). This includes an
interpreter written in Guile
Scheme, (which is a bit of a mess, but
it works), the specification along with its LaTeX source, all of the example
programs, and a copy of this Web site.
Copyright (C) 2003 Jeff Binder
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.