Mouse is a stack-based interpreted programming language descended from MUSYS, an earlier language for a DEC PDP/8 with 4096 words of memory.
In Mouse: a Language for Microcomputers, Grogono defines the language and develops an intepreter step-by-step as he introduces each feature of the language.
The first few chapters cover the basics: postfix expressions, variables, control structures, pointers and macros. Later chapters include two complete Mouse interpreters, one in Pascal, the other in Z80 assembly language.
Here's a brief summary of the Mouse language. Instructions pop their operands from and push their result on the stack. ( before -- after ) shows the stack effects of each operation.
Maths / Logic
Mouse is looking pretty Forthlike so far! \
is the equivalent of MOD
in Forth:
+
- ( x y -- z ) calculate z, the sum of x+y-
- ( x y -- z ) calculate z, the difference of x-y*
- ( x y -- z ) calculate z, the product of x×y/
- ( x y -- z ) calculate z, the quotient of x/y\
- ( x y -- z ) calculate z, the remainder of x/y<
- ( x y -- z ) if x<y then z is true, otherwise false=
- ( x y -- z ) if x=y then z is true, otherwise false>
- ( x y -- z ) if x>y then z is true, otherwise false
Input / Output
Only ?
doesn't have an exact equivalent in Forth. ?'
is the same as Forth's KEY
. !'
is the same as EMIT
and !
is .
:
?
- ( -- x ) read a number x from the keyboard?'
- ( -- x ) read a character x from the keyboard!
- ( x -- ) display a number x!'
- ( x -- ) display a character x"…"
- ( -- ) display the quoted string
Peek and Poke
:
is the equivalent of !
in Forth. .
is the equivalent of @
:
:
- ( x addr -- ) store x in address addr.
- ( addr -- x ) read x from address addr
Control Structures
[ … | … ]
is similar to Forth's IF … ELSE … THEN
.
( … ↑ … )
is similar to Forth's BEGIN … WHILE … REPEAT
:
[
- ( x -- ) if x is false, jump to the matching|
or]
|
- ( -- ) jump to the matching]
(not always implemented)]
- ( -- ) end a[ … | … ]
structure(
- ( -- ) start a loop↑
- ( x -- ) exit loop if x is false (often rendered as^
))
- ( -- ) end loop, jump back to matching(
~
- ( -- ) the remainder of the line is a comment
Macro Definitions
#x;
- ( -- ) call macro x$x
- ( -- ) define macro x@
- ( -- ) end macro definition%
- ( x -- z ) access macro parameter
Macros are the Mouse equivalent of subroutines. A macro is defined by $x … @
and called with #x;
. Parameters can be passed between the macro name and semicolon. For example #x,7,5,9;
will pass the parameters 7, 5 and 9 to x.
A macro accesses it's parameters using %
: 1%
for the first, 2%
for the second, etc. A parameter is evaluated every time it's accessed and can be almost any valid Mouse code.
A macro has 26 local variables, A to Z. 26 macro names are available, A to Z.
Example Code
Here are a few classic examples:
- Hello World (which recently celebrated it's 40th birthday)
- Fibonacci Numbers (the typical bad example of recursion)
- Greatest Common Divisor (a better example of recursion)
Hello, World
"Hello, World!"$
Displays the string Hello, World. The exclamation mark isn't printed. An exclamation in a string instructs the interpreter to print a line break. All Mouse programs end with $
.
Fibonacci Numbers
$F
1% N: ~ store parameter in N
N. 2 < [ N. ] ~ if N < 2 then return N
N. 1 > [ #F, N. 1 - ; ~ otherwise calculate F(N-1)
#F, N. 2 - ; ~ | and F(N-2)
+ ] ~ | and return their sum
@
F
calculates Fibonacci numbers using the recurrence relation Fn = Fn-1 + Fn-2 with F0 = 0, F1 =1. Note this is really slow, Ο(φn). Calculating F40 takes 6 minutes. There are better ways to calculate Fibonacci numbers!
Greatest Common Divisor
$G
1% X: 2% Y: ~ store parameters
X. Y. = [ X. ] ~ if X = Y then GCD = X
X. Y. > [ #G, X. Y. - , Y. ; ] ~ otherwise subtract the
X. Y. < [ #G, Y. X. - , X. ; ] ~ | smallest from the
@ ~ | largest and recurse
Another example of recursion. G
calculates the GCD using Dijkstra's method.
Further Reading
-
Grogono, Peter
Mouse: A Language for Microcomputers.
New York: Petrocelli Books, 1983. - David G Simpson has published several interpreters for Mouse.
Having something like
ReplyDelete+ - ( x y -- z ) means that this is a postfix expression. They are sometimes not that easy to decipher. Most languages out there use infix expressions (such as x + y - z). LISP uses postfix (where you have something like (+ x y))
Thanks for sharing...
I think you meant LISP is PREfix.
DeleteThis is a stack based language, therefore postfix/RPN should be expected.
DeleteI would rather use a professional programming environment, made for professionals to create reliable fast professional code.
ReplyDeleteYou should use Visual Basic.
Microsoft shill? :/
DeleteHa ha, good joke...
Delete