The MUF Cheat-Sheet

as seen by Sammael (Arthur, The., etc)

-or-

Reference manual for MUCK Forth ("MUF") -terse

v2.2fb4.0 July 29, 1990


Table of Contents


Entering Editing Mode

@program <program name>    (creates a new program if none match)
@edit <program name or number>

Editing Commands

<number> i                              insert before <number>
.                                       exit insert mode
c                                       compile
<number1> <number2> l                   list
<number1> <number2> d                   delete
<letter> <letter>   a                   show macros (abridged)
<letter> <letter>   s                   show macros (long)
<program#> v                            view program header
<program#> p                            list prog's public functs.
h                                       help on edit mode
u                                       uncompile
q                                       quit editor mode

Compiler Directives

$echo <string>                          Echos <string> during compile
$define <defname> <defin.> $enddef      Defines <defname> to <defin.>
$def <defname> <defin.>                 Same, but stops at end of line
$undef <defname>                        Undefines <defname>
$include <obj>                          Load $defines from <obj>
$ifdef <defname>[<comparison>]          Starts $ifdef clause.
$ifndef <defname>[<comparison>]         Starts $ifndef clause.
$else                                   Compile if $if[n]def failed.
$endif                                  Marks end of $if[n]def clause

__version is a standard $define, containing the server version.


Structures

A function has the format of
: <funcname> <instruction> [<instruction> ... ] ;

If-then statements use the structure

<comparisons> if <cmds_if_true> [else <cmds_if_false>] then

Loops can use two different structures.

begin
  <instructions>
  <comparisons>
until   (repeats loop until comparison is true)

begin
  <instructions>
repeat  (repeat loop)
Both types of loops can contain as many of the following as needed.
<comparison> while  (if comparison is false, exit the loop)
break               (exit the loop.  Often used inside if-thens)
continue            (go to the start of the loop. used in if-thens)

Primitive Terminology

v
variable
d
dbref
i
int (boolean)
s
string
a
address (word)

Syntax

( ... )                                 commments
:                                       begin user-def word
;                                       end user-def word
var <VARNAME>                           variable declaration
lvar <VARNAME>                          local variable declaration.
public <FUNCNAME>                       declares a function public.

checkargs       ( s -- )           checks stack against 's' arg. desc.

if              ( i -- )
else            ( -- )
then            ( -- )

begin           ( -- )             defines the beginning of loops.
while           ( i -- )           break out of loop if value is false
break           ( -- )             break out of loop.
continue        ( -- )             jump to beginning of loop.
until           ( i -- )           ends begin-until. repeats if false.
repeat          ( -- )             ends begin-repeat. jumps to begin.

jmp             ( a -- )           jumps execution to given address.
exit            ( -- )             exit the current subroutine.
abort           ( s -- )           stop MUF prog w/ given error mesg.
execute         ( a -- ??? )       call a given subroutine by address.
call            ( d -- ??? )       call remote program
             or ( d s -- ??? )     call public function in remote prog

preempt         ( -- )             stops multitasking.
background      ( -- )             starts multitasking, no blocking.
foreground      ( -- )             starts multitasking, blocking user
                                    input for that user.

sleep           ( i -- )           pause the program for i seconds
fork            ( -- i )           forks off BG muf process.  Returns
                                    pid to parent and 0 to child.
queue           ( i d s -- i )     queue event to run prog d after i
                                    seconds with s on the stack.
                                    Returns pid of queued process.
kill            ( i -- )           kills process of given pid.
ispid?          ( i -- i )         processID -- process_exists?

pop             ( x -- )
dup             ( x -- x x )
swap            ( x y -- y x )
over            ( x y -- x y x )
rot             ( x y z -- y z x )
rotate          ( ni ... n1 i -- n(i-1) ... n1 ni )
pick            ( ni ... n1 i -- n1 ni )
put             ( ni ... n1 x i -- x ... n1 )

!               ( x v -- )              store value x in var v.
                                         value may be any type data
@               ( v -- x )              fetch value x from var v
atoi            ( s -- i )              string --> integer
intostr         ( i -- s )              integer || dbref --> string
dbref           ( i -- d )              integer --> dbref
int             ( x -- i )              VAR || object --> integer
variable        ( i -- v )              integer --> VAR ref

+ - * / %       ( i1 i2 -- i )
< > = <= >=     ( i1 i2 -- i )
strcmp,
   stringcmp    ( s1 s2 -- i )          strcmp == case sens.
stringpfx       ( s1 s2 -- i )          return 0 if s2 is prefix of s1
strncmp         ( s1 s2 n -- i )        compares only n letters
number?         ( s -- i )
dbcmp           ( d1 d2 -- i )
and  or         ( i1 i2 -- i )
not             ( i -- i' )

strlen          ( s -- i )
strcat          ( s1 s2 -- s )
instr           ( s1 s2 -- i )          finds s2 in s1.  0 if !found
strcut          ( s i -- s1 s2 )        cuts string at pos. i
explode         ( s1 s2 -- ... i )      s2 is the partition, len >0
subst           ( s1 s2 s3 -- s )       string, replacement, tobesub
pronoun_sub     ( d s -- s' )           does % subs a la osucc/ofail

read            ( -- s )
notify          ( d s -- )              player, message
notify_except   ( d1 d2 s -- )          place, player, message
notify_exclude  (s dn..d1 i dr-- )     Send s to all players in room
                                        dr except for the i players
                                        listed in d1 through dn.

pennies         ( d -- i )
addpennies      ( d i -- )              player, pennies
random          ( -- i )

getpropval      ( d s -- i )            zero if none
getpropstr      ( d s -- s )            "" if none
addprop         ( d s1 s2 i -- )        ignores i unless s2 is ""
remove_prop     ( d s -- )

desc, name, succ,
fail, drop, osucc,
ofail, odrop:           ( d -- s )      retrieve message

setname, setdesc,
setsucc, setfail,
setdrop, setosucc,
setofail:               ( d s -- )      set message

player?, thing?,
room?, program?,
exit?, ok?:             ( d -- i )      boolean

location                ( d -- d' )
owner                   ( d -- d' )
moveto                  ( d1 d2 -- )    moves d1 to d2
set                     ( d s -- )      object, string (flag)
flag?                   ( d s -- i )    object, string -- boolean
mlevel                  ( d -- i )      object -- mucker level.
match                   ( s -- d )      thing, dbref (#-1 = NOTHING,
                                        #-2 = AMBIGUOUS, #-3 = HOME)
rmatch                  ( d s -- d )    object, thing, dbref
part_pmatch             ( s -- d )      partial name -- dbref
copyobj                 ( d -- d' )     returns dbref of new object
contents                ( d -- ... i )  returns stack of dbrefs and i

time            ( -- i i i)        seconds, minutes, hours
date            ( -- i i i)        monthday, month,  year
systime         ( -- i )           system time in secs since
                                    00:00 1/1/70 GMT
timesplit       ( i -- i8 ... i1)  sec, m, hr, dy, mnth, yr, wkdy, yrdy
timefmt         ( s i -- s )       format, systime -- timestring
gmtoffset       ( -- s )           seconds offset from GMT time.

setlink         ( d d -- )         object, dest
setown          ( d d -- )         object, newowner
newobject       ( d s -- d )       location, name  -- new objref
newroom         ( d s -- d )       parent, name  -- new objref
newexit         ( d s -- d )       attached-to, name  -- new objref
recycle         ( d -- )           item to recycle
stats           ( d -- i7 ... i1)  owner -- totalowned, #rooms, #exits,
                                          #things, #programs, #players,
                                          #garbage.

int?            ( ? -- i )         is top stack item an integer?
string?         ( ? -- i )         is top stack item a string?
dbref?          ( ? -- i )         is top stack item a dbref?
nextprop        ( d s -- s )       object, propname -- next propname
propdir?        ( d s -- i )       object, propname--is it a propdir?

awake?          ( d -- i )         player -- number of connections
online          ( -- dN ... d1 N ) all connected players w/ count
concount        ( -- i )           # of connections to the server
condbref        ( i -- d )         connection number -- player
conidle         ( i -- i )         conn. # -- idle time in secs
contime         ( i -- i )         conn. # -- online time in secs
conhost         ( i -- s )         conn. # -- hostname
conboot         ( i -- )           connection number
connotify       ( i s -- )         connection number, string
condescr        ( i -- i )         connection# -- descriptor#
descrcon        ( i -- i )         descriptor# -- connection#
nextdescr       ( i -- i )         descriptor# -- next descriptor#
descriptors     ( d -- ix..i1 i )  plyr -- descriptors... count

bitor           ( i i -- i )       int, int -- bitwise or result
bitxor          ( i i -- i )       int, int -- bitwise exclusive-or
bitand          ( i i -- i )       int, int -- bitwise and result
bitshift        ( i i -- i )       int, #bits -- bitwise shift

version         ( -- s )           Version String
depth           ( -- i )           stack depth
dbtop           ( -- d )           top of database + 1 item.
prog            ( -- d )           this program's dbref
trig            ( -- d )           a secure form of trigger @
caller          ( -- d )           the program that called this one.

force           ( d s -- )         player, force string
localvar        ( i -- l )         local var num -- localvar

locked?         ( d d -- i )       player, object -- is object locked?
getlockstr      ( d -- s )         object -- lockstring
setlockstr      ( d s -- i )       object, lockstr -- successful?

toupper         ( s -- s )         uppercases all letters in the string
tolower         ( s -- s )         lowercases all letters in the string
instring        ( s s -- i )       case insensitive version of instr
rinstring       ( s s -- i )       case insensitive version of rinstr
striplead       ( s -- s )         Strip leading spaces from string.
striptail       ( s -- s )         Strip tail spaces from string.
strip           ( s -- s )         Basically 'striplead striptail'
unparseobj      ( d -- s )         object -- name-and-flags-string.
smatch          ( s s -- i )       string, smatch string -- matched?
envpropstr      ( d s -- d s )     startobj, propname -- obj strval

Libraries

How to use a library

  1. Use "@register lib" to list what libraries exist.
  2. Use "@view $lib/<libraryname>" to list the docs on that library.
  3. When you've found the library and the function you want, then all you have to do in your program is, at the beginning of it,
    $include $lib/<libraryname>
    

    then just use the function name to invoke it later in your program and it will run as if it were a function in your program.

How to make a library

  1. Create a program with several useful generic subroutines.
  2. Document those subroutines in a commented out header in the prog.
  3. "@set <program>=_docs:<command>" to list those DOCS you made.
  4. Make sure that all the functions are declared PUBLIC.
  5. Make sure the program is set LINK_OK.
  6. Globally register the program with the @register command with a prefix of "lib/". ie: "@reg lib-strings=lib/strings"
  7. Set up the interface for each function on the program. To do this, you will need to set properties on the program in the form
    _defs/<callname>:"$<libname>" match "<funcname>"
    

    call where <callname> is the name that you want to have people use to invoke it in their programs, <libname> is the registered name you gave it (ie: lib/strings), and <funcname> is the actual name of the function in the program. Example:
    @set lib-strings=_defs/.split:"$lib/strings" match "split" call
    

  8. You're done!

Return to the TinyMUCK Page

Page created by Bolo, and maintained by Tugrik d'Itichi.
Comments/Questions/Flames to: FMPages@furry.com