Message Parsing Interpreter
From Wikipedia, the free encyclopedia
The Message Parsing Interpreter (MPI for short, not to be confused with the Message Passing Interface) is a Lisp-like programming language based on text replacement that is used on Fuzzball MUCK servers, starting with version 2.2fb5.00. It is generally considered easier to learn and use than MUF, and enjoys a large popularity among Fuzzball MUCK users.
When online, the command MPI CATEGORY provides a listing of the available MPI topics arranged by function. The most common use for MPI is for report generation and formating text strings, however it does support the creation of macros, conditional logic, and looping for a limited number of iterations.
Contents |
[edit] Command Structure
MPI could be viewed as a form of markup language as instructions are encapsulated within bracket marks to differentiate them from regular text. The MPI command is specified first, followed by a colon, and then command arguments, separated by commas. If one of the arguments is a string that contains a comma, it is escaped by using a backslash or the {lit:} (for literal) command.
{ command : argument1, argument2 }
Commands can be nested, taking the place of one or more arguments within the parent command to form more complex code:
{tell: {name:me} just looked at {name:this}., {owner:this}}
[edit] Hello World
The standard "Hello World" program would look like this:
{tell:Hello World, me}
[edit] More complex substitution
More complex code in MPI may become difficult to read. Some examples: This sequence informs the user of the next database save:
Next scheduled save will occur at {convsecs:{add:{prop:_sys/dumpinterval,#0}, {prop:_sys/lastdumptime,#0}}}\, being in {ltimestr:{subt:{add: {prop:_sys/dumpinterval,#0},{prop:_sys/lastdumptime,#0}},{secs}}}
Next, a loop of a fixed range of iterations that generates random text. A property named ascii on the same object would need to be loaded with the ASCII characters from the 32-127:
{null:{store:,launchcode,this},{if:{&arg},{store:{min:60,{max:1,{&arg}}},count,this}, {store:{dice:60},count,this}},{while:{not:{eq:-1,{store:{subt:{prop:count,this},1},count,this}}}, {store:{prop:launchcode,this}{midstr:{prop:ascii,this},{store:{dice:94},tempcharval,this}, {prop:tempcharval,this}},launchcode,this}}}
Combining MPI with the MUCK properties system can allow for a loop with an indefinite number of iterations. One might place this inside a property named delayloop and then {eval} it:
{delay:{prop:seconds,this},{lit:Hello World{null:{if:{awake:me},{eval:{prop:delayloop,this}}}}}}