1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-13 15:27:28 +00:00
PDP-10.its/doc/mudman/muddle.order
2018-05-15 19:36:36 +02:00

7907 lines
215 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

MUDDLE F/SUBRS: (for MUDDLE 55) PDL/SWG 3/8/79
The following is a very brief description of all the
primitives currently available in MDL. These descriptions are in
no way to be considered a definition of the effects or values
produced by the primitives. They just try to be as complete and
as accurate as is possible in a single-statement description.
However, because of the complexity of most primitives, many
important defaults and restrictions have been omitted.
*: Multiplication of fixes and floats.
Object-type: SUBR
Category: ARITHMETIC
* (Multiply) takes any number of FIXes or FLOATs, and multiplies
them together, returning the result. If any of the arguments are
FLOATs, the result will be FLOAT. If no argument is given, * returns
1, if one argument is given, * returns that argument.
* will given an arithmetic overflow error (unless disabled by OVERFLOW)
if the word size of the PDP-10 is exceeded.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT>
"TUPLE" <TUPLE [REST <OR FIX FLOAT>]>)
(Optional)
Tuple of arguments -- FIXes and FLOATs
Returns -- FIX or FLOAT, floating is contagious.
Example: <* 1 2.0>
2.0
Floating is contagious.
+: Add fixes and floats.
Object-type: SUBR
Category: ARITHMETIC
+ adds together any number of FIXes or FLOATs, returning the
result. Floating is contagious, as in all arithmetic SUBRs. If no
argument is given, + returns 0, if one argument, + returns the argument.
+ will give an arithmetic overflow error (unless disabled by
OVERFLOW) if the result (or an intermediate result) exceeds the word
size of the PDP-10.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT>
"TUPLE" <TUPLE [REST <OR FIX FLOAT>]>)
(Optional)
Tuple of arguments -- FIXes and FLOATs.
Returns -- FIX or FLOAT, sum of arguments.
Example: <+ !<SET FOO (1 2 3)!>>
6
Sum of elements of list.
-: Subtract fixes and floats.
Object-type: SUBR
Category: ARITHMETIC
- takes any number of fixes or floats and subtracts from the first
one all of the remaining ones. If no argument is given, returns 0. If
one argument is given, returns its negation. Floating is contagious,
and - will give an arithmetic overflow error (unless disabled by OVERFLOW)
if the word size of the PDP-10 is exceeded.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT>
"TUPLE" <TUPLE [REST <OR FIX FLOAT>]>)
(Optional)
Tuple of arguments -- FIXes and FLOATs.
Returns -- The FIX or FLOAT result of the subtraction.
Example: <- 5 3 2>
0
All but first argument are subtracted from first.
/: Divide fixes and floats.
Object-type: SUBR
Category: ARITHMETIC
/ divides any number of fixes and floats. The first is divided
successively by each of the remaining arguments. If no arguments are
given, returns 1. If one argument is given, returns its reciprocal.
Floating is contagious. If the arguments are FIX, the result is
always completely fixed point division, with no rounding.
/ will give an arithmetic overflow error (unless disabled by OVERFLOW)
if the word size of the PDP-10 is exceeded.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT>
"TUPLE" <TUPLE [REST <OR FIX FLOAT>]>)
(Optional)
Tuple of arguments -- FIXes and FLOATs
Returns -- FIX or FLOAT quotient.
Example: </ 10 7 2.0>
0.5
First division gave 1, then .5 after second.
0?: Tests if a fix or float is zero.
Object-type: SUBR
Category: ARITHMETIC
0? tests a FIX or FLOAT to see if it is equal to zero. If it is
not, a FALSE is returned. If it is, T is returned.
Argument:
Template: #DECL ("VALUE" <OR FALSE 'T> <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT.
Returns -- FALSE if not equal to 0, T if equal to zero.
Example: <0? 1>
#FALSE ()
Trivial, isn't it?
1?: Tests if a fix or float is equal to one.
Object-type: SUBR
Category: ARITHMETIC
1? takes a fix or float and tests its equality to one. If it is
not equal, returns FALSE. If it is equal, returns T.
Argument:
Template: #DECL ("VALUE" <OR FALSE 'T> <OR FIX FLOAT>)
Argument 1 -- FIX or FLOAT to test.
Returns -- FALSE if not 1, T if 1.
Example: <1? 1.0>
T
Works for floats, too.
1STEP: Put a PROCESS in One-step mode
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: RESUME, FREE-RUN
1STEP puts a PROCESS in single step mode. It takes as argument
a PROCESS. When RESUMEd, the PROCESS will be in one-step mode, running
until an EVAL is either entered or left.
The PROCESS which executed the 1STEP will then be RESUMEd. It
will be passed a tuple. If EVAL was being entered, the tuple will
contain the ATOM EVLIN and the arguments to EVAL. If EVAL was being
left, the tuple will contain the ATOM EVLOUT and the result of the
evaluation.
The PROCESS will remain in 1STEP mode until FREE-RUN is done on
it. RESUME will thus stop at each EVAL until then.
Argument:
Template: #DECL ("VALUE" PROCESS PROCESS)
Argument 1 -- A PROCESS to put in one-step mode.
Returns -- The PROCESS.
Example: <1STEP .FOO>
returns #PROCESS i
<RESUME .FOO>
[EVLIN <+ 1 1>]
<RESUME .FOO>
[EVLOUT 2]
Two successive steps of the process.
==?: Test for physical identity of two objects.
Object-type: SUBR
Category: PREDICATE
Reference: =?
==? tests two objects for physical identity. For ==? to return
T (true), the two objects must have the same identical type-value pair.
For example, two STRINGs typed in from the console will not be ==?, but
two ATOMS, FIXes, or nil LISTs will be.
If the two objects are not the same, ==? returns FALSE.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY ANY)
Argument 1 -- Any object.
Argument 2 -- Another object.
Returns -- T if the two objects are the same, FALSE otherwise.
Example: <==? "FOO" "FOO">
#FALSE ()
These two STRINGs look identical, but are not.
=?: Test for structural identity of two objects.
Object-type: SUBR
Category: PREDICATE
Reference: ==?
=? is a less stringent, but more expensive, test for identity
than ==?. It also takes two objects as arguments, but tests only for
structural identity of the objects, rather than physical identity. If
two objects print the same, they will be =? to each other, except for
numeric fuzz. For example, two STRINGs typed in from the console will
be =? to each other, but not ==?. Any objects that are ==? will also
be =?, and if ==? applies, it should be used. =? is much more
expensive than ==?, in general, as it must test an entire structure
piece by piece.
=? returns T if the objects are structurally identical, and FALSE if
they are not.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY ANY)
Argument 1 -- Any object.
Argument 2 -- Any other object.
Returns -- T if the arguments are structurally equal, FALSE if they
are not.
Example: <=? <SET V <VECTOR 1 2 3>> <EVAL .V>>
T
If the test were ==?, the result would be FALSE.
ABS: Returns the Absolute value of a FIX or FLOAT.
Object-type: SUBR
Category: ARITHMETIC
Returns the absolute value of its argument.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT to take the absolute value of.
Returns -- A FIX or FLOAT guaranteed non-negative.
Example: <ABS -69105>
69105
Simple SUBR, simple example.
ACCESS: Position channel to given point in file
Object-type: SUBR
Category: I/O
Reference: FILE-LENGTH
ACCESS makes the next character or binary word (depending on
the channel's mode) which will be input from or output to a channel
the (arg2+1)st one from the beginning of the file.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL FIX)
Argument 1 -- the channel, open (not in "PRINT" mode) to DSK, USR, etc.
Argument 2 -- where to point for next i/o
Returns -- the channel
Example: <ACCESS .IN 0>
starts reading again from beginning of file
ACTIVATE-CHARS: Set or inspect interrupt characters for console typing (TENEX only)
"VALUE" STRING
"OPTIONAL" STRING
AGAIN: Restart a FUNCTION, PROG, or REPEAT
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: FUNCTION, PROG, REPEAT
AGAIN takes one argument: an ACTIVATION. It means 'start doing
this again', where 'this' is specified by the ACTIVATION. Specifically,
AGAIN causes EVAL to return to where it started working on the body of
the FUNCTION, REPEAT, or PROG in the application specified by the
ACTIVATION. The application is not re-evaluated completely: no
rebinding of variables is done.
In a PROG or REPEAT, where there is always a defined ACTIVATION,
AGAIN with no arguments defaults to AGAIN of the top-level ACTIVATION
in the PROG or REPEAT.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" ACTIVATION)
(Optional)
Argument 1 -- The ACTIVATION to restart. If not given, that of the
immediately surrounding PROG or REPEAT is used.
Returns -- Nothing, restarts the ACTIVATION.
Example: <PROG ((X <ILIST 20 '<MOD <RANDOM> 10>>))
<COND (<G=? <+ !.X> 100>
<SET X <REST .X>>
<AGAIN>)
(ELSE <PRINT <LENGTH .X>>)>>
How many elements must be rested off before total of rest is less
than fifty? This could just as easily be a REPEAT, where the AGAIN is
implicit.
ALLTYPES: Return the MUDDLE type VECTOR
Object-type: SUBR
Category: TYPE-MANIPULATION
ALLTYPES returns the user a pointer to the MUDDLE type vector.
Note that this is the real, honest-to-God type vector and that if you
clobber it you will clobber your MUDDLE, probably beyond repair.
The type vector contains ATOMs whose names are the types that are
currently defined to exist in the MUDDLE in which the ALLTYPES was
executed.
Argument:
Template: #DECL ("VALUE" <VECTOR [REST ATOM]>)
Returns -- The MUDDLE type VECTOR.
Example: <ALLTYPES>
Only possible example.
AND: Logical AND of its arguments.
Object-type: FSUBR
Category: PREDICATE, PROGRAM-CONTROL
Reference: COND, OR, AND?
AND is an FSUBR that evaluates its arguments, one by one, until
either one of them returns a FALSE or it runs out of arguments.
The fact that it is an FSUBR means that it can be used as a
miniature COND. A construct of the form <AND preconditions thing> will
allow 'thing' to be executed only if 'preconditions' is true. In com-
bination with OR, fairly powerful constructs can be generated.
AND takes any number of arguments, returning either the result of
its last evaluation (T if no arguments were given) or the FALSE that
caused it to complete.
Argument:
Template: #DECL ("VALUE" <OR FALSE ANY> "ARGS" LIST)
List of unevaluated arguments -- ANY evalable objects.
Returns -- Terminating FALSE or terminating non-FALSE.
Example: <AND <ASSIGNED? X> .X>
This construct attempts to take LVAL of X only if X is assigned, thus
avoiding the possibility of an ERROR.
AND?: Logical AND of its arguments, evaluated at call time
Object-type: SUBR
Category: PREDICATE, PROGRAM-CONTROL
Reference: OR?, AND, MAPF, MAPR
AND? is a SUBR that looks at its arguments, one by one, until
either one of them is a FALSE or it runs out of arguments.
The fact that it is a SUBR means that it can be used as a
first argument to MAPF or MAPR.
AND takes any number of arguments, returning either
its last argument (T if no arguments were given) or the FALSE that
caused it to complete.
Argument:
Template: #DECL ("VALUE" <OR FALSE ANY> "TUPLE" TUPLE)
Tuple of evaluated arguments -- ANY objects.
Returns -- Terminating FALSE or terminating non-FALSE.
Example: <MAPF ,AND? <FUNCTION (T) <G? .T 0>> .VECTOR>
Are all elements of this vector positive?
ANDB: Bitwise logical AND
Object-type: SUBR
Category: BIT-TWIDDLING, LOGICAL
Reference: EQVB, ORB, XORB
ANDB takes any number of objects of Primtype WORD, and returns
a WORD containing the bitwise logical AND of the arguments.
Argument:
Template: #DECL ("VALUE" WORD
"TUPLE" <TUPLE [REST <PRIMTYPE WORD>]>)
Tuple of arguments -- Objects of primtype WORD to be ANDed together.
Returns -- A WORD containing the bitwise AND of the arguments.
Example: <ANDB 511 4226793183>
#WORD *000000000337*
Primarily useful for getting fingers directly in the bits.
APPLICABLE?: APPLICABLE? tests if its argument may be APPLYed.
Object-type: SUBR
Category: PREDICATE
APPLICABLE? takes a single object as argument, and returns T if
that argument may be APPLYed. That is, it may be the first element of
a FORM. Thus, an object of type FIX is applicable, as well as the more
obvious SUBR, FSUBR, RSUBR, FUNCTION, and so on.
If its argument is not applicable, returns FALSE.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY)
Argument 1 -- ANY object to be tested for applicability.
Returns -- T if applicable, #FALSE() if not.
Example: <APPLICABLE? 69>
T
NTH makes this the case.
APPLY: Apply the first arg to the rest of them.
Object-type: SUBR
Category: PROGRAM-CONTROL
The first argument is applied to the rest of the arguments.
The manner in which the application is accomplished, is determined
by the TYPE of the first arg as follows:
FIX: call ,NTH with the 2nd arg and 1st arg.
SUBR: call the Subr with the rest of the args.
RSUBR or RSUBR-ENTRY: call the Rsubr with the rest of the args and
also compare them with the Rsubr's DECLs.
FUNCTION: Bind the Atoms in the parameter list of the Function
to the rest of the args of the APPLY matching one-to-one. Then
Bind the unsatisfied OPTIONALs, if any, and the EXTRAs to the
EVAL of their defaults. As each of the above Bindings is done,
the DECL for that variable is also checked. Now the elements of
the body of the Function are EVALed sequentially.
The result of the evaluation of the last element of the body
is the result of the Function application. It is checked against
the VALUE DECL of the Function, and returned.
CLOSURE: First Bind the Closure variables to their indicated
values. Then APPLY the Function part of the Closure as above.
Others: ERROR NON-APPLICABLE-TYPE
The manner in which the application is done for a particular Type can
be changed through the use of the subr APPLYTYPE.
Argument:
Template: #DECL ("VALUE" ANY APPLICABLE "TUPLE"
<TUPLE [REST ANY]>)
Argument 1 -- The object to apply to the rest of the arguments.
Tuple of arguments -- The arguments the first argument is to be
applied to.
Returns -- The result of applying the first argument to the rest.
Example: <APPLY <GET <TYPE .ITEM> ANALYSIS-ROUTINE> .ITEM>
This code will call a routine to process ITEM. The routine called
depends solely on the TYPE of ITEM. Therefore this represents the
idea of a dispatch table.
APPLYTYPE: Change or examine the way a TYPE is APPLYed
Object-type: SUBR
Category: TYPE-MANIPULATION, PROGRAM-CONTROL
Reference: APPLY, EVALTYPE
Changes the way a specific type is APPLYed, by either mapping
it into another type, or giving an explicit method via an APPLICABLE.
If a type is given, the type being changed will be APPLYed in the
same manner as that type.
If an APPLICABLE is given, it should take at least one argument,
which will be the object being APPLYed, and the rest of the arguments
will be what it is being APPLYed to. Whatever the APPLICABLE returns
will be the result of the APPLICATION. If ,APPLY is given, the type
will hereafter receive no special treatment in application to args.
If no second arg is given, APPLYTYPE returns the last second arg
given for this type, or #FALSE () if the type is receiving no special
treatment in application.
Argument:
Template: #DECL ("VALUE" <OR ATOM APPLICABLE FALSE> ATOM "OPTIONAL"
<OR ATOM APPLICABLE>)
Argument 1 -- The type whose APPLYTYPE to change or examine.
(Optional)
Argument 2 -- A TYPE (which means 'Apply like this type'), or an
APPLICABLE (meaning 'use this when you APPLY this type').
Returns -- The TYPE which was changed or, if no second arg, the special
treatment this TYPE is receiving, if any.
Example: <APPLYTYPE
LIST
'<FUNCTION (X "TUPLE" Y)
<REPEAT ((X .X))
<COND
(<EMPTY? .Y> <RETURN .X>)
(<TYPE? <1 .Y> FIX>
<SET X
<NTH .X <1 .Y>>>)
(<ERROR>)>>>>
Make application of a LIST be like NTH
<(1 2 3 (4 5 6)) 4 2>
5
ARGS: Return the argument Tuple of an environment
Object-type: SUBR
Category: UTILITY, PROGRAM-CONTROL
Reference: FRAME, FUNCT, LEGAL?
Takes an environment and returns the argument TUPLE of the
top-level FRAME in that environment. The argument must be LEGAL? for
it to work.
Note that the argument Tuple returned will become illegal once
the stack is popped past it.
Argument:
Template: #DECL ("VALUE" TUPLE
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- The environment whose args tuple we want.
Returns -- The argument Tuple of the top FRAME in the environment we passed as arg 1.
Example: <* 3 <+ a 1>>
Gives an ERROR, first arg wrong type.
<ARGS <FRAME <FRAME>>>
[a 1]
The arguments of the frame that caused the ERROR.
ASCII: Convert Ascii codes to characters and back
Object-type: SUBR
Category: DATA-HANDLING
ASCII returns a CHARACTER given its 'ASCII' code (as a FIX)
or returns the ASCII code given the CHARACTER.
Argument:
Template: #DECL ("VALUE" <OR CHARACTER FIX> <OR CHARACTER FIX>)
Argument 1 -- A CHARACTER or FIX to be transformed into the other.
Returns -- The opposite type to its argument.
Example: <ASCII 65>
<ASCII !\A>
The first returns the character A,
the second *101*.
ASSIGNED?: Is an Atom locally assigned ?
Object-type: SUBR
Category: PREDICATE, IDENTIFIER
Reference: BOUND?
This routine is used to test if a particular Atom is locally
assigned, or in other words if it has a local value, in a given
environment, default the current one. It does cause the activation of
any read monitors on that local value.
It returns T if the ATOM has a local value, #FALSE () otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ATOM "OPTIONAL"
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- An ATOM to test.
(Optional)
Argument 2 -- the environment in which to make the test
Returns -- T if the ATOM has a local value, #FALSE () otherwise.
Example: <SET FOO "ANYTHING">
<ASSIGNED? FOO>
This will return the Atom T, since FOO does have a local value.
<UNASSIGN FOO>
<ASSIGNED? FOO>
This will return #FALSE (), since the Atom FOO has no local value.
<PROG (FOO) <ASSIGNED? FOO>>
This will also return #FALSE (), since FOO still does not have a local value
ASSOCIATIONS: Access the Association chain.
Object-type: SUBR
Category: ASSOCIATION
Reference: NEXT, AVALUE, INDICATOR, ITEM
ASSOCIATIONS gives the user access to the association chain in
much the same way as FRAME gives access to the stack. ASSOCIATIONS
returns the first association triad (item, indicator, value) in the
chain, as a type ASOC, which looks, but doesn't behave like, a LIST.
An ASOC may be passed to ITEM, INDICATOR, or AVALUE to retrieve
the elements of a triad, or to NEXT to retrieve the next association
in the chain.
Argument:
Template: #DECL ("VALUE" <OR ASOC FALSE>)
Returns -- The first association in the association chain, FALSE if none exist.
Example: <ASSOCIATIONS>
Only possible example.
AT: Get a locative to a position in a Structure
Object-type: SUBR
Category: DATA-HANDLING
Reference: IN, SETLOC
Returns a locative to a position in a Structure (a VECTOR, LIST,
UVECTOR, STRING, etc.).
Takes a structure, and an optional FIX (default 1), like NTH or
REST, returning the locative.
Argument:
Template: #DECL ("VALUE" LOCATIVE STRUCTURED "OPTIONAL" FIX)
Argument 1 -- A Structured object.
(Optional)
Argument 2 -- A FIX, default 1, the position in the structure.
Returns -- A Locative to the position in the structure.
Example: <SET FOO (1 2 3)>
<SET Y <AT .FOO 3>>
Get locative
<SETLOC .Y 5>
Change structure
.FOO
(1 2 5)
Changed
ATAN: Arc-tangent of a tangent
Object-type: SUBR
Category: ARITHMETIC
Reference: SIN, COS
Returns, in Radians, the angle whose tangent is the argument.
Note that all useful trig. functions may be derived using ATAN, COS,
and SIN.
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- The tangent of some angle.
Returns -- The angle whose tangent is argument 1.
Example: <ATAN </ <SIN .FOO> <COS .FOO>>>
Will equal .FOO
ATOM: Create an ATOM not on any OBLIST
Object-type: SUBR
Category: DATA-HANDLING, IDENTIFIER
ATOM creates the ATOM with PNAME its argument (a STRING). The
resulting ATOM is not on any OBLIST, and thus has trailer !-#FALSE().
Argument:
Template: #DECL ("VALUE" ATOM STRING)
Argument 1 -- The string which is the pname of the atom.
Returns -- The newly created ATOM.
Example: <ATOM "FOO">
FOO!-#FALSE() -- New ATOM not on any oblist.
AVALUE: Return the value part of an Association triad
Object-type: SUBR
Category: ASSOCIATION
Reference: ASSOCIATIONS, NEXT, ITEM, INDICATOR,
GETPROP, GET
Given an ASOC, as returned by ASSOCIATIONS or NEXT, returns the
value part of the ASOC triad.
This is equivalent to <GETPROP item indicator> but uses the ASOC
instead of the item and indicator.
Argument:
Template: #DECL ("VALUE" ANY ASOC)
Argument 1 -- An ASOC whose value field to get.
Returns -- The value field of the ASOC.
Example: <PUTPROP FOO BAR BLECH>
<AVALUE <ASSOCIATIONS>>
BLECH
<GETPROP FOO BAR>
BLECH
If this association is the most recent one made, the last two are equivalent.
BACK: Replace items RESTed off of a structure
Object-type: SUBR
Category: DATA-HANDLING
Reference: REST
BACK replaces some items removed from a non-list stucture by
RESTing, that is, it moves the pointer to the structure back up the
structure.
It takes two arguments, the structure, and a fix which specifies
how many elements to return, and defaults to 1. An ERROR is generated
if there are not that many elements RESTed off the structure.
Argument:
Template: #DECL ("VALUE" <OR VECTOR UVECTOR STRING TEMPLATE>
<PRIMTYPE <OR VECTOR UVECTOR STRING TEMPLATE>> "OPTIONAL"
FIX)
Argument 1 -- The structure to return elements to.
(Optional)
Argument 2 -- Number of elements to return, default is 1.
Returns -- The structure with the elements returned.
Example: <SET X
<REST [A B C D E]
3>>
[D E]
<BACK .X 1>
[C D E]
.X, of course, is not changed by the BACK.
BIND: Execute sequential expressions without providing default activation
Object-type: FSUBR
Category: PROGRAM-CONTROL
Reference: PROG, RETURN, AGAIN
This FSUBR is identical to PROG (q.v.), except that it
does not bind LPROG\ !-INTERRUPTS, and therefore RETURNs and AGAINs will
not default to it. This could prove useful to MACRO writers.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" <LIST ATOM LIST DECL ANY>)
Optional argument 1 -- An ATOM, to bind the activation of the BIND to.
Argument 2 -- A parameter LIST.
Optional argument 3 -- The DECL of the BIND.
Remainder of arguments -- At least one object, to be sequentially evaled.
Returns -- The last thing evaled in the BIND, or the argument to a
RETURN within the BIND.
Example: <BIND ((C <OPEN "READ" "FOO BAR">))
<COND (.C <FOO> <CLOSE .C>)>>
This will FOO only if the file FOO BAR exists.
BITS: Create a byte pointer.
Object-type: SUBR
Category: BIT-TWIDDLING
Reference: GETBITS, PUTBITS
BITS creates a byte pointer to a word. It takes two arguments,
the second optional. The first is the width of the byte in bits, the
second the right edge of the byte (counting from the least significant
bit of the word), which defaults to 0, meaning the rightmost bit.
A BITS is used with GETBITS and PUTBITS to get and put bytes from
objects of primtype WORD.
Argument:
Template: #DECL ("VALUE" BITS FIX "OPTIONAL" FIX)
Argument 1 -- A FIX specifying the size of the byte pointed at.
(Optional)
Argument 2 -- A FIX specifying the right edge of the byte, default 0.
Returns -- A BITS, which may be used with GETBITS and PUTBITS to work
with bytes of actual machine words.
Example: <BITS 36>
Points to a full PDP-10 word
<BITS 7 15>
Points to third Ascii character position in word
BLOAT-STAT: Get internal storage statistics
Object-type: SUBR
Category: UTILITY
Reference: BLOAT
BLOAT-STAT fills its argument uvector with information about
the state of storage. The first 8 elements tell the number of GCs
attributable to various causes; the other 19 tell the sizes of various
areas of storage. For details see the manual, SYS.11.01.
Argument:
Template: #DECL ("VALUE" <UVECTOR [27 FIX]>
"OPTIONAL" <UVECTOR [27 ANY]>)
(Optional)
Argument 1 -- a uvector of length 27 at least
Returns -- arg1 or a gratis uvector of storage statistics
Example: <BLOAT-STAT>
If no arg, a uvector is provided gratis.
BLOAT: Temporarily grow the garbage collected space.
Object-type: SUBR
Category: ENVIRONMENT
Reference: GC
BLOAT provides a mechanism for temporary growth of the MUDDLE
garbage collected space as well as various stacks and special data
structures.
BLOAT takes from 0 to 15 arguments all of type FIX. The args are
described below in the Argument template field of this abstract.
Note that unless more than seven arguments are given, BLOAT will
not necessarily make any permanent change in the amount of space in
a MUDDLE -- the new space allocated may go away in the next following
GC if it is not filled.
BLOAT always returns the current number of free words.
Argument:
Template: #DECL ("VALUE" FIX "OPTIONAL" FIX FIX FIX FIX FIX FIX FIX FIX FIX
FIX FIX FIX FIX FIX FIX)
(Optional)
Argument 1 -- Free space desired.
Argument 2 -- Main stack space desired.
Argument 3 -- Top level local slots desired.
Argument 4 -- Global value slots desired.
Argument 5 -- New type slots desired.
Argument 6 -- Non garbage collected words needed (STORAGE).
Argument 7 -- Auxiliary stack space desired (only useful for reading
large strings).
Argument 8 -- Minimum space to get in all future GCs.
Argument 9 -- top-level local slots to add on future expansions
Argument 10 -- global-value slots to add on future expansions
Argument 11 -- type slots to add on future expansions
Argument 12 -- words of STORAGE to add on future expansions
Argument 13 -- words reserved for pure storage, if possible
Argument 14 -- most desirable size for auxiliary stack
Argument 15 -- most desirable size for main (control) stack
Example: <BLOAT 10000 10000 100 100 100>
Get lots of free and stack space.
BLOCK: Change the current OBLIST path.
Object-type: SUBR
Category: ENVIRONMENT
Reference: ENDBLOCK
BLOCK changes the current OBLIST path by pushing the binding
of the ATOM OBLIST, and rebinding it to the arg of BLOCK.
BLOCK takes as argument a LIST of OBLISTs, of which one is in
most cases the ROOT OBLIST. An application of ENDBLOCK will return
the path to its previous state.
Argument:
Template: #DECL ("VALUE" <OR OBLIST <LIST [REST <OR OBLIST 'DEFAULT>]>>
<OR OBLIST <LIST [REST <OR OBLIST 'DEFAULT>]>>)
Argument 1 -- The new LIST of OBLISTs to become the new path.
Returns -- Its argument.
Example: <BLOCK (<MOBLIST <PARSE <STRING !\I .FOO>> 23>
<ROOT>)>
This is approximately what happens when the function RPACKAGE is
invoked. It creates a new path containing the internal oblist of the
RPACKAGE plus the ROOT.
BOUND?: Is an Atom locally bound ?
Object-type: SUBR
Category: PREDICATE, IDENTIFIER
Reference: ASSIGNED?
This routine is used to test if a particular Atom is locally
bound, or in other words if it either has a local value or else has a
local binding which has not yet been assigned, in a given environment,
default the current one. It does cause the activation of any read
monitors on that local binding.
It returns T if the ATOM is locally bound, #FALSE() otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ATOM "OPTIONAL"
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- An ATOM which may or may not have a local binding.
(Optional)
Argument 2 -- the environment in which to perform the test
Returns -- T if the ATOM has a local binding, #FALSE() otherwise.
Example: <SET FOO "ANYTHING">
<BOUND? FOO>
This will return the Atom T, since FOO does have a local binding.
<UNASSIGN FOO>
<BOUND? FOO>
This will return #FALSE (), since the Atom FOO has no local binding.
<PROG (FOO) <BOUND? FOO>>
However this will also return the Atom T, since FOO does have a local
binding.
BREAK-SEQ: Stack an object for another PROCESS to EVAL when it is RESUMEd
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: RESUME
Takes an object and a PROCESS, and stacks the object in the PROCESS
such that when RESUMEd, the PROCESS will EVAL it before doing what it
would normally do. It thus 'breaks' the evaluation sequence in the
other PROCESS. Objects are stacked in the new process, and thus the
last BREAK-SEQed will be the first EVALed.
Argument:
Template: #DECL ("VALUE" PROCESS ANY PROCESS)
Argument 1 -- The object to be stacked.
Argument 2 -- The PROCESS to stack it in.
Returns -- The PROCESS in which the object was stacked.
Example: <BREAK-SEQ '<+ 1 1> <RESUMER>>
Give the PROCESS that resumed me something to do.
BUFOUT: Force out a channel's write buffer
Object-type: SUBR
Category: I/O
Reference: OPEN, CLOSE, RESET
BUFOUT forces the buffers of a print channel out. It is used
primarily as insurance against system crashes and other acts of God,
to assure that all of the data created by a process will be output.
It takes and returns a CHANNEL.
Argument:
Template: #DECL ("VALUE" CHANNEL "OPTIONAL" CHANNEL)
(Optional arguments)
Argument 1 -- A print CHANNEL to force buffers from.
Returns -- The CHANNEL.
Example: <BUFOUT .OUTCHAN>
Flush buffers from OUTCHAN.
BYTE-SIZE: Return the size of bytes of a BYTES
Object-type: SUBR
Category: TYPE
Reference: BYTES, IBYTES
BYTE-SIZE returns the size of all the bytes of a BYTES. This
is the number of bits in all FIXes in the BYTES.
Argument:
Template: #DECL ("VALUE" FIX <PRIMTYPE BYTES>)
Argument 1 -- A BYTES
Returns -- A FIX, which is the size of bytes of the BYTES.
Example: <BYTE-SIZE #2 {}>
2
BYTES: Create a BYTES from FIXes
Object-type: SUBR
Category: DATA-HANDLING
Reference: IBYTES
BYTES creates a byte-string with explicit elements. These must be
PRIMTYPE WORDs. They will be ANDBed with the appropriate mask and
concatenated together to form a new BYTES.
Argument:
Template: #DECL ("VALUE" BYTES FIX "TUPLE" <TUPLE [REST <PRIMTYPE WORD>]>)
Argument 1 -- the number of bits in each byte
Tuple of arguments -- PRIMTYPE WORDs, the elements of the new BYTES
Returns -- Newly created BYTES
Example: <BYTES 2 0 1 2 3 4 5 6>
#2 {0 1 2 3 0 1 2}]
CHANLIST: Get list of all open channels.
Object-type: SUBR
Category: I/O, UTILITY
Creates and returns a list of all OPEN channels in a MUDDLE.
The first and second elements of this list are usually the TTY input
and output channels of the MUDDLE.
Argument:
Template: #DECL ("VALUE" <LIST [REST CHANNEL]>)
Returns -- A LIST of all the CHANNELs currently open in a MUDDLE.
Example: <CHANLIST>
Only possible example
CHANNEL: Create a CHANNEL.
Object-type: SUBR
Category: I/O
Reference: OPEN
This SUBR is similar to OPEN, except that it only goes as far as
creating the channel that OPEN would go on to OPEN. Its advantage
is that the CHANNEL returned can be RESET just as though it had once
been open.
It takes the identical arguments as OPEN but does not open the
CHANNEL. For greater detail, see the Abstract of OPEN.
Argument:
Template: #DECL ("VALUE" CHANNEL "OPTIONAL" STRING
"TUPLE" TUPLE)
(Optional)
Argument 1 -- A STRING giving the direction and type of OPEN to not do.
Argument 2 -- STRINGs and/or FIXes giving the specification of the
file to not OPEN.
Returns -- An unOPENed CHANNEL.
Example: <CHANNEL "PRINT" "FOO BAR">
Return an unopened PRINT channel.
CHTYPE: Change the type of a MUDDLE object.
Object-type: SUBR
Category: TYPE-MANIPULATION
Changes the type of a MUDDLE object (or, more exactly, a given
type-value pair). The allowable changes are among types of the same
PRIMTYPE. For example, WORDs may be CHTYPEd to FIXes, but VECTORs may
not be CHTYPEd to LISTs. CHTYPE does not affect any other pointers to
the object that may exist.
Some objects which have the same primtype may not be CHTYPEd to
each other, for example, a VECTOR may not be CHTYPEd to a CHANNEL.
This is because some types (like CHANNEL) are controlled and may be
created only in special ways.
Takes as arguments the object to be CHTYPEd, and an ATOM giving
the name of the type to CHTYPE it to.
Argument:
Template: #DECL ("VALUE" ANY ANY ATOM)
Argument 1 -- Any (or almost any) object.
Argument 2 -- An ATOM which is the name of a type.
Returns -- Argument 1 with its type changed to type argument 2.
Example: <SET X (+ 1 2)>
(+ 1 2)
Create a LIST
<CHTYPE .X FORM>
<+ 1 2>
Returns a FORM
.X
(+ 1 2)
But the original is untouched
CHUTYPE: Change the uniform type of a UVECTOR
Object-type: SUBR
Category: TYPE-MANIPULATION
Reference: UTYPE?
CHUTYPE changes the uniform type (UTYPE) of a UVECTOR. The
types to which the UTYPE may be changed are restricted in the same way
as the changes allowed by CHTYPE are restricted. Thus a UVECTOR of
UTYPE LIST cannot be changed to one of UTYPE VECTOR, but one of UTYPE
FORM may be changed to one of UTYPE LIST. A UTYPE of LOSE may be
CHUTYPEd to anything that a UVECTOR may legally contain.
Argument:
Template: #DECL ("VALUE" <PRIMTYPE UVECTOR>
<PRIMTYPE UVECTOR> ATOM)
Argument 1 -- A UVECTOR whose UTYPE wants to be changed.
Argument 2 -- An ATOM whose name is the name of the type to change the
UTYPE of the UVECTOR to.
Returns -- The UVECTOR with a new UTYPE.
Example: <SET X ![() () () () ()!]>
<CHUTYPE .X FORM>
![<> <> <> <> <>!]
New UTYPE.
.X
![<> <> <> <> <>!]
Note all references to UVECTOR get new UTYPE.
CLOSE: Close an I/O channel
Object-type: SUBR
Category: I/O
Reference: OPEN, BUFOUT, RESET
CLOSE takes as argument a CHANNEL, and causes it to be closed.
Its buffers are written out if it is a PRINT channel. The channel
may be reopened using RESET, for many types of devices.
The CHANNEL closed is returned.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL)
Argument 1 -- A CHANNEL to close.
Returns -- The closed CHANNEL.
Example: <RESET <CLOSE <OPEN "READ" "DSK:FOO BAR">>>
This pointless form will cause a CHANNEL to be opened (assuming the
file exists), closed, and then reopened.
CLOSURE: Bind the free variables of a Function to current values
Object-type: SUBR
Category: TYPE-MANIPULATION
The CLOSURE Subr creates an object of Type CLOSURE. A CLOSURE
can be applied like a FUNCTION, the only difference being that first
the Atoms given in the call to the CLOSURE subr are bound to the values
thay had when the CLOSURE was generated. Then the Function is applied
as normal in this new environment.
A CLOSURE is a poor man's FUNARG.
Argument:
Template: #DECL ("VALUE" CLOSURE FUNCTION "TUPLE"
<TUPLE [REST ATOM]>)
Argument 1 -- A FUNCTION which will be the application part of the
CLOSURE.
Tuple of arguments -- ATOMs whose current values are to be stored as
the binding part of the CLOSURE.
Returns -- A CLOSURE.
Example: <CLOSURE <FUNCTION (X)
<SET .X <+ ..X .INC>>>
INC>
This will create a Closure which can later be applied to an Atom.
When applied it will then increment the local value of that Atom.
The amount of the increment is determined by the current value of INC.
Note that any future changes to the value of INC will not affect
the amount of the increment peformed by the Closure.
COND: CONDitional evaluation on the basis of a predicate
Object-type: FSUBR
Category: PREDICATE, PROGRAM-CONTROL
Reference: AND, OR
COND is an FSUBR used to control evaluation on the basis of a
number of predicates. It takes any non-zero number of arguments, each
of which is a list of a least one element.
For each list, starting with the first, the first element of the
list is evaluated, and if its result is non-false, the rest of the
elements of that list are evaluated and the last thing returned by
one of them is returned as the value of the COND (this will be the
predicate itself if it is the only object in the list.
If the predicate returns a FALSE, then COND moves on to the next
list, or, if there are no more lists, the last FALSE returned is the
value of the COND.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" <LIST LIST [REST LIST]>)
Tuple of arguments -- At least one list, of which the first element
is the 'IF', and the rest the 'THEN'.
Returns -- The result of the last EVAL under its control.
Example: <COND (<SET C <OPEN "READ" "FOO BAR">>
<LOAD .C>
<CLOSE .C>)>
A common use of COND is to fend off the possibility of lossage by
setting up a screen of conditions. Note that if the file is not
opened, the reason will be returned (the last FALSE).
CONS: Add an item to the front of a LIST
Object-type: SUBR
Category: DATA-HANDLING
Reference: LIST
CONS adds an item to the front of a list, without copying it.
It is equivalent to making a list of the new item and the old list
segment evaled:
<CONS .FOO .THE-LIST>
(.FOO !.THE-LIST)
are the same. In fact, the segment evaluation method is preferred, as
it is compilable into a PUSHJ.
Argument:
Template: #DECL ("VALUE" LIST ANY LIST)
Argument 1 -- An object.
Argument 2 -- A LIST to which the object should be prefixed.
Return -- A new list which points into the old one -- the old one is
NOT recopied.
Example: <CONS 1 (2 3 4)>
note that this is equivalent to (1 !'(2 3 4))
COS: Cosine of an angle
Object-type: SUBR
Category: ARITHMETIC
Reference: SIN, ATAN
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- the angle in radians.
Returns -- A FLOAT, the Cosine.
Example: <+ <* <COS .X> <COS .X>>
<* <SIN .X> <SIN .X>>>
1.0
One of the common trig. identities.
CRLF: Print a carriage-return and line-feed
Object-type: SUBR
Category: I/O
Reference: TERPRI
Argument:
Template: #DECL ("VALUE" 'T "OPTIONAL" CHANNEL)
(Optional)
Argument 1 -- the channel, default .OUTCHAN
Returns -- T
Example: <CRLF>
T
Output carriage-return and line-feed.
DECL-CHECK: Change or examine the state of DECL checking
Object-type: SUBR
Category: TYPE, UTILITY
Changes the state of MUDDLE's DECL checking. Initially turned
on, it may be disabled by <DECL-CHECK #FALSE()>, or enabled by
<DECL-CHECK T>. When enabled, each attempt to set an ATOM is checked
against any available DECL of that ATOM. An ERROR is generated if the
DECL does not match the value to which the ATOM will be set.
Argument:
Template: #DECL ("VALUE" <OR FALSE ANY>
"OPTIONAL" <OR FALSE ANY>)
(Optional)
Argument 1 -- Any MUDDLE object. Non-false to enable DECL checking,
False to disable it.
Returns -- The old state.
Example: <DECL-CHECK T>
Enables DECL checking.
DECL?: Check an object against a DECL Pattern
Object-type: SUBR
Category: DATA-HANDLING, PREDICATE
DECL? is a predicate that tells whether or not an object
satisfies a type/structure declaration.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE>
ANY <OR ATOM <FORM 'QUOTE FORM>>)
Argument 1 -- an object to be checked
Argument 2 -- a QUOTEd Pattern to check it against
Returns -- T or a FALSE
Example: <DECL? '[1 2 3] '<VECTOR [REST FIX]>>
T
note QUOTE on Pattern
DEFINE: Define a FUNCTION
Object-type: FSUBR
Category: DATA-HANDLING
Reference: FUNCTION, DEFMAC
DEFINE sets the global value of an atom to the function it
creates from the rest of the arguments. It also checks to see if the
atom was already 'defined', if so and if the atom REDEFINE is non
false, it complains. Otherwise this fsubr operates like FUNCTION plus
SETG.
Argument:
Template: #DECL ("VALUE" ATOM ATOM "ARGS" LIST)
Argument 1 -- The atom whose GVAL to make the function.
List of arguments -- If the first element of the list is an atom the
activation is bound to it, the rest is the arg list, DECL, and
body of the function.
Returns -- Argument 1.
Example: <DEFINE FACTORIAL (N)
<COND
(<0? .N> 1)
(T
<* .N
<FACTORIAL <- .N 1>>>)>>
Then <FACTORIAL 4> returns 24
DEFMAC: Define an EVAL Macro
Object-type: FSUBR
Category: IDENTIFIER
Reference: DEFINE, EXPAND
DEFMAC is syntactically exactly the same as DEFINE. However,
instead of creating a FUNCTION, DEFMAC creates a MACRO. A MACRO is
of primtype LIST, and in fact has a FUNCTION (or other applicable type)
as its single element.
MACROs are applied in a funny way, however. It is EVALed
twice. The first EVAL causes the macro's element to be applied to the
macro's arguments. Whatever it returns (usually another form) is also
evaled, and the result of the second evaluation is the result of
applying the macro.
To avoid complications, the first eval (to create the object to
be evaled in the second...) is done at top-level. The result of this
policy is that two syntactically identical invocations of a macro
should always return the same thing to be evaled in the second EVAL.
EXPAND (qv) is used to perform the first EVAL without the second.
Argument:
Template: #DECL ("VALUE" ATOM ATOM "ARGS" LIST)
Argument 1 -- The atom whose GVAL is to be the MACRO.
Argument 2 -- The parameter list.
Tuple of arguments -- The body of the macro.
Returns -- Argument 1.
Example: <DEFMAC INC (ATM "OPTIONAL" (N 1))
<FORM SET
.ATM
<FORM +
<FORM LVAL .ATM>
.N>>>
<SET X 1>
1
<INC X>
2
<EXPAND '<INC X>>
<SET X <+ .X 1>>
The standard INC hack, in EVAL-macro form.
DEMSIG: Signal a system Daemon
Object-type: SUBR
Category: SYSTEM
DEMSIG signals to a system Daemon that it should run. It takes
a STRING, which is the name of the Daemon in the system's tables, and
causes a signal to it to be sent.
Returns T if the Daemon exists, FALSE otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> STRING)
Argument 1 -- A STRING giving the name of a Daemon.
Returns -- T if exists, FALSE otherwise.
Example: <DEMSIG "COMDMN">
Signal the communication Daemon.
DISABLE: Disable an interrupt
Object-type: SUBR
Category: INTERRUPT
Reference: ENABLE
DISABLE causes the interrupt associated with the IHEADER which
is its argument to be disabled. Disabled interrupts are ignored as
opposed to queued.
Argument:
Template: #DECL ("VALUE" IHEADER IHEADER)
Argument 1 -- The IHEADER whose interrupt is to be disabled.
Returns -- Argument 1.
Example: <DISABLE <GET .INCHAN INTERRUPT>>
Disable the ^G and ^S interrupts.
DISMISS: Dismiss an interrupt
Object-type: SUBR
Category: INTERRUPT
Reference: INT-LEVEL, HANDLER
DISMISS allows an interrupt handler to dismiss an interrupt
returning a value, to an arbitrary activation, at an arbitrary int-
level. Only the value is required. If the activation is not given
the return is to the place interrupted from. If the int-level is not
given, the int-level is restored to what it was prior to the invocation
of the HANDLER.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL" ACTIVATION FIX)
Argument 1 -- The value.
(Optional)
Argument 2 -- The activation to return the value from. Default, the
place from which the HANDLER was invoked.
Argument 3 -- The interrupt level to set on return. Default the one
prior to invocation of the HANDLER.
Returns -- The first argument.
Example: <DISMISS #FALSE ("FATAL ERROR DEEP IN GUTS")
.TOP-LEVEL-ACTIVATION>
A construct like this could be used to signal to a higher level that
somewhere in the code below it, a fatal error occured.
DISPLAY: Display a PICTURE on a Display Channel [OBSOLETE]
******* This SUBR is obsolete as of MUD55 *******
Object-type: SUBR
Category: GRAPHICS
Reference: ERASE, OPEN,
MUDDLE GRAPHICS USER'S MANUAL, SYS.11.04, Bruce Daniels, Ed Black
DISPLAY takes two arguments, a CHANNEL opened in DISPLAY mode,
and a PICTURE. The picture is displayed on the device associated with
the display channel. If no second argument is given, the display on
that device will be refreshed. This is useful if the device is a
display console such as an IMLAC or ARDS.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL "OPTIONAL" PICTURE)
Argument 1 -- A CHANNEL open in display mode.
(Optional)
Argument 2 -- A PICTURE to display on the CHANNEL. If not given, the
display is refreshed only.
Returns -- The CHANNEL.
Example: <SET D <OPEN "DISPLAY" "E&S:">>
<DISPLAY .D .PIC>
Where PIC is a Picture created previously in some manner.
ECHOPAIR: Pair up console channels for echoing
Object-type: SUBR
Category: I/O
ECHOPAIR makes its two argument channels 'know about each other'
so that rubout, ^@, ^D, and ^L will work between them.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL CHANNEL)
Argument 1 -- console-input channel
Argument 2 -- console-output channel
Returns -- arg1
Example: <ECHOPAIR .INCHAN .OUTCHAN>
what LISTEN does
EMPTY?: Does a structure have zero elements ?
Object-type: SUBR
Category: PREDICATE, DATA-HANDLING
Reference: MONAD?
This routine tests if a given structured object has a length of
zero. Note that EMPTY? works correctly for circular Lists, which have
no well-defined length.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> STRUCTURED)
Argument 1 -- Any structured object.
Returns -- T if the structured object has no elements, #FALSE () if it
has any elements at all.
Example: <EMPTY? "---args---">
This will return #FALSE ().
<EMPTY? ()>
However, this will return T.
ENABLE: Enable an interrupt
Object-type: SUBR
Category: INTERRUPT
Reference: DISABLE
ENABLE causes the interrupt associated with the IHEADER which is
its argument to be enabled. This causes the interrupt HANDLERS
associated with the IHEADER to be run when the interrupt occurs.
ENABLEing an already enabled interrupt does nothing.
Argument:
Template: #DECL ("VALUE" IHEADER IHEADER)
Argument 1 -- An IHEADER whose interrupt is to be enabled.
Returns -- Argument 1.
Example: <ENABLE <GET CLOCK!-INTERRUPTS INTERRUPT>>
Enable a clock interrupt.
ENDBLOCK: Undoes the effect of BLOCK, returning a previous OBLIST path
Object-type: SUBR
Category: IDENTIFIER, ENVIRONMENT
Reference: BLOCK
ENDBLOCK pops a value of the ATOM OBLIST, returning the OBLIST
path to a previous state. It therefore undoes the effect of a BLOCK.
If no BLOCK has been done, produces an ERROR.
It returns the new OBLIST path.
Argument:
Template: #DECL ("VALUE"
<OR OBLIST <LIST [REST <OR OBLIST 'DEFAULT>]>>)
Returns -- The previous OBLIST path, now restored.
Example: <ENDBLOCK>
Only possible example.
ENTRY-LOC: Return the offset of an RSUBR-ENTRY
Object-type: SUBR
Category: DATA-HANDLING
Reference: RSUBR-ENTRY, RSUBR
This routine will return the offset of an RSUBR-ENTRY into an
RSUBR. This will be the same offset that was supplied to create the
RSUBR-ENTRY.
Argument:
Template: #DECL ("VALUE" FIX RSUBR-ENTRY)
Argument 1 -- An RSUBR-ENTRY whose offset is to be returned.
Returns -- A FIX, the offset of the RSUBR-ENTRY in its RSUBR.
Example: <ENTRY-LOC <RSUBR-ENTRY [,FOO FOO1] 347>>
347
This will return the offset given to RSUBR-ENTRY, which is the 347.
EQVB: Bitwise logical EQV of its arguments
Object-type: SUBR
Category: LOGICAL, BIT-TWIDDLING
Reference: ANDB, ORB, XORB
EQVB takes any number of arguments of Primtype WORD, and returns
a WORD that is their bitwise logical EQV, that is, the bits they have
in common.
Argument:
Template: #DECL ("VALUE" WORD <TUPLE [REST <PRIMTYPE WORD>]>)
Tuple of arguments -- Primtype WORDs to be EQVed together.
Returns -- A WORD.
Example: <EQVB -22906492246 22906492245>
#WORD *000000000000*
No bits in common.
ERASE: Erase a picture from a Display Channel [OBSOLETE]
******* This SUBR is obsolete as of MUD55 *******
Object-type: SUBR
Category: GRAPHICS
Reference: DISPLAY, OPEN,
MUDDLE GRAPHICS USER'S MANUAL, SYS.11.04, Bruce Daniels, Ed Black
ERASE takes two arguments, the second optional. The first is a
CHANNEL open in Display mode. The second is a picture. ERASE causes
the picture to be removed from the display on that CHANNEL. If the
second argument is not given, all the pictures on that CHANNEL will be
removed, leaving an empty display.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL "OPTIONAL" PICTURE)
Argument 1 -- A CHANNEL open in display mode.
(Optional)
Argument 2 -- A PICTURE to erase from the CHANNEL. If not given, all
of the pictures on the CHANNEL are ERASEd.
Returns -- The CHANNEL.
Example: <SET D <OPEN "DISPLAY" "E&S:">>
<DISPLAY .D .PIC>
<ERASE .D .PIC>
Display PIC and then remove it. (Where PIC is a Picture created
previously in some manner).
ERRET: Return a value as the value of a FRAME
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: RETRY, RETURN
ERRET is used to return values from FRAMEs. It takes two
optional arguments, a value to return, and a FRAME. If defaulted,
the FRAME is the frame of the last invocation of ERROR or LISTEN, and
if both are defaulted, it means to return to TOPLEVEL and reenter the
LISTEN loop there.
ERRET is used most often to recover from errors, by returning
a reasonable argument from the frame that called ERROR.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" ANY FRAME)
(Optional)
Argument 1 -- The value to return from the FRAME given in arg2.
Argument 2 -- The FRAME from which to return the value given.
Returns -- Argument 1.
Example: <ERRET T>
Single most common use of ERRET -- continue from REDEFINE ERROR,
return something innocuous as value of funny atom, and so on.
ERROR: Announce an ERROR
Object-type: SUBR
Category: ERROR
Reference: ERRET
ERROR is used to announce an ERROR in a program. It takes any
number of arguments, which will be printed as ERROR recurses to a
higher level LISTEN loop.
The usual format is to give an ATOM which is the reason for the
ERROR, the routine in which it occurred, and any other information of
interest last.
Argument:
Template: #DECL ("VALUE" ANY "TUPLE" TUPLE)
Tuple of arguments -- ANY number of arguments of any type.
Returns -- Whatever the user ERRETs from it.
Example: <ERROR RAN-OUT-OF-INPUT!-ERRORS INPUT-HANDLER>
Most common ERROR call format is this.
ERRORS: Returns the ERRORS OBLIST
Object-type: SUBR
Category: ERROR
Reference: ERROR, ROOT
ERRORS returns the ERRORS OBLIST. This is the OBLIST on which
live the ATOMs whose PNAMEs are the MUDDLE ERROR messages.
Argument:
Template: #DECL ("VALUE" OBLIST)
Returns -- The ERRORS OBLIST.
Example: <ERRORS>
Only possible example.
EVAL: Evaluate an expression in a given envirnoment
Object-type: SUBR
Category: PROGRAM-CONTROL
EVAL is a program control subr. The first arg to EVAL is the MUDDLE
expression to be evaluated. The second, optional, arg is the execution
environment in which the evaluation is to take place. If the second
arg is not supplied the current environment of the current process will
be used.
Every Type in MUDDLE has a defined, or default, rule for evaluation
of MUDDLE objects of that Type. See EVALTYPE on how to change these
rules.
The initial EVAL rules for MUDDLE Types are:
FORM--
EVAL of empty FORM is #FALSE ()
If <1 <-Form-> > is an ATOM,
then, APPLY either GVAL of Atom or VALUE of the Atom to the
appropriately EVALed or unEVALed args.
else, APPLY the EVAL of <1 <-Form-> > to the appropriately EVALed
or unEVALed args.
Note that the subsequent EVAL of an arg which is of Type SEGMENT
is treated specially.
LIST or VECTOR or UVECTOR--
make a new structured object of the same Type whose elements
are the EVALuated elements of the given object.
Note that the EVAL of an element of the structure
which is of Type SEGMENT is also treated specially.
ALL other types--
Evaluate to themselves.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL"
<OR ACTIVATION FRAME ENVIRONMENT PROCESS>)
Argument 1 -- ANY object to be EVALed.
(Optional)
Argument 2 -- An ACTIVATION, FRAME, ENVIRONMENT, or PROCESS in which
to perform the evaluation.
Returns -- The result of the EVAL, as described above.
Example: <EVAL '<SET X <+ .X 1>> <RESUMER>>
This will increment the local value of the Atom X in the process
which last resumed the current process.
Note that the value of X in the current process, if any, will not
be affected.
EVALTYPE: Change or examine the way a TYPE is EVALed
Object-type: SUBR
Category: TYPE-MANIPULATION, PROGRAM-CONTROL
Reference: EVAL, APPLYTYPE
Changes the way a specific type is EVALed, by either mapping
it into another type, or giving an explicit method via an APPLICABLE.
If a type is given, the type being changed will be EVALed in the
same manner as that type.
If an APPLICABLE is given, it should take one argument,
which will be the object being EVALed. Whatever the APPLICABLE returns
will be the result of the EVALuation. If ,EVAL is given, the type
will hereafter receive no special treatment in evaluation.
If no second arg is given, EVALTYPE returns the last second arg
that was given for this type, or #FALSE () if the type is receiving no
special treatment in evaluation.
Argument:
Template: #DECL ("VALUE" <ATOM APPLICABLE FALSE> ATOM "OPTIONAL"
<OR ATOM APPLICABLE>)
Argument 1 -- The type whose EVALTYPE to change or examine.
(Optional)
Argument 2 -- A TYPE (which means 'Eval like this type'), or an
APPLICABLE (meaning 'use this when you EVAL this type').
Returns -- The TYPE which was changed or, if no arg 2, the special
treatment it is receiving if any.
Example: <EVALTYPE LIST FORM>
<EVALTYPE ATOM ,LVAL>
<SETG CAR 1>
<SETG CDR ,REST>
<SETG LAMBDA ,FUNCTION>
This will set up MUDDLE to look like LISP to the casual user:
(+ 1 2)
3
(SET 'A 5)
5
A
5
LISP in MUDDLE?
EVENT: Set up an IHEADER for an event
Object-type: SUBR
Category: INTERRUPT
Reference: DISABLE, ENABLE
EVENT sets up an IHEADER for either an external or internal
interrupt. No handlers are attached to the IHEADER set up by EVENT.
The first argument to EVENT identifies the interrupt. It may be
a string or an atom on the INTERRUPTS OBLIST. In either case if the
name is associated with a physical interrupt, the real interrupt is
set up. The first argument may also be a previously OFFd IHEADER.
The second argument is the priority of this interrupt and it must
be a positive fixed point number. The priority basically specifies
how important this interrupt is relative to other interrupts.
If the first argument to EVENT is either CHAR!-INTERRUPTS,
READ!-INTERRUPTS or WRITE!-INTERRUPTS or the strings with those names,
a third argument is required. For CHAR this must be a TTY input
channel and for the others it must be the locative getting the READ or
WRITE monitor.
Argument:
Template: #DECL ("VALUE" IHEADER <OR STRING ATOM IHEADER> FIX
"OPTIONAL" <OR CHANNEL LOCATIVE>)
Argument 1 -- The name of the interrupt.
Argument 2 -- A priority.
(Optional)
Argument 3 -- A CHANNEL, for character interrupts, or LOCATIVE, for monitors
Returns -- An IHEADER.
Example: <SET TEM <EVENT "SYSDOWN" 1>>
Setup a SYSDOWN interrupt.
EXP: Exponents of 'e'
Object-type: SUBR
Category: ARITHMETIC
Reference: LOG
EXP is the opposite of LOG, taking e to a power. It takes a FIX
or FLOAT as argument, and returns e to that power, converted to a FLOAT
whether the argument was fix or float.
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT to take e to the power of.
Returns -- (e ** <argument 1>)
Example: <EXP <LOG 2>>
2.0
Note conversion to floating point number.
EXPAND: Expand a MACRO
Object-type: SUBR
Category: ENVIRONMENT, UTILITY
Reference: DEFMAC
EXPAND evaluates its argument in a top-level environment, that is, as
if no LVALs existed. It is designed to perform the first evaluation
in a MACRO application, but it can be useful in other cases.
Argument:
Template: #DECL ("VALUE" ANY ANY)
Argument 1 -- an object to evaluate
Returns -- the top-level value of the object or 'body' of the MACRO
Example: <DEFMAC INC (ATM "OPTIONAL" (N 1))
<FORM SET
.ATM
<FORM +
<FORM LVAL .ATM>
.N>>>
INC
<EXPAND '<INC X>>
<SET X <+ .X 1>>
Note that <EVAL '<INC X>> would EVAL this last form too.
FILE-EXISTS?: Check for existence of a file
Object-type: SUBR
Category: I/O
Reference: OPEN
FILE-EXISTS? takes arguments like the second and higher arguments
to OPEN (q.v.). It returns T if the file thus specified exists, otherwise
a FALSE of two elements: the error message and error code returned by the
operating system.
Argument:
Template: #DECL ("VALUE" <OR FALSE ATOM> "TUPLE" <REST STRING>)
Argument 1-4 -- file names
Returns -- T if file exists, a FALSE otherwise
Example: <FILE-EXISTS? "DSK:FOO;.FILE. (DIR)">
Will return T if FOO is a real directory.
FILE-LENGTH: Get length of input file
Object-type: SUBR
Category: I/O
Reference: FILECOPY
FILE-LENGTH tells the length (in characters or binary words,
depending on the channel's mode) of the disk file open for input on its
argument channel.
Argument:
Template: #DECL ("VALUE" FIX CHANNEL)
Argument 1 -- input disk channel
Returns -- length of disk file
Example: <ACCESS .IN <FILE-LENGTH .IN>>
Next input will detect end of file.
FILECOPY: Copy entire file from one channel to another
Object-type: SUBR
Category: I/O
Reference: FILE-LENGTH
FILECOPY copies characters from an input channel (arg1) to an
output channel (arg2) until the end of file, thus closing the input
channel. A FILE-LENGTH on arg1 must win, ruling out certain devices.
Argument:
Template: #DECL ("VALUE" FIX "OPTIONAL" CHANNEL CHANNEL)
(Optional)
Argument 1 -- source (input) channel, default .INCHAN
Argument 2 -- destination (output) channel, default .OUTCHAN
Returns -- number of characters copied
Example: <FILECOPY <OPEN "READ" "TTY:.FILE. (DIR)">>
like Monit's WHO
FIX: Convert a FLOAT to a FIX
Object-type: SUBR
Category: TYPE-MANIPULATION, ARITHMETIC
Reference: FLOAT
FIX takes a FLOAT and converts it to a FIX, truncating the
fractional part.
Argument:
Template: #DECL ("VALUE" FIX <OR FLOAT FIX>)
Argument 1 -- A FLOAT to convert
Returns -- A FIX corresponding to the FLOAT.
Example: <FIX 69.910496>
69
Note the truncating.
FLATSIZE: Return the size of an object within a maximum
Object-type: SUBR
Category: DATA-HANDLING, I/O
Reference: PRINT
FLATSIZE returns the number of characters needed to PRINT an
item, if it is less than the bound (thus winning on self-referencing things).
If it is greater than the upper bound, returns #FALSE ().
Argument:
Template: #DECL ("VALUE" <OR FALSE FIX> ANY FIX "OPTIONAL" FIX)
Argument 1 -- The object to 'PRINT'.
Argument 2 -- The upper bound on size of the object.
(Optional)
Argument 3 -- radix for FIX conversion
Returns -- The size, if less than the bound, or #FALSE () if not.
Example: <FLATSIZE (1 2 3) 10>
Will be a fix result
<FLATSIZE (1 2 3) 5>
Will be a FALSE
FLOAD: READ and EVAL every object in a file
Object-type: SUBR
Category: I/O
Reference: READ, EVAL, LOAD, UNWIND, OPEN
FLOAD opens a file, READs and EVALs every object in it, and
closes it again. If the opening fails, an ERROR occurs, giving the
reason for failure. A (list of) oblist(s) may also be given for
looking up atoms. Control characters in the file have no special
meaning. An UNWIND is set up to close the channel on any ERRET.
Argument:
Template: #DECL ("VALUE" '"DONE" "TUPLE" TUPLE)
(Optional)
Tuple of arguments -- string(s) as for OPEN and/or oblist as for READ
Returns -- "DONE"
Example: <FLOAD "MUDDLE;FIXUP">
part of initialization for TS file
FLOAT: Convert a FIX to a FLOAT
Object-type: SUBR
Category: TYPE-MANIPULATION, ARITHMETIC
Reference: FIX
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- A FIX to convert to a FLOAT.
Returns -- The new FLOAT.
Example: <FLOAT 69>
69.0
CHTYPE would lose, of course.
FORM: Create a FORM with explicit arguments
Object-type: SUBR
Category: DATA-HANDLING
Reference: IFORM
FORM creates a FORM of explicit arguments. This is the way to
make a form with the elements evaluated.
Argument:
Template: #DECL ("VALUE" FORM "TUPLE" <TUPLE [REST ANY]>)
Tuple of arguments -- Any objects, the elements of the FORM.
Returns -- The FORM created.
Example: <DEFINE INCR (N)
<FORM SET
.N
<FORM + 1 <FORM LVAL .N>>>>
this returns the form <SET FOO <+ 1 .FOO>> when called with FOO as arg
FRAME: Walk the chain of stack frames
Object-type: SUBR
Category: ENVIRONMENT, UTILITY
Reference: FUNCT, ARGS
FRAME returns the 'previous' stack-frame on the stack. This
means that given a FRAME, it returns the FRAME that generated it. If
no FRAME is given, it returns the topmost FRAME on the stack.
Given an ACTIVATION or ENVIRONMENT, it returns the appropriate FRAME.
When the stack 'runs out', i.e., the end is reached, it returns
#FRAME TOPLEVEL.
In conjunction with ARGS and FUNCT, makes a powerful debugging
aid.
FRAME, ARGS, and FUNCT may also get access to the stack frames
of other processes, by giving the process as an argument. If this
feature is used, returns the topmost FRAME of that process.
Argument:
Template: #DECL ("VALUE" FRAME
"OPTIONAL" <OR ENVIRONMENT
ACTIVATION
FRAME
PROCESS>)
(Optional)
Argument 1 -- Either nothing, meaning return topmost FRAME of this
PROCESS, or a FRAME, meaning return next FRAME of this PROCESS,
or an environment, meaning return topmost FRAME of this
environment.
Returns -- As described above, a FRAME, or #FRAME TOPLEVEL when the
end of the stack is reached.
Example: <DEFINE FRAMES ("OPTIONAL" (PROC <ME>))
<REPEAT ((X <FRAME .PROC>)
(N 1))
<COND (<==? <FUNCT .X> TOPLEVEL>
<RETURN TOPLEVEL>)>
<PRINT .N>
<PRIN1 <FUNCT .X>>
<PRINC <ASCII 9>>
<PRIN1 <ARGS .X>>
<SET X <FRAME .X>>
<SET N <+ 1 .N>>>>
A primitive version of the FRAMES function installed in MUDDLE.
FREE-RUN: Returns a PROCESS to free running state
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: 1STEP
Puts a PROCESS back into a free running state after it has been
in one-step mode. Takes a PROCESS as argument.
Argument:
Template: #DECL ("VALUE" <OR PROCESS FALSE> PROCESS)
Argument 1 -- A PROCESS to return to normal running mode.
Returns -- The PROCESS, or FALSE if PROCESS not in one-step mode.
Example: <FREE-RUN .FOO>
Now will run free when RESUMEd.
FREE: Free non-garbage collected STORAGE [OBSOLETE]
******* This SUBR is obsolete as of MUD55 *******
Object-type: SUBR
Category: DATA-HANDLING
Reference: STORE
FREE de-allocates non-garbage collected storage (mostly used for
E&S display). Once it has been free'd it will be used by STORE again.
Argument:
Template: #DECL ("VALUE" <PRIMTYPE STORAGE> <PRIMTYPE STORAGE>)
Argument 1 -- A storage: the space to be released.
Returns -- The same storage -- better not hold on to it.
Example: <FREE <ISTORAGE 69 0>>
Free up newly created STORAGE.
FREEZE: Copy an object into non-moving storage
Object-type: SUBR
Category: DATA-HANDLING, UTILITY
FREEZE copies its argument into non-moving (garbage-collected)
space. It CHTYPEs the copy to its PRIMTYPE; a TUPLE is changed to a
VECTOR. FREEZEing is mostly valuable applied to the CODE of an RSUBR.
Argument:
Template: #DECL ("VALUE" <OR VECTOR UVECTOR STRING>
<OR <PRIMTYPE VECTOR>
<PRIMTYPE TUPLE>
<PRIMTYPE UVECTOR>
<PRIMTYPE STRING>>)
Argument 1 -- a vector, tuple, uvector, or string to freeze
Returns -- a frozen copy of arg1
Example: <FREEZE <1 ,MY-RSUBR>>
to debug an RSUBR
FUNCT: Return the function that generated a FRAME
Object-type: SUBR
Category: ENVIRONMENT, UTILITY
Reference: FRAME, ARGS
FUNCT returns the ATOM which is the name of the applicable object
which caused a given FRAME to be created. Takes a FRAME or other
environment as an argument. If given a non-FRAME, it returns the
topmost function name of that environment.
Most commonly used as part of a more sophisticated program, such
as FRAMES or FR&.
Argument:
Template: #DECL ("VALUE" ATOM
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- an environment
Returns -- The ATOM which is the name of the object which caused the
FRAME to be created.
Example: <FUNCT <FRAME>>
LISTEN
If done at top level.
FUNCTION: Create a FUNCTION
Object-type: FSUBR
Category: DATA-HANDLING
Reference: DEFINE
FUNCTION creates a function. In cases where the function is to
be made the GVAL of an ATOM, it is preferable to use DEFINE.
A FUNCTION consists of an optional ACTIVATION name (an ATOM),
a Parameter LIST, an optional DECL, and a body consisting of at least
one object.
Argument:
Template: #DECL ("VALUE" FUNCTION "ARGS" LIST)
List of arguments -- if the first element of the list is an atom the
activation is bound to it, the rest is the arg list, DECL, and
body of the function.
Returns -- A FUNCTION.
Example: <FUNCTION (N) <+ 1 .N>>
equivalent to #FUNCTION ((N) <+ 1 .N>)
G=?: Is first argument greater than or equal to the second ?
Object-type: SUBR
Category: PREDICATE, ARITHMETIC
Reference: L?, G?
This routine tests if the first argument is numerically greater
than or equal to the second argument, returning T if it is, #FALSE()
otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE>
<OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT.
Argument 2 -- A FIX or FLOAT.
Returns -- T if arg1 >= arg2, #FALSE() if not.
Example: <G=? 2.4499998 -2>
<G=? -7.2300000 -10.039999>
<G=? 23 23.0>
These will return T.
<G=? -0.42699999E-2 0.20409999>
<G=? 6 9.5709997>
These will return #FALSE ().
G?: Is first argument greater than the second ?
Object-type: SUBR
Category: PREDICATE, ARITHMETIC
Reference: L?, G=?
This routine tests if the first argument is numerically greater
than the second argument, returning T if it is, #FALSE() otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE>
<OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT.
Argument 2 -- A FIX or FLOAT.
Returns -- T if arg1 > arg2, #FALSE() if not.
Example: <G? 3 2>
<G? -3.4230000 -5>
These will return T.
<G? 0.35240000 0.34169999>
<G? -146 -113>
<G? 1.0 1>
These will return #FALSE ().
GASSIGNED?: Is an Atom globally assigned ?
Object-type: SUBR
Category: PREDICATE, IDENTIFIER
Reference: ASSIGNED?, BOUND?
This routine is used to test if a particular Atom is globally
assigned, or in other words, if it has a global value. It does cause
the activation of any read monitors on that global value.
It returns T if the ATOM has a GLOBAL value, #FALSE() otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ATOM)
Argument 1 -- An ATOM which may have a global value.
Returns -- T if the ATOM has a global value, #FALSE() otherwise.
Example: <SETG FOO "ANYTHING">
<GASSIGNED? FOO>
This will simply return the Atom T, since FOO does have a global
value.
<GUNASSIGN FOO>
<GASSIGNED? FOO>
This will simply return #FALSE (), since the Atom FOO has no global
value.
GBOUND?: Does an atom have a global-value slot?
Object-type: SUBR
Category: IDENTIFIER, PREDICATE
Reference: SETG, MANIFEST, GDECL, GLOC
GBOUND? tells whether or not an atom has a slot in the 'global
vector', that is, whether it has ever been SETGed, MANIFEST, GDECLed,
or GLOCed successfully.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ATOM)
Argument 1 -- the atom to test
Returns -- whether or not the atom is globally bound
Example: <GBOUND? GBOUND?>
T
obviously
GC-DUMP: Dump an object so it can be reproduced exactly
Object-type: SUBR
Category: I/O
Reference: GC-READ
GC-DUMP dumps an object via a channel so that GC-READ (q.v.)
can reproduce it exactly, including sharing. Any non-stack, non-pure
object can be dumped, except primtypes process, locd, and asoc.
If a false is given instead of a channel, GC-DUMP returns what it
would have output on the channel, as a uvector. This uvector can be
stored as desired, but it must not be changed in any way to be
GC-READable.
Argument:
Template: #DECL ("VALUE" <OR ANY <UVECTOR <PRIMTYPE WORD>>>
ANY <OR CHANNEL FALSE>)
Argument 1 -- the object to be dumped
Argument 2 -- "PRINTB/O" channel or false
Returns -- arg1 if arg2 is channel, else output data
Example: <GC-DUMP <PROG ((L (1 2)))
<PUTREST .L .L>>
<>>
can dump circular objects
GC-MON: Toggle state of GC monitor
Object-type: SUBR
Category: ENVIRONMENT
Reference: GC
GC-MON is used to turn on and off the typing of GIN and GOUT
and other info upon entering and leaving the garbage collector.
If the argument is FALSE no typing will occur, otherwise typing
will occur. The initial state of the GC-monitor is to not type.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" ANY)
(Optional)
Argument 1 -- If non-FALSE, turn on GC-monitor, else turn it off.
Returns -- The previous or current state of the monitor.
Example: <GC-MON T>
Turn on GC-monitoring
GC-READ: Input an object that was previously GC-DUMPed
Object-type: SUBR
Category: I/O
Reference: GC-DUMP
GC-READ returns one object from a given channel, open to a file
produced by GC-DUMP (q.v.).
Argument:
Template: #DECL ("VALUE" ANY CHANNEL "OPTIONAL" ANY)
Argument 1 -- a "READB" channel to read from
(Optional)
Argument 2 -- object to eval and return at eof
Returns -- an object from the file, or arg2
Example: <SET L
<PROG (O
(C <OPEN "READB" "DUMPED FILE">))
<STACKFORM ,LIST
.O
<SET O
<GC-READ .READB-CHNL <>>>>>>
get all GC-DUMPed objects from a file
GC: Cause a Garbage Collection to occur
Object-type: SUBR
Category: ENVIRONMENT
Reference: GC-MON, BLOAT
GC always causes a garbage collection and returns the amount
of storage reclaimed. Its first optional argument specifies the
minimum amount of free space tolerable in future gc's. Its second
argument tells whether this gc should be exhaustive. Its third argument
changes the parameter telling how many mark-sweep gcs to do between
"real" ones; this is initially 0, meaning never mark-sweep.
Argument:
Template: #DECL ("VALUE" FIX "OPTIONAL" FIX <OR FALSE ANY> FIX)
(Optional)
Argument 1 -- FIX specifying amount of free space to get.
Argument 2 -- whether gc should be exhaustive
Argument 3 -- how many mark-sweep GCs to do between "real" ones.
Returns -- A FIX giving the amount free space reclaimed.
Example: <GC 30000 <>>
GC and change a GC parameter
GDECL: Make a declaration for a global value
Object-type: FSUBR
Category: DATA-HANDLING
Reference: GET-DECL, PUT-DECL, MANIFEST
GDECL is used to make a DECL for a global value or values, in
much the same way as the #DECL () construct is used for local values.
It takes the standard DECL syntax argument (ie, CHTYPEing REST of the
GDECL form to DECL would make it look like a local DECL).
ATOMs that have been GDECLed will give ERRORs on an attempt to
SETG them to something that conflicts with their DECL, unless, of
course, DECL-checking is disabled.
Argument:
Template: #DECL ("VALUE" ANY
"ARGS" <LIST [REST
<LIST [REST ATOM]>
<OR ATOM FORM>]>)
List of arguments -- Pairs consisting of a LIST of ATOMs and a
DECL body.
Returns -- T
Example: <GDECL (FOO)
FIX
(BAR)
<LIST [REST LIST]>>
Just like local DECLs.
GET-DECL: Get the DECL of an ATOM
Object-type: SUBR
Category: DATA-HANDLING
Reference: PUT-DECL
GET-DECL returns the current DECL of an ATOM's GVAL or LVAL.
It takes a single argument, a locative to the value. It returns
either the DECL, the ATOM MANIFEST (if the ATOM is manifest), or
FALSE, if the ATOM has no DECL.
The use of locatives allows the same SUBR to work for both local
and global values.
If given an OFFSET, returns the DECL part of the OFFSET.
Argument:
Template: #DECL ("VALUE" <OR ATOM FORM FALSE> <OR LOCD OFFSET>)
Argument 1 -- A locative to the global or local value slot of an
ATOM, or an OFFSET.
Returns -- The DECL of that value, or MANIFEST, or FALSE.
Example: <SET FOO (1 2 3)>
<SET BAR (4 5 6)>
<GDECL (FOO BAR) LIST>
<GET-DECL <GLOC FOO>>
LIST
<GET-DECL <OFFSET 1 '<CHANNEL FIX>>>
<CHANNEL FIX>
See also PUT-DECL, for changing declarations.
GET: Get an element of a structure or the value of an association
Object-type: SUBR
Category: DATA-HANDLING, ASSOCIATION
Reference: PUT, GETPROP
GET returns a given property associated with an item, or if
second arg is a fix and the object is structured, returns that element
of the structured object.
Thus, GET is like GETPROP if the first argument is not a structure,
and like NTH if it is.
If GET is being used like GETPROP, an optional third argument is
allowed, which is what to return if there is no association between
the given item and indicator.
Argument:
Template: #DECL ("VALUE" ANY ANY ANY "OPTIONAL" ANY)
Argument 1 -- The object with the association or structure.
Argument 2 -- The indicator under which the association is stored or
the FIX offset within a structure.
(Optional)
Argument 3 -- The default to be evaled and returned if no assoc, else
FALSE is the result.
Returns -- The element of the structure, value of the association, or
the optional third argument if given, or FALSE.
Example: <PROG ((A (1 2 3 4)))
<PUT .A 2 5>
<PUTPROP .A 3 6>
<PUT .A X "STRING">
(.A
<GET .A 2>
<GETPROP .A 3>
<GET .A X>)>
Notice the difference between the PROP and non-prop subrs
GETBITS: Get part of a word
Object-type: SUBR
Category: BIT-TWIDDLING
Reference: BITS, PUTBITS
GETBITS takes a PRIMTYPE WORD (or a STORAGE, for which its
address is used) and a BITS, and returns a word generated by picking
up the bits described by the BITS. For example, a BITS of <BITS 7>
describes the rightmost 7 bits of a word. Therefore, a GETBITS using
it will return the rightmost 7 bits.
It is functionally equivalent to the PDP-10 Load Byte (LDB)
instruction.
Argument:
Template: #DECL ("VALUE" WORD <PRIMTYPE <OR WORD STORAGE>> BITS)
Argument 1 -- An object of type WORD.
Argument 2 -- A BITS, as returned by BITS.
Returns -- A WORD containing the bits described by Argument 2.
Example: <GETBITS -1 <BITS 3>>
#WORD *000000000007*
Non-WORDs need not be CHTYPEd.
GETL: Get a locative to a structure or the value of an association
Object-type: SUBR
Category: DATA-HANDLING, ASSOCIATION
Reference: PUT, GETPROP, GETPL
GETL returns a locative to a given association, or if second arg
is a fix and the object is structured, returns a locative to that
element of the structured object.
Thus, GETL is like GETPL if the first argument is not a structure,
and like AT if it is.
If GETL is being used like GETPL, an optional third argument is
allowed, which is what to return if there is no association between
the given item and indicator.
Argument:
Template: #DECL ("VALUE" <OR LOCATIVE ANY> ANY ANY
"OPTIONAL" ANY)
Argument 1 -- The item part of the association or a structure.
Argument 2 -- The indicator under which the association is stored or
the FIX offset within a structure.
(Optional)
Argument 3 -- The default to be evaled and returned if no assoc, else
FALSE is the result.
Returns -- A locative to the association or element of a structure, or
if acting like GETPL and there is no association, eval of the
optional third argument if given, or FALSE.
Example: <PROG ((A (1 2 3 4)))
<PUT .A 2 5>
<PUTPROP .A 3 6>
<PUT .A X "STRING">
(.A
<GETL .A 2>
<GETPL .A 3>
<GETL .A X>)>
Notice the difference between the PROP and non-prop subrs
GETPL: Get an a locative to the value of an association
Object-type: SUBR
Category: ASSOCIATION
Reference: PUT, GETPROP, GETL
GETPL returns a locative to the value part of an association
with given item (arg1) and indicator (arg2). It also takes a third
argument (optional) which will be evaled if the association does not
exist (default is FALSE).
Note that GETL is identical to GETPL if its first argument is not
structured and its second is not a FIX.
Argument:
Template: #DECL ("VALUE" <OR LOCAS ANY> ANY ANY "OPTIONAL" ANY)
Argument 1 -- The object with the association.
Argument 2 -- The indicator under which the association is stored.
(Optional)
Argument 3 -- The default to be evaled and returned if no assoc, else
FALSE is the result.
Returns -- A locative (type LOCAS) to the association if it exists, or
eval of the optional third argument if given, or FALSE.
Example: <PROG ((A (1 2 3 4)))
<PUT .A 2 5>
<PUTPROP .A 3 6>
<PUT .A X "STRING">
(.A
<GETL .A 2>
<GETPL .A 3>
<GETL .A X>)>
Notice the difference between the PROP and non-prop subrs
GETPROP: Get the value of an association
Object-type: SUBR
Category: DATA-HANDLING, ASSOCIATION
Reference: PUT, PUTPROP, GETPL, GETL
GETPROP returns a given property associated with an item. It
takes two required arguments, the item and the indicator, and a third
argument which is optional, and which will be evaled and returned if
the item-indicator pair has no association on it (default a FALSE).
GETPROP is thus one end of a triad of SUBRs, GETPROP, GET and NTH,
which together make up a full association/subelement mechanism. This
is paralleled by PUT and PUTPROP, and GETPL, GETL and AT.
Argument:
Template: #DECL ("VALUE" ANY ANY ANY "OPTIONAL" ANY)
Argument 1 -- The item part of an item-indicator pair.
Argument 2 -- The indicator under which the association is stored.
(Optional)
Argument 3 -- The default to be evaled and returned if no assoc, else
FALSE is the result.
Returns -- The element of the structure, value of the association, or
the optional third argument if given, or FALSE.
Example: <PROG ((A (1 2 3 4)))
<PUT .A 2 5>
<PUTPROP .A 3 6>
<PUT .A X "STRING">
(.A
<GET .A 2>
<GETPROP .A 3>
<GET .A X>)>
Notice the difference between the PROP and non-prop subrs
GLOC: Get a locative to the GVAL of an ATOM
Object-type: SUBR
Category: DATA-HANDLING
Reference: LLOC
Returns a locative, type LOCD, to the GVAL of the ATOM passed
as its argument. If the ATOM has no GVAL slot, ERROR, unless second
arg is given and true.
Argument:
Template: #DECL ("VALUE" LOCD ATOM "OPTIONAL" <OR FALSE ANY>)
Argument 1 -- An ATOM with a GVAL.
(Optional)
Argument 2 -- whether not to give a no-slot error or not
Returns -- A locative (LOCD) to the GVAL of the ATOM.
Example: <AND <GASSIGNED? FOO> <GLOC FOO>>
Guard against ATOMs with no GVALs.
GO: Go elsewhere in a PROG/REPEAT
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: TAG, PROG, REPEAT
GO transfers control to a given top-level object within a PROG
or REPEAT. The place to go is specified by an atom label or a tag.
GO is very seldom tasteful: use nested REPEAT or MAPF/R instead.
Argument:
Template: #DECL ("VALUE" ANY <OR ATOM TAG>)
Argument 1 -- where to go to
Returns -- RESUME arg, if tag lay in another process
Example: <PROG (&)
<&>
AWAY
<FOO>
<&>
<GO AWAY>
&..>
exactly what GO should do
GROW: Enlarge a VECTOR or UVECTOR
Object-type: SUBR
Category: DATA-HANDLING
Reference: GC
GROW extends the bounds of a vector or uvector. Be aware that
growing causes a garbage collection and is therefore an expensive
operation. That is the reason it is only done in increments of 32 or
64.
Argument:
Template: #DECL ("VALUE" <PRIMTYPE <OR VECTOR UVECTOR>>
<PRIMTYPE <OR VECTOR UVECTOR>> FIX FIX)
Argument 1 -- The object to grow.
Argument 2 -- Number to be added to the end rounded up to a multiple
of 32 for VECTORs, 64 for UVECTORs.
Argument 3 -- Number to be added to beginning rounded up to a multiple
of 32 for VECTORs, 64 for UVECTORs.
Returns -- The newly enlarged VECTOR or UVECTOR.
Example: <GROW ![1 2 3!] 1 1>
will grow by 32 on each end.
GUNASSIGN: Removes the Global value of an ATOM
Object-type: SUBR
Category: IDENTIFIER
Reference: GVAL, GASSIGNED?
GUNASSIGN removes the global value of an ATOM. After an ATOM
has been GUNASSIGNED, GVAL of it will cause and error, and GASSIGNED?
of it will return FALSE.
Argument:
Template: #DECL ("VALUE" ATOM ATOM)
Argument 1 -- The ATOM to flush the GVAL of.
Returns -- The ATOM you just GUNASSIGNed.
Example: <GUNASSIGN GUNASSIGN>
GUNASSIGN
Something you only do once.
GVAL: Return the Global value of an ATOM
Object-type: SUBR
Category: IDENTIFIER
Reference: GASSIGNED?, GUNASSIGN
Returns the Global value of an ATOM, if any. If the ATOM has
no Global value, ERROR.
The expressions ,<an atom> and <GVAL <an atom>> are identical.
Argument:
Template: #DECL ("VALUE" ANY ATOM)
Argument 1 -- An ATOM.
Returns -- Its GVAL, if it has one.
Example: <==? ,FOO .FOO>
GVAL and LVAL are independent, but watch out using both -- the last
referenced is kept in the ATOM's value slot, so switching back and
forth can be expensive!
HANDLER: Attach an interrupt handler to an IHEADER
Object-type: SUBR
Category: INTERRUPT
Reference: EVENT, ENABLE, DISABLE
HANDLER attaches an interrupt handler to an IHEADER. It may
build and attach a new handler or reattach a previously OFFed handler.
The first argument is always the IHEADER. The second argument
is either the previously OFFd handler or an applicable object.
The last argument is optional and may be a
process in which the handler is to run. If no process is supplied,
the interrupt will run in whatever process is currently running.
Note: new handlers are always added to the beginning of the list of
handlers.
Argument:
Template: #DECL ("VALUE" HANDLER IHEADER <OR HANDLER
APPLICABLE>
"OPTIONAL" PROCESS)
Argument 1 -- An IHEADER, such as is returned by EVENT.
Argument 2 -- An APPLICABLE object to handle the interrupt, or a
previously OFFed HANDLER.
(Optional)
Argument 3 -- A PROCESS in which to run the interrupt.
Returns -- A HANDLER, which has been added to the beginning of the
list of HANDLERs for that interrupt.
Example: <HANDLER <SET TEM <EVENT "CHAR" 10 .INCHAN>>
,QUITTER>
Setup a character interrupt with one handler.
HANG: Hang interruptably forever
Object-type: SUBR
Category: ENVIRONMENT, INTERRUPT
Reference: SLEEP
HANG causes the MUDDLE to hang interruptably forever. It is
useful if there is an activation available to return to beyond the
HANG. Alternatively, it takes an optional argument which is EVALed
each time an interrupt DISMISSes back to the HANG. If the argument
EVALs to non-FALSE, the HANG terminates, returning the result of the
EVAL.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" ANY)
(Optional)
Argument 1 -- Something to EVAL each time the HANG is dismissed to.
Returns -- The result of EVALing the argument, or if it is not given,
never returns (May be non-locally returned beyond, of course).
Example: <HANG .FOO>
Hang until someone (at interrupt level) sets FOO to a non-FALSE.
IBYTES: Generate a BYTES by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: BYTES
IBYTES returns a byte-string of given byte-size and length whose
elements are generated by repeated evaluation of the third argument.
Note that the third argument must return a FIX each time it is EVALed.
Argument:
Template: #DECL ("VALUE" BYTES FIX FIX "OPTIONAL" ANY)
Argument 1 -- FIX, size of bytes
Argument 2 -- FIX, number of elements.
(Optional)
Argument 3 -- ANY, expression which when evaled, gives each element,
default is zeros.
Returns -- Newly baked BYTES.
Example: <IBYTES 3 9 '<COND (<ASSIGNED? X> <SET X <+ 1 .X>>) (<SET X 0>)>>
#3 {0 1 2 3 4 5 6 7 0}
IFORM: Generate a FORM by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: FORM
IFORM returns a form of given length whose elements are generated
by repeated evaluation of the second argument.
Argument:
Template: #DECL ("VALUE" FORM FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements to generate.
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element
default is #LOSE *0*'s.
Returns -- The newly hatched FORM.
Example: <SET ROOTL <LENGTH <ROOT>>>
<IFORM 5 '<1 <NTH <ROOT> <MOD <RANDOM> .ROOTL>>>>
Makes a FORM by picking the first elements of 5 randomly selected
buckets in the ROOT OBLIST.
ILIST: Generate a LIST by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: LIST
ILIST returns a list of given length whose elements are generated
by repeated evaluation of the second argument.
Argument:
Template: #DECL ("VALUE" LIST FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element
default is #LOSE *0*'s
Returns -- The newly created LIST.
Example: <ILIST 5 0>
Create a LIST containing five 0s.
IMAGE: Output a naked character
Object-type: SUBR
Category: I/O
Reference: PRINC
IMAGE outputs precisely the character whose ASCII value is
given as an arg. It does not add up-arrow, line-feed, etc.
Argument:
Template: #DECL ("VALUE" FIX FIX "OPTIONAL" CHANNEL)
Argument 1 -- ASCII code for character to send naked
(Optional)
Argument 2 -- the channel to send it on, default .OUTCHAN
Returns -- arg1
Example: <IMAGE 1>
1
<IMAGE 2>
2
draws an I-beam on an Imlac
IN: Get the object a locative points to
Object-type: SUBR
Category: DATA-HANDLING
Reference: AT, LLOC, GLOC, LEGAL?
Returns the object a locative points to. The only way you can
get an error using IN is to pass it a locative to an LVAL that has
become unbound. Using LEGAL? will save you much grief.
Argument:
Template: #DECL ("VALUE" ANY LOCATIVE)
Argument 1 -- A locative.
Returns -- The object the locative points to.
Example: <SET FOO 69>
<IN <LLOC FOO>>
69
Like LVAL except independent of rebindings of FOO.
INDEX: Return the index part of an OFFSET
Object-type: SUBR
Category: STRUCTURES
Reference: OFFSET, NTH, GET-DECL, PUT-DECL
Given an OFFSET, returns the index part.
Argument:
Template: #DECL ("VALUE" FIX OFFSET)
Argument 1 -- An OFFSET
Returns -- The index field of the OFFSET.
Example: <SET CHNUM <OFFSET 1 '<CHANNEL FIX>>>
%<OFFSET 1 '<CHANNEL FIX>>
<INDEX .CHNUM>
1
Use GET-DECL to get the DECL part of the OFFSET.
INDICATOR: Return the indicator part of an Association triad
Object-type: SUBR
Category: ASSOCIATION
Reference: ASSOCIATIONS, NEXT, ITEM, AVALUE,
GETPROP, GET
Given an ASOC, as returned by ASSOCIATIONS or NEXT, returns the
indicator part of the ASOC triad.
See also ITEM and AVALUE, which return the Item and Value parts
of the triad.
Argument:
Template: #DECL ("VALUE" ANY ASOC)
Argument 1 -- An ASOC whose indicator field to get.
Returns -- The indicator field of the ASOC.
Example: <PUTPROP FOO BAR BLECH>
<ITEM <ASSOCIATIONS>>
FOO
<INDICATOR <ASSOCIATIONS>>
BAR
<AVALUE <ASSOCIATIONS>>
BLECH
ASSOCIATIONS gets newest ASOC.
INSERT: Create an ATOM and put it on an OBLIST
Object-type: SUBR
Category: IDENTIFIER
Reference: ATOM, LOOKUP
INSERT takes as argument a STRING, which will be the PNAME of
a new ATOM on the OBLIST given as the second argument. The ATOM is
returned.
In the special case where the ATOM is not already on an OBLIST,
INSERT will also take an ATOM as argument. In conjunction with REMOVE
this feature may be used to move an ATOM from one OBLIST to another.
Note that if the ATOM with the PNAME given already exists on that
OBLIST, ERROR. See the example for the standard foolproof way to
INSERT.
Argument:
Template: #DECL ("VALUE" ATOM <OR ATOM STRING> OBLIST)
Argument 1 -- A STRING, which is the PNAME of a new ATOM to be
created, or an ATOM on no OBLIST.
Argument 2 -- An OBLIST into which to insert the new ATOM.
Returns -- The newly minted ATOM.
Example: <INSERT "GVAL" <ROOT>>
This will fail, as the ATOM is already there.
<OR <LOOKUP "GVAL" <ROOT>> <INSERT "GVAL" <ROOT>>>
Guaranteed to win.
INT-LEVEL: Read and set the current interrupt level
Object-type: SUBR
Category: INTERRUPT
INT-LEVEL is used to read and set the current interrupt level.
If it is called with no arguments, it simply returns the current level
otherwise it causes its fixed point argument to be the current
interrupt level and returns the previous one.
Note that 0 is the 'normal' int-level, and during handling of an
interrupt, the int-level is set to the priority assigned to the int-
errupt that is being handled.
Argument:
Template: #DECL ("VALUE" FIX "OPTIONAL" FIX)
(Optional)
Argument 1 -- A FIX, which will be the new interrupt level. If not
given, simply returns the current level.
Returns -- A FIX, the interrupt level at the time of the call (ie:
if changed, the old one).
Example: <INT-LEVEL <MIN>>
Cause all interrupts to be deferred.
INTERRUPT: Generate an artificial interrupt
Object-type: SUBR
Category: INTERRUPT
INTERRUPT causes a software interrupt to happen. If the
interrupt has an IHEADER associated with it, either run the handlers
or queue them depending on the INT-LEVEL. If the IHEADER exists
return T, otherwise return #FALSE (). The first argument to INTERRUPT
is either an IHEADER, atom or string specifying the interrupt to do.
The rest of the arguments are applied to the functions associated
with the various handlers.
INTERRUPT is used either to cause a 'software' interrupt (one
identified by a name not normally in the INTERRUPTS OBLIST) or to test
a 'real' interrupt handler.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> <OR IHEADER STRING ATOM> "TUPLE"
<TUPLE [REST ANY]>)
Argument 1 -- An identifier of the interrupt to be generated, either
a STRING, ATOM, or IHEADER.
Tuple of arguments -- The appropriate arguments for the handler for
this interrupt.
Returns -- T if an IHEADER exists for this interrupt, FALSE otherwise.
Example: <INTERRUPT "FOO" 1 2 3>
Causes a FOO interrupt if an IHEADER exists.
INTERRUPTS: Return the INTERRUPTS OBLIST
Object-type: SUBR
Category: INTERRUPT
INTERRUPTS returns the INTERRUPTS oblist. This oblist contains
atoms that are dangerous to play with. These include atoms associated
with interrupts and the special atoms LPROG , LERR and LMAP .
Argument:
Template: #DECL ("VALUE" OBLIST)
Example: <INTERRUPTS>
Only possible invocation.
IPC-HANDLER: Default IPC message handler
Object-type: SUBR
Category: INTERNAL, INTERRUPT, SYSTEM
Reference: IPC-ON, IPC-OFF, SEND, SEND-WAIT
IPC-HANDLER is the default IPC message handler. It prints out
the message, who it is from, the type if non-zero, and who it is to,
if not uname, jname. If the type is 1, and the message is a STRING,
it is parsed and evaluated as well as being printed out. See the
FUNCTION INQUIRE for an application of this feature.
IPC conditions are signalled with arguments as specified in the
'Template' field below.
Argument:
Template: #DECL ("VALUE" ANY <OR STRING UVECTOR STORAGE> FIX STRING STRING
"OPTIONAL" STRING STRING)
(Arguments to any IPC condition handler)
Argument 1 -- The message received. This may be a STRING, a UVECTOR,
of UTYPE primtype FIX, or a STORAGE.
Argument 2 -- The type of the message, a FIX. The interpretation of
this is entirely up to the handler.
Arguments 3 & 4 -- STRINGs specifying whom the message is from.
(Optional)
Arguments 5 & 6 -- STRINGs specifying whom the message is to, if other
than UNAME-JNAME.
Returns -- T
Example: <IPC-HANDLER "HELLO, HOW ARE YOU." 0 "CLR" "MUDDLE">
Just prints this out. Actually you would never see or invoke this
form, since only happens at interrupt level.
IPC-OFF: Stop listening for IPC messages
Object-type: SUBR
Category: SYSTEM
Reference: IPC-ON, IPC-HANDLER, SEND, SEND-WAIT
IPC-OFF causes the MUDDLE to stop listening for messages on the
IPC. The opposite is IPC-ON, which causes the MUDDLE to listen.
Argument:
Template: #DECL ("VALUE" ANY)
Returns -- T
Example: <IPC-OFF>
In virgin MUDDLE, disable default IPC handler, IPC-HANDLER.
IPC-ON: Listen for IPC messages sent to a given pair
Object-type: SUBR
Category: SYSTEM
Reference: IPC-OFF, SEND, SEND-WAIT, IPC-HANDLER
IPC-ON takes two STRINGs as arguments, and listens for IPC
messages addressed to that pair. If they are received, an IPC
condition is signalled. There is a default handler for this condition
called IPC-HANDLER. See its abstract for more details.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" STRING STRING)
(Optional)
Arguments 1 & 2 -- A pair of names to listen on, default UNAME JNAME
of the MUDDLE.
Returns -- ANY
Example: <IPC-ON>
Usually jobs listen on their uname-jname to avoid confusion.
ISTORAGE: Generate a STORAGE by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: STORE
ISTORAGE Return a non-g.c. storage area of given length with
elements generated by repeated evaluation of the second argument.
Storage is normally used for the E&S, since it does not move
during garbage collection.
Note that the repeatedly EVALed argument must return something
suitable to be in a STORAGE (ie, no STRINGs) and also the results must
be of uniform type.
Argument:
Template: #DECL ("VALUE" STORAGE FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements.
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element
default is #LOSE *0*'s.
Returns -- Newly minted STORAGE.
Example: <ISTORAGE 10 '<RANDOM>>
Create a STORAGE with random contents.
ISTRING: Generate a STRING by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: STRING
ISTRING returns a string of given length whose elements are
generated by repeated evaluation of the second argument. Note that
the second argument must return a CHARACTER each time it is EVALed.
Argument:
Template: #DECL ("VALUE" STRING FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements.
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element,
default is ^@'s.
Returns -- Newly baked STRING.
Example: <ISTRING 20 '<CHTYPE <MOD <RANDOM> 128> CHARACTER>>
Note the CHTYPEing to type CHARACTER.
ITEM: Return the item part of an Association triad
Object-type: SUBR
Category: ASSOCIATION
Reference: ASSOCIATIONS, NEXT, AVALUE, INDICATOR,
GETPROP, GET
Given an ASOC, as returned by ASSOCIATIONS or NEXT, returns the
item part of the ASOC triad. See also INDICATOR and AVALUE, which get
the Indicator and Value parts of the triad.
Argument:
Template: #DECL ("VALUE" ANY ASOC)
Argument 1 -- An ASOC whose item field to get.
Returns -- The item field of the ASOC.
Example: <PUTPROP FOO BAR BLECH>
<ITEM <ASSOCIATIONS>>
FOO
<INDICATOR <ASSOCIATIONS>>
BAR
<AVALUE <ASSOCIATIONS>>
BLECH
ASSOCIATONS gets newest ASOC.
ITUPLE: Generate a TUPLE by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: TUPLE
ITUPLE returns a TUPLE (vector on the stack) of given length whose
elements are generated by repeated evaluation of the second argument.
ITUPLE is exactly like IVECTOR, except for the restriction that it may
only be applied at top-level inside the parameter list of a FUNCTION,
in AUX or OPTIONAL atom-value pairs, or at top level inside the atom-
value pairs of PROGs or REPEATs.
Note also that ITUPLE does not compile very well.
Argument:
Template: #DECL ("VALUE" TUPLE FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements.
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element
default is #LOSE *0*'s
Returns -- Newly stacked TUPLE.
Example: <PROG ((A <ITUPLE 4 0>))
<PUT .A 2 3>
(!.A)>
This is a valid usage of ITUPLE.
<DEFINE FOO (A
"AUX" (X
<REST <ITUPLE !.A>>))
.X>
This is not a valid usage of ITUPLE, since the application is not at
top level of the atom-value pair.
IUVECTOR: Generate a UVECTOR by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: UVECTOR
IUVECTOR returns a uniform vector of given length whose elements
are generated by repeated evaluation of the second argument.
Note that the second argument must return objects all the same
type and appropriate to be part of a UVECTOR (ie: no STRINGs).
Argument:
Template: #DECL ("VALUE" UVECTOR FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements.
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element
(must all be of same type) default is #LOSE *0*'s.
Returns -- Newly created UVECTOR.
Example: <PROG ((A 2))
<IUVECTOR 5
'<SET A
<* .A .A>>>>
Powers of 2.
IVECTOR: Generate a VECTOR by repeated Evaluation
Object-type: SUBR
Category: DATA-HANDLING
Reference: VECTOR
IVECTOR returns a vector of given length whose elements are
generated by repeated evaluation of the second argument.
Argument:
Template: #DECL ("VALUE" VECTOR FIX "OPTIONAL" ANY)
Argument 1 -- FIX, number of elements.
(Optional)
Argument 2 -- ANY, expression which when evaled, gives each element
default is #LOSE *0*'s.
Returns -- Newly created VECTOR.
Example: <IVECTOR 5 "ha">
["ha" "ha" "ha" "ha" "ha"]
Comedic vector.
JNAME: Return the Job name of the MUDDLE
Object-type: SUBR
Category: SYSTEM
Reference: UNAME
Returns the JNAME, or Job-name of the MUDDLE. This is a STRING
giving the JNAME, which is the second name of the job in which the
MUDDLE is running. The UNAME (qv) is the first.
Argument:
Template: #DECL ("VALUE" STRING)
Returns -- A STRING which is the JNAME of the job.
Example: <JNAME>
Only possible example.
L=?: Is first argument less than or equal to the second ?
Object-type: SUBR
Category: PREDICATE, ARITHMETIC
Reference: ==?, L?, G?, G=?
This routine tests if the first argument is numerically less
than or equal to the second argument, returning T if it is, #FALSE()
otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE>
<OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT.
Argument 2 -- A FIX or FLOAT.
Returns -- If arg1 <= arg2, T, else #FALSE().
Example: <L=? 2 12>
<L=? -5.7308998 0.95000000E-2>
<L=? 23 23.0>
These will return T.
<L=? 34 -3>
<L=? 13.000100 13>
<L=? -3.9530000 -4.0241000>
These will return #FALSE ().
L?: Is first argument less than the second?
Object-type: SUBR
Category: PREDICATE, ARITHMETIC
Reference: G?, ==?, L=?
This routine tests if the first argument is numerically less
than the second argument.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE>
<OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT.
Argument 2 -- A FIX or FLOAT.
Returns -- T if arg1 < arg2, #FALSE() otherwise.
Example: <L? 1 2>
<L? -2 4.0>
<L? -13.462000 -0.93000000E-1>
These will return T.
<L? -12.340000 -12.340010>
<L? 3.1415899 3.1415899>
These will return #FALSE ().
LEGAL?: Is the argument (TUPLE, FRAME, etc.) legal ?
Object-type: SUBR
Category: PREDICATE
This routine is used to verify the legality of MUDDLE objects.
Although it works for all MUDDLE Types, it is only really useful for
the Types: TUPLE, FRAME, ACTIVATION, ENVIRONMENT, TAG, and LOCD.
For these Types it will return the Atom T if the portion of the
stack in which the given item is found is still active. Otherwise, it
will return #FALSE ().
For any other Type it simply returns the atom T.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY)
Argument 1 -- Any object, but most interestingly, TUPLE, FRAME, TAG
ACTIVATION, ENVIRONMENT and LOCD, which are only legal if the
part of the stack they are 'in' is still active.
Returns -- T if the object is legal (for other than the types listed
above this is always the result), #FALSE() otherwise.
Example: <LEGAL? <PROG ("NAME" FOO) .FOO>>
This will be False, since the activation is not legal outside the PROG.
<PROG ("NAME" FOO) <LEGAL? .FOO>>
However, this will be True, since the activation is legal inside the
PROG.
LENGTH: Number of elements in a structure
Object-type: SUBR
Category: DATA-HANDLING
Reference: LENGTH?
LENGTH returns the number of elements in a structure.
Be careful, LENGTH of a circular list never returns. For such
cases consider LENGTH?, which allows you to specify a maximum length
to check.
Argument:
Template: #DECL ("VALUE" FIX STRUCTURED)
Argument 1 -- Any structured object.
Returns -- FIX, giving number of elements.
Example: <LENGTH <SET X (1 2 3 4 5)>>
5
Winnage.
<LENGTH <PUTREST <REST .X 4> .X>>
Never returns, X is circular now.
LENGTH?: Is a structure less than or equal to a given length?
Object-type: SUBR
Category: DATA-HANDLING
Reference: LENGTH
LENGTH? has a very misleading name. It takes a structured
object and a FIX, and if the length of the s.o. is less than or equal
to the FIX, it returns the length. Otherwise it returns FALSE.
It is very common to see people attempt to program with this
SUBR as though it were equivalent to either <==? <LENGTH s.o.> fix>
or alternatively <G=? <LENGTH s.o.> fix>. Neither of these are what
it does. It is actually closer to <L=? <LENGTH s.o.> fix>.
LENGTH? derives its specialness from the fact that it works
incrementally on LISTs, counting elements until the end is reached or
the count runs out. Thus, LENGTH? will not die horribly on circular
LISTs, which LENGTH will.
Argument:
Template: #DECL ("VALUE" <OR FIX FALSE> STRUCTURED FIX)
Argument 1 -- A Structured Object.
Argument 2 -- A FIX.
Returns -- length of s.o. if less than or equal to FIX, and
FALSE otherwise.
Example: <SET FOO
<PUTREST <REST <SET FOO (1 2 3)> 2>
.FOO>>
Returns circular list.
<LENGTH .FOO>
Will never return.
<LENGTH? .FOO 69>
#FALSE ()
Will work.
LINK: Give an object a synonym
Object-type: SUBR
Category: I/O, IDENTIFIER
LINK gives a MUDDLE expression a synonym. It causes an object
that looks vaguely like an ATOM to be placed in an OBLIST. This type,
LINK, has the property that when it is read, its value is immediately
substituted for what was read. This is particularly useful in inter-
active work with MUDDLE, to avoid having to type long and dull streams
of characters. See 'Example' for the canonication application.
Argument:
Template: #DECL ("VALUE" ANY ANY STRING "OPTIONAL" OBLIST)
Argument 1 -- The expression which is the value of the LINK, and which
is substituted whenever the LINK is read.
Argument 2 -- A STRING giving the 'PNAME' of the LINK (remember, they
are somewhat like ATOMs).
(Optional)
Argument 3 -- An OBLIST for the LINK to live on, default <1 .OBLIST>.
Returns -- Argument 1.
Example: <LINK '<ERRET> "">
Links the ATOM of PNAME ^E to <ERRET>.
LIST: Create a LIST
Object-type: SUBR
Category: DATA-HANDLING
LIST creates a list having explicit elements. Note that this is
a SUBR, so the elements will be evaluated.
Argument:
Template: #DECL ("VALUE" LIST "TUPLE" <TUPLE [REST ANY]>)
Tuple of arguments -- ANY, the elements
Example: <SET X <LIST 1 2 3 4 5>>
equivalent to (1 2 3 4 5)
<==? .X <LIST !.X>>
#FALSE ()
<==? .X (!.X)>
T
Slight difference does exist between explicit application of LIST and
using parens.
LISTEN: Go to a subsidiary READ-EVAL-PRINT loop
Object-type: SUBR
Category: I/O, PROGRAM-CONTROL
Reference: READ, EVAL, PRINT, TTYECHO, ECHOPAIR
LISTEN is seldom called from a program (rather ERROR is), but it
(1) ensures that .INCHAN, .OUTCHAN, and .OBLIST are reasonable
(2) does <TTYECHO .INCHAN T> and <ECHOPAIR .INCHAN .OUTCHAN>
(3) PRINTs its arguments on .OUTCHAN
(4) PRINTs LISTENING-AT-LEVEL l PROCESS p INT-LEVEL i [as appropriate]
(5) Either does <APPLY <VALUE REP>> or drops into a READ-EVAL-PRINT
loop.
Argument:
Template: #DECL ("VALUE" ANY "TUPLE" TUPLE)
Tuple of arguments -- objects to print before listening
Returns -- the argument to ERRET that makes the LISTEN return
Example: <LISTEN "LISTEN UP, YOU YOYOS!">
not an overly stupid example
LLOC: Get a Locative to the LVAL of an ATOM
Object-type: SUBR
Category: DATA-HANDLING
Reference: GLOC
LLOC of an ATOM returns a locative (type LOCD) to the LVAL of
the ATOM in the current environment, or, optionally, if a second arg
is given, the LVAL in that environment. The locative
returned is independent of future rebindings of the ATOM. IN will
always return the same value as long as that binding still exists.
Once it ceases to exist, IN of that locative is no longer LEGAL?.
Argument:
Template: #DECL ("VALUE" LOCD ATOM "OPTIONAL"
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- An ATOM
(Optional)
Argument 2 -- An Environment. If not given, the current one.
Returns -- A locative (type LOCD) to the binding specified.
Example: <PROG ((X 3) (XL <LLOC X>))
<PROG ((X 69105)) <PRINT <IN .XL>>>>
Will always print 3.
LOAD: READ and EVAL every object from a channel
Object-type: SUBR
Category: I/O
Reference: FLOAD, READ, EVAL
LOAD READs and EVALs every object in the file pointed to by
its channel argument, and closes the channel. Control characters in
the file have no special meaning. An oblist can be given for looking
up atoms.
Argument:
Template: #DECL ("VALUE" '"DONE" CHANNEL "OPTIONAL"
<OR OBLIST <LIST [REST <OR OBLIST 'DEFAULT>]>>)
Argument 1 -- the channel to load from
(Optional)
Argument 2 -- (list of) oblist(s) for looking up atoms
Returns -- "DONE"
Example: <LOAD <OPEN "READ" "MANY ATOMS"> <ROOT>>
make yourself root-bound
LOCATIVE?: Is an object a locative?
Object-type: SUBR
Category: TYPE, PREDICATE
Reference: TYPE, STRUCTURED?, APPLICABLE?
LOCATIVE? returns T if its argument is a locative, and FALSE if
it is not. Since most of the locative related SUBRs (such as IN) take
any sort of locative, and since there are several different types of
locatives, it is a useful SUBR.
Argument:
Template: #DECL ("VALUE" <OR FALSE 'T> ANY)
Argument 1 -- Any MUDDLE object.
Returns -- T argument 1 is a locative, or FALSE if it is not.
Example: <LOCATIVE? <GLOC ROOT>>
T
<LOCATIVE? <AT [1 2 3] 1>>
T
<LOCATIVE? <LLOC REDEFINE>>
T
All are locatives.
LOG: Logarithms to the base 'e'
Object-type: SUBR
Category: ARITHMETIC
Reference: EXP
LOG takes a FIX or FLOAT and returns the Logarithm to the base
e of that FIX or FLOAT, as a FLOAT. EXP is the opposite of LOG.
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT to take the LOG of.
Returns -- The log base e of argument 1.
Example: <EXP <LOG 2>>
2.0
Note conversion to floating point number.
LOGOUT: Log out a top-level MUDDLE
Object-type: SUBR
Category: SYSTEM
Reference: VALRET, QUIT
This subr causes the MUDDLE it is in to attempt to log out.
This will only work if the MUDDLE is top-level. Otherwise it will
return FALSE.
Argument:
Template: #DECL ("VALUE" FALSE)
Returns -- A FALSE, if it returns.
Example: <LOGOUT>
Never returns if it wins.
LOOKUP: Look up an ATOM in an OBLIST
Object-type: SUBR
Category: IDENTIFIER
Reference: ATOM, INSERT, OBLIST?
LOOKUP takes the PNAME of an ATOM and an OBLIST as arguments,
and looks to see if an ATOM with that PNAME exists on the OBLIST
given. If one does, it is returned. If not, FALSE.
LOOKUP is often used in conjunction with INSERT.
Argument:
Template: #DECL ("VALUE" <OR ATOM FALSE> STRING OBLIST)
Argument 1 -- A STRING which represents the PNAME of an ATOM.
Argument 2 -- An OBLIST to look up the PNAME in.
Returns -- The ATOM found or FALSE if there wasn't one.
Example: <OR <LOOKUP "FOO" .OB>
<INSERT "FOO" .OB>>
Recommended way of safely inserting ATOMs. Guaranteed to return the
ATOM of pname "FOO".
LPARSE: PARSE several objects into a LIST.
Object-type: SUBR
Category: DATA-HANDLING
Reference: PARSE
PARSE takes from 0 to 5 arguments. If parse is given no arguments,
it returns the first item parsed from the local value of the string
PARSE-STRING, and additionally, sets PARSE-STRING to the string having
those characters which were parsed rested off. If parse is given a
string to parse, the atom, PARSE-STRING, is rebound to the string within
that call. If the parse table argument is given to PARSE, the value of
PARSE-TABLE is rebound to it within that call to PARSE. Finally, PARSE
takes a look ahead character, which is treated as if it were logically
concatenated to the front of the string being parsed. The full callling
sequence of PARSE is:
<PARSE string radixfornumberconversion oblistorlistofoblists
parsetable lookaheadchar>
LPARSE is called exactly the same way as PARSE is called.
It tries to parse the whole string, returning a list of the items
parsed. The same action is taken with respect to optional
arguments and rebindings as is taken by PARSE. All arguments are
optional. The full calling sequence of LPARSE is:
<LPARSE string radixfornumberconversion oblistorlistofoblists
parsetable lookaheadchar>
Argument:
Template: #DECL ("VALUE" LIST "OPTIONAL" STRING
FIX <OR OBLIST
<LIST [REST <OR OBLIST 'DEFAULT>]>>
VECTOR CHARACTER)
(Optional arguments)
Argument 1 -- A STRING to be PARSEd.
Argument 2 -- FIX radix for number conversion.
Argument 3 -- An OBLIST or LIST of OBLISTs.
Argument 4 -- A Parse-table (VECTOR).
Argument 5 -- A CHARACTER for lookahead.
Returns -- A LIST of objects.
Example: <LPARSE "() 1 A">
(() 1 A)
Will return a list of three elements.
LSH: Logical shift
Object-type: SUBR
Category: BIT-TWIDDLING, LOGICAL
Reference: ROT
LSH takes an object of Primtype WORD and a FIX, and it returns a
WORD containing the bits in the first argument, shifted left (positive
argument) or right (negative argument) the number of bits specified by
the second argument (mod 256). Zero bits are brought in at the end
being vacated; bits shifted out at the other end are lost.
Argument:
Template: #DECL ("VALUE" WORD
<PRIMTYPE WORD> FIX)
Arg 1 -- a Primtype WORD containing the bits to shift
Arg 2 -- a FIX specifying the amount to shift
Returns -- A WORD containing the shifted bits.
Example: <LSH 8 6>
#WORD *000000001000*
<LSH 8 -6>
#WORD *000000000000*
Primarily useful for getting fingers directly in the bits.
LVAL: Get the local value of an atom
Object-type: SUBR
Category: IDENTIFIER
Reference: ASSIGNED?, LLOC
LVAL gets the local value of its atom argument, relative to its
environment argument. With only one arg, it can be written .<-atom-> .
Argument:
Template: #DECL ("VALUE" ANY ATOM "OPTIONAL"
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- the atom whose local value is desired
(Optional)
Argument 2 -- the environment in which to find a value
Returns -- the value
Example: .INCHAN
default input channel
MAIN: Returns the main MUDDLE process
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: ME
MAIN returns the initial MUDDLE PROCESS. This is always
PROCESS 1, and cannot be terminated.
Argument:
Template: #DECL ("VALUE" PROCESS)
Returns -- The initial, PROCESS 1, PROCESS of the MUDDLE.
Example: <==? <MAIN> <ME>>
Is the PROCESS I am in the main process?
MANIFEST: Declare the global value of an ATOM to be a constant
Object-type: SUBR
Category: DATA-HANDLING
Reference: MANIFEST?, GDECL
MANIFEST declares that the current global value of an ATOM is
a constant. Any attempt to SETG it will generate an error, assuming
that DECL-checking is on.
MANIFEST is useful to the compiler because if an ATOM is a
constant its value may be placed directly into the RSUBR, and thus
references to it will be considerably faster. Note that manifesting
a FIX will make applications of it (NTH's, that is) open-compile.
It is not usually a good idea to MANIFEST a GVAL that is large
and complex and used by several FUNCTIONs -- each FUNCTION will get
a copy of it in the result RSUBR.
Argument:
Template: #DECL ("VALUE" 'T "TUPLE" <TUPLE [REST ATOM]>)
Tuple of arguments -- ATOMs whose GVALs are constants.
Returns -- T.
Example: <SETG A 1>
<SETG B 2>
<MANIFEST A B>
Most common use of MANIFEST.
MANIFEST?: Has an ATOM been MANIFESTed?
Object-type: SUBR
Category: DATA-HANDLING, PREDICATE
Reference: MANIFEST, UNMANIFEST
MANIFEST? returns T if its argument (an ATOM) has been MANIFESTed,
and #FALSE () otherwise.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ATOM)
Argument 1 -- An ATOM.
Returns -- T if it is MANIFEST, FALSE if it is not.
Example: <SETG FOO 1>
<MANIFEST FOO>
<MANIFEST? FOO>
T
<UNMANIFEST FOO>
<MANIFEST? FOO>
#FALSE ()
Make it a constant, then make it not a constant.
MAPF: Map routine onto elements of structured objects.
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: MAPR, MAPRET, MAPSTOP, MAPLEAVE
This is used to map, or apply, a routine to succesive elements
of one or more structured objects. This routine is the second argument
to MAPF and it must take n args, where n is the number of structured
args supplied to the MAPF. In addition another routine can be supplied
to be applied to the results of all of the previous applications.
Usually this routine will take an arbitrary number of arguments. This
secondary routine is given as the first argument to MAPF. However, if
#FALSE () is supplied as the first argument, this indicates that no
such additional application is desired.
Finally the desired structured arguments for mapping are supplied
after the first two arguments.
The primary routine is repeatedly applied to a bunch of the
successive elements from all the structured objects supplied. The
bunch consists of exactly one element from each of the structured
objects.
The repeated application continues until one of the structured
objects runs out of elements for the application, OR until the MAPF is
stopped within the application by use of the SUBRs MAPSTOP or MAPLEAVE.
Note that at least one such structured object must be supplied.
The value returned by the MAPF is the result returned by the
application of the additional routine, if any.
If the additional routine is not supplied (the first arg is
#FALSE ()), the value returned is the result of the last application
of the primary routine to the last bunch of elements.
Argument:
Template: #DECL ("VALUE" ANY <OR FALSE APPLICABLE> APPLICABLE
"TUPLE" <TUPLE STRUCTURED [REST STRUCTURED]>)
Argument 1 -- An applicable object to be used after the mapping phase
is finished, or a FALSE, to simply finish.
Argument 2 -- An applicable object to apply to the elements of the
structured objects.
Tuple of arguments -- At least one structured object, whose elements
will be passed in order as arguments to the second argument of
MAPF.
Returns -- Either the result of APPLYing the first argument to the
stacked results of the repeated application of the second
argument, or the last thing returned by applying the second
argument, or #FALSE () if all of the structured objects were
empty.
Example: <MAPF ,LIST ,+ '(1 2 3 4) '(10 11 12 13)>
This will perform the element-wise sum of two lists
MAPLEAVE: Leave from the current MAPF/MAPR with a given value.
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: MAPF, MAPR, MAPRET, MAPSTOP
Leaves from the current MAPF/MAPR without doing the normal
application of a routine to the stacked args. If the optional argument
to MAPLEAVE is supplied, it will be the result of the MAPF/MAPR.
If no such argument is supplied the Atom T will be used instead.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" ANY)
(Optional)
Argument 1 -- The result of the MAPF/R. If not given, T will be used.
Returns -- Nothing. Terminates a MAPF/R.
Example: <MAPF <>
<FUNCTION (X)
<COND (<N==? .X 0> <MAPLEAVE .X>)>>
.STRUC>
This example will find and return the first non-zero element of STRUC
MAPR: Map routine onto RESTs of structured objects.
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: MAPF, MAPRET, MAPSTOP, MAPLEAVE
This is used to map, or apply, a routine to succesive RESTs of
one or more structured objects.
Works just like MAPF, see its description, except that instead
of applying the second arg to the elements of the structured objects,
MAPR applys the second arg to the successive RESTs of the structured
objects. This makes it possible to change the arguments that will be
passed to future applications of the second argument before they are
reached.
Argument:
Template: #DECL ("VALUE" ANY <OR FALSE APPLICABLE> APPLICABLE
"TUPLE" <TUPLE STRUCTURED [REST STRUCTURED]>)
Argument 1 -- FALSE or an applicable object to apply to the results
of the repeated applications of the second argument.
Argument 2 -- An applicable object to apply repeatedly to the RESTs of
the remaining arguments.
Tuple of arguments -- At least one structured object to supply RESTs
for the second argument.
Returns -- The result of applying argument 1 to the results of the
repeated applications of argument 2, or the result of the last
such application if argument 1 is FALSE, or #FALSE () if all the
structures were empty and no applications were performed.
Example: <MAPR <>
<FUNCTION (OB)
<PUT .OB 1 <* <1 .OB> 2>>>
.STRUC>
This will change the structure STRUC to contain double its values.
MAPRET: Return an arbitrary number of objects to a MAPF/MAPR.
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: MAPF, MAPR, MAPSTOP, MAPLEAVE
This routine is used to return an arbitrary number of elements
to the current MAPF/R. An invocation of MAPRET ends the current
application of the second argument of MAPF/R. The arguments to MAPRET
are added to the objects being collected to be passed as arguments to
the application of the first argument to MAPF/R.
MAPRET makes it possible to return no arguments or several argu-
ments from one of these intermediate applications.
Argument:
Template: #DECL ("VALUE" ANY "TUPLE" <TUPLE [REST ANY]>)
Tuple of arguments -- Any number of objects to be added to the group
of potential arguments to the ending application of a MAPF/R.
Returns -- Nothing, really, as the application is ended by MAPRET.
Example: <MAPRET>
This is used when one desires to return nothing.
MAPSTOP: Stop looping of the current MAPF/MAPR and do the application.
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: MAPF, MAPR, MAPRET, MAPLEAVE
First this Subr acts like MAPRET and causes an arbitrary number
of MUDDLE objects to be stacked for the current MAPF/MAPR. Then it
stops the normal looping operation of this MAPF/MAPR and causes the
normal application of the previously saved applicative object to the
current group of stacked objects.
The result of this application is then returned as the result
of the MAPF/MAPR.
Argument:
Template: #DECL ("VALUE" ANY "TUPLE" <TUPLE [REST ANY]>)
Tuple of arguments -- Any number of arguments to add to the stacked
objects that the final application will apply to.
Returns -- Nothing, terminates MAPF/R looping.
Example: <PROG ((I 10))
<MAPF ,LIST
<FUNCTION (X)
<COND (<L? <SET I <- .I 1>> 0>
<MAPSTOP>)>
.X>
.STRUC>>
This example produces a list out of the first ten elements of STRUC.
If there are fewer than ten elements in STRUC, then all are used.
MAX: Maximum of a set of numbers
Object-type: SUBR
Category: ARITHMETIC
Reference: MIN
MAX (Maximum) takes any number of FIXes or FLOATs, and returns
the greatest as its result. If any of the arguments are FLOATs, the
result will be FLOAT. If no argument is given, MAX returns the least
floating-point number. If one argument is given, MAX returns that
argument.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT>
"TUPLE" <TUPLE [REST <OR FIX FLOAT>]>)
(Optional)
Tuple of arguments -- FIXes and FLOATs
Returns -- FIX or FLOAT, floating is contagious.
Example: <MAX 1 2.0>
2.0
Floating is contagious.
ME: Returns the process id of the the current process
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: MAIN, RESUMER
ME is similar to MAIN, except that it returns the PROCESS ID of
the process it is evaled in, rather than the initial process.
Argument:
Template: #DECL ("VALUE" PROCESS)
Returns -- The PROCESS Id of the PROCESS it is EVALed in.
Example: <==? <MAIN> <ME>>
Am I the main process?
MEMBER: Is there a similar object in a structure?
Object-type: SUBR
Category: PREDICATE
Reference: MEMQ, =?
MEMBER is used to find a structural copy of an object in a
structure. It takes as arguments and object and a structure. Each
element of the structure is examined in turn, using =?, and if one of
them is =? to the object, the structure is returned, RESTed down to a
point where its first element is the copy.
If no element is structurally identical to the first argument,
#FALSE() is returned.
Argument:
Template: #DECL ("VALUE" <OR FALSE STRUCTURED> ANY STRUCTURED)
Argument 1 -- Any MUDDLE object.
Argument 2 -- A STRUCTURED object.
Returns -- Either the structure RESTed down to the copy, or FALSE if
there is no copy.
Example: <MEMBER 69 [105 104 32 69 81]>
[69 81]
MEMQ would do the same for this example.
<MEMBER "FOO" ["BAR" "FOO" "BLECH"]>
But not for this example. Different strings are =? not ==?.
MEMQ: Is there an identical object in a structure?
Object-type: SUBR
Category: PREDICATE
Reference: MEMBER, ==?
MEMQ is used to find a copy of an object in a structure. It
takes as arguments and object and a structure. Each element of the
structure is examined in turn, using ==?, and if one of them is ==?
to the object, the structure is returned, RESTed down to a point
where its first element is the copy.
If no element is identical to the first argument, #FALSE() is
returned.
Argument:
Template: #DECL ("VALUE" <OR FALSE STRUCTURED> ANY STRUCTURED)
Argument 1 -- Any MUDDLE object.
Argument 2 -- A STRUCTURED object.
Returns -- Either the structure RESTed down to the copy, or FALSE if
there is no copy.
Example: <MEMQ 69 [105 104 32 69 81]>
[69 81]
The copy is now the first element.
MIN: Minumum of a set of numbers
Object-type: SUBR
Category: ARITHMETIC
Reference: MAX
MIN (Minimum) takes any number of FIXes or FLOATs, and returns
the least as the result. If no argument is given, MIN returns the
greatest floating-point number; if one argument is given, MIN returns
that argument.
If any of the arguments is a FLOAT, the result will be a FLOAT,
no matter what type it was originally.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT>
"TUPLE" <TUPLE [REST <OR FIX FLOAT>]>)
(Optional)
Tuple of arguments -- FIXes and FLOATs
Returns -- FIX or FLOAT, depending on whether any args were FLOAT.
Example: <MIN 1 2.0>
1.0
Takes any number of args
MOBLIST: Create an OBLIST
Object-type: SUBR
Category: DATA-HANDLING
Reference: BLOCK
MOBLIST creates an oblist--repository for atoms. It is not put
anywhere automatically. If the user wants it in his oblist path, that
must be done explicitly, as in the example.
Note that it is the location of the ATOM passed as argument to
MOBLIST that determines where the new OBLIST will exist.
An association is automatically created for the oblist under the
atom and the indicator OBLIST. Note that this association is checked
by MOBLIST, and a new OBLIST will not be created if one already exists
with the name given.
Argument:
Template: #DECL ("VALUE" OBLIST ATOM "OPTIONAL" FIX)
Argument 1 -- ATOM, name of OBLIST.
(Optional)
Argument 2 -- FIX, number of hashing buckets, default 13
Returns -- New OBLIST, or old one if one already exists with that name.
Example: <PROG ((OBLIST (<MOBLIST MY-OBLIST> !.OBLIST)))
AN-ATOM!-MY-OBLIST
<GET MY-OBLIST OBLIST>>
The oblist is placed in the path by the setting of the atom OBLIST
MOD: Take a number modulus another number
Object-type: SUBR
Category: ARITHMETIC
MOD (Modulus) takes two FIXes and returns the remainder when the
first is divided by the second. This is the standard arithmetic Mod
operation.
Argument:
Template: #DECL ("VALUE" FIX FIX FIX)
Argument 1 -- A FIX.
Argument 2 -- A FIX.
Returns -- FIX, remainder of argument 1 divided by argument 2.
Example: <MOD <RANDOM> 30>
How to get a random number between 0 and 30.
MONAD?: Will NTH and REST fail on this object?
Object-type: SUBR
Category: PREDICATE
Reference: STRUCTURED?, EMPTY?
MONAD? returns T if and only if NTH and REST will fail on the
object passed as its argument. Obviously this is true of any non-
structured object, but additionally, MONAD? returns T if its argument
is an empty structured object.
MONAD? is thus similar to ORing <NOT <STRUCTURED? object>> and
<EMPTY? object>.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY)
Argument 1 -- Any MUDDLE object.
Returns -- T if NTH and REST will not work on the object, FALSE if
they will work.
Example: <OR <NOT <STRUCTURED? .FOO>>
<EMPTY? .FOO>>
<MONAD? .FOO>
Result is the same for these two forms.
N==?: Test for physical non-identity of two objects.
Object-type: SUBR
Category: PREDICATE
Reference: =?, ==?
N==? is the logical complement of ==?. For every case in which
==? would return T, N==? returns #FALSE() and vice versa.
==? tests two objects for physical identity. For ==? to return
T (true), the two objects must have the same identical type-value pair.
For example, two STRINGs typed in from the console will not be ==?, but
two ATOMS, FIXes, or nil LISTs will be.
If the two objects are not the same, ==? returns FALSE.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY ANY)
Argument 1 -- Any object.
Argument 2 -- Another object.
Returns -- T if the two objects are different objects, FALSE otherwise.
Example: <N==? "FOO" "FOO">
T
These two STRINGs look identical, but are not.
N=?: Test for structural non-identity of two objects.
Object-type: SUBR
Category: PREDICATE
Reference: =?, N==?
N=? is the logical complement of =?. For every case in which
N==? returns T, =? would have returned FALSE, and vice versa.
=? is a less stringent, but more expensive, test for identity
than ==?. It also takes two objects as arguments, but tests only for
structural identity of the objects, rather than physical identity. If
two objects print the same, they will be =? to each other, except for
numeric fuzz. For example, two STRINGs typed in from the console will
be =? to each other, but not ==?. Any objects that are ==? will also
be =?, and if ==? applies, it should be used. =? is much more
expensive than ==?, in general, as it must test an entire structure
piece by piece.
=? returns T if the objects are structurally identical, and FALSE if
they are not.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY ANY)
Argument 1 -- Any object.
Argument 2 -- Any other object.
Returns -- T if the arguments are not structurally equal, FALSE if they
are.
Example: <N=? <SET V <VECTOR 1 2 3>> <EVAL .V>>
#FALSE ()
If the test were =?, the result would be T.
NETACC: Network Listening socket accept
Object-type: SUBR
Category: NETWORK
Reference: OPEN, NETSTATE, NETS
NETACC takes a network listening socket and accepts a connection.
It will return FALSE if the connection is in the wrong state.
Argument:
Template: #DECL ("VALUE" <OR FALSE CHANNEL> CHANNEL)
Argument 1 -- A Network channel (a listening socket).
Returns -- The channel, or FALSE if it is in the wrong state.
Example: <NETACC <OPEN "READ" -1 -1 "NET">>
Accept the listening socket.
NETS: Force out the Network buffers of a Network channel
Object-type: SUBR
Category: NETWORK
Reference: OPEN, NETSTATE, NETACC
NETS forces any system buffered network output to be sent. The ITS
system normally does this every 1/2 second anyway. Note that this is
similar to the function of BUFOUT for normal channels but more thorough.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL)
Argument 1 -- A Network channel.
Returns -- The Network channel, with buffers output.
Example: <NETS .NETCHAN>
What else?
NETSTATE: Return the state of an ARPA-net connection
Object-type: SUBR
Category: NETWORK
Reference: OPEN, NETACC, NETS
NETSTATE returns a UVECTOR of three elements. The first is the
state of the connection, the second is a code specifying why a connection
was closed, and the last is the number of bits available for input.
The meaning of the state and close codes is specified in the
documentation of the ITS NCP (Network Control Program).
Argument:
Template: #DECL ("VALUE" <UVECTOR FIX FIX FIX> CHANNEL)
Argument 1 -- A MUDDLE channel open to the NETWORK.
Returns -- A UVECTOR containing 3 FIXes, a connection state, a close
code, and the number of bits available on the connection for
input.
Example: <NETSTATE <OPEN "READ" -1 -1 "NET">>
Give state of a network channel open for listening.
NEWTYPE: Create a new MUDDLE type
Object-type: SUBR
Category: TYPE-DEFINITION
Reference: ALLTYPES
NEWTYPE creates and specifies a new MUDDLE type. It takes the
name of the new type (an ATOM), the primtype of the new type (also an
ATOM), and optionally, the DECL of the new type.
A new type will print as:
#<name of type> <print representation of primtype>
For example, a <NEWTYPE FOO LIST> would make FOOs that print as:
#FOO ()
The new type is added to the type vector (as returned by ALLTYPES),
and becomes legal to DECL, etc. Note that a newtype is not given the
EVALTYPE, APPLYTYPE and so on of its primtype! If you wish it to have
these you must explicitly give them to it. For example, the type FOO
above, when EVALed, will not generate a new FOO with the elements
EVALed. To cause this to happen you must say <EVALTYPE FOO LIST>.
The third (optional) argument allows you to more strongly specify
the makeup of the new type. It is a DECL-body, and it will be assoc-
itated with the type-name under the indicator DECL. Each type an
object is CHTYPEd to the newtype it will be checked against the DECL,
and ERROR will occur if they don't match.
NEWTYPE returns the ATOM given as the name of the new type.
Argument:
Template: #DECL ("VALUE" ATOM ATOM ATOM
"OPTIONAL" <OR ATOM <FORM 'QUOTE FORM>>)
Argument 1 -- The ATOM name of the new type.
Argument 2 -- The ATOM name of the primtype of the new type.
(Optional)
Argument 3 -- The DECL of the new type.
Returns -- The name of the new type (arg 1).
Example: [<NEWTYPE BAR LIST>
"Simple newtype"
<NEWTYPE BAR
LIST
'<<PRIMTYPE LIST> BAR [REST FIX FLOAT]>>
"More strongly specified, even recursive."]
NEXT: Access the next Association in the Association chain.
Object-type: SUBR
Category: ASSOCIATION
Reference: ASSOCIATIONS, AVALUE, INDICATOR, ITEM
NEXT returns the next Association in the association chain, given
an ASOC. It is used to access associations further down the chain
than the first, which must be gotten with ASSOCIATIONS. Applying NEXT
to the last association in the chain will return FALSE.
ASSOCIATIONS gives the user access to the association chain in
much the same way as FRAME gives access to the stack. ASSOCIATIONS
returns the first association triad (item, indicator, value) in the
chain, as a type ASOC, which looks, but doesn't behave like, a LIST.
An ASOC may be passed to ITEM, INDICATOR, or AVALUE to retrieve
the elements of a triad, or to NEXT to retrieve the next association
in the chain.
Argument:
Template: #DECL ("VALUE" <OR FALSE ASOC> ASOC)
Argument 1 -- An ASOC, as returned by NEXT or ASSOCIATIONS.
Returns -- The next association in the association chain, or FALSE if
NEXT was passed the last association.
Example: <NEXT <ASSOCIATIONS>>
Get second association in chain.
NEXTCHR: Return the next input character from an I/O channel
Object-type: SUBR
Category: I/O
Reference: READCHR
NEXTCHR returns the character which READCHR will return the
next time it is called. Successive calls, with no intervening input
operations, all return the same thing.
Argument:
Template: #DECL ("VALUE" <OR CHARACTER FIX> "OPTIONAL" CHANNEL
ANY)
(Optional)
Argument 1 -- the channel
Argument 2 -- object to eval and return at end of file
Returns -- the next character (-1 if empty STY device)
Example: <NEXTCHR>
!\
what you get if called by itself
NOT: Change the truth value of an object to its complement
Object-type: SUBR
Category: LOGICAL, CONDITIONAL
Reference: AND, OR, COND
NOT complements the truth value of its argument. If its
argument was a FALSE, NOT returns T, if its argument was non-FALSE,
NOT returns a FALSE.
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE> ANY)
Argument 1 -- ANY object.
Returns -- The logical complement of the truth value of the object.
Example: <NOT <NOT #FALSE ("FILE NOT FOUND")>>
#FALSE ()
Note the loss of detail in complementing the complement.
NTH: Get the Nth element of a structure
Object-type: SUBR
Category: DATA-HANDLING
Reference: APPLY
NTH returns the n'th element of a stucture. It takes the
structure and the number of the element to return, where 1 is the
first element, and so on.
If the structure does not have an Nth element, an ERROR occurs.
LENGTH can be used to help find out if a structure has an Nth element.
Note that NTH is cheap on VECTORs, UVECTORs and such, and
expensive on LISTs.
An application of a FIX, or something that EVALs to a FIX, to
a structure is equivalent to an application of NTH, assuming that the
order of evaluation is not important:
<NTH .X 1>
and <1 .X>
are equivalent, but
<NTH .X <LENGTH <SET X .Y>>>
and <<LENGTH <SET X .Y>> .X>
are not equivalent, the order of evaluation makes a difference.
Argument:
Template: #DECL ("VALUE" ANY STRUCTURED "OPTIONAL" FIX)
Argument 1 -- A Structured object.
(Optional)
Argument 2 -- A FIX, the element number to return, default 1.
Returns -- The contents of the Arg-2th element of the structure.
Example: <2 (4 5 6)>
<NTH (4 5 6) 2>
The first is equivalent to the second as long
as order of evaluation makes no difference.
OBLIST?: Return the OBLIST that contains a given ATOM
Object-type: SUBR
Category: IDENTIFIER, CONDITIONAL
Reference: INSERT, ATOM, REMOVE
OBLIST? returns the OBLIST that contains a given ATOM, or FALSE
if the ATOM is not on an OBLIST (hence the ?). It is usually used for
the first purpose (to find out what OBLIST an ATOM is on).
Argument:
Template: #DECL ("VALUE" <OR OBLIST FALSE> ATOM)
Argument 1 -- An ATOM.
Returns -- Either the OBLIST that ATOM is on, or FALSE if it is not on
any OBLIST.
Example: <OBLIST? FOO>
...SOME OBLIST....
<OBLIST? <REMOVE FOO>>
#FALSE ()
If you type in the ATOM as part of the form, it will naturally be on
an OBLIST.
OFF: Turn off an interrupt IHEADER or HANDLER
Object-type: SUBR
Category: INTERRUPT
OFF permits the user to remove an IHEADER or HANDLER. OFFing the
IHEADER causes MUDDLE to completely ignore the interrupt and OFFing a
HANDLER causes the function associated with that particular HANDLER
not to be run.
OFF may also be used with strings or atoms to identify IHEADERs
as in EVENT. As usual "CHAR" requires the channel as an additional
argument, and "READ" and "WRITE" require the locative as an
additional argument.
Argument:
Template: #DECL ("VALUE" <OR FALSE IHEADER HANDLER>
<OR IHEADER HANDLER STRING ATOM> "OPTIONAL"
<OR CHANNEL LOCATIVE>)
Argument 1 -- An IHEADER, HANDLER, STRING or ATOM identifying exactly
what interrupt or interrupt handler to remove.
(Optional)
Argument 2 -- If the CHAR interrupt is the one being OFFed, the
channel is also needed with which the interrupt was paired.
If the READ or WRITE interrupt is the one being OFFed, the
locative is also needed with which the interrupt was paired.
Returns -- The OFFed IHEADER or HANDLER, if successful, or FALSE if
there was nothing to remove.
Example: <OFF "CLOCK">
Turns off the CLOCK interrupt.
OFFSET: Create an OFFSET
Object-type: SUBR
Category: STRUCTURES
Reference: NTH, INDEX, GET-DECL, PUT-DECL
An OFFSET is a "frozen" NTH. Given a fix and a DECL, it creates
an APPLICABLE object which may be applied to structures to get the fixth
element or to a structure and an object to change the fixth element to
be the object.
Argument:
Template: #DECL ("VALUE" OFFSET FIX <OR ATOM FORM>)
Argument 1 -- The element of the structure the offset refers to.
Argument 2 -- A DECL which describes the structure (the entire structure,
not the element) the offset is an offset into.
Returns -- The OFFSET.
Example: <SET O <OFFSET 1 '<CHANNEL FIX>>>
%<OFFSET 1 '<CHANNEL FIX>>
ON: Create and turn on an interrupt handler
Object-type: SUBR
Category: INTERRUPT
Reference: OFF, EVENT, HANDLER
ON is equivalent to a call to EVENT followed by a call to HANDLER.
It causes an interrupt handler to be created and added to the list of
handlers for a given interrupt.
<ON "CLOCK" ,FOO 1 ,P>
is equivalent to
<HANDLER <EVENT "CLOCK" 1> ,FOO ,P>
In the case of "CHAR" or "READ"/"WRITE", the channel or
locative is the last argument. In this case the process argument may
be zero and is equivalent to no process being given.
Argument:
Template: #DECL ("VALUE" HANDLER <OR STRING ATOM> APPLICABLE FIX "OPTIONAL"
<OR FIX PROCESS> <OR CHANNEL LOCATIVE>)
Argument 1 -- The name of the interrupt. Note that if it is not one
of the existing interrupts in the INTERRUPTS OBLIST, no ERROR,
the interrupt is assumed to be a software one!
Argument 2 -- An APPLICABLE, to be called with the appropriate number
of arguments when the interrupt occurs.
Argument 3 -- The priority of the interrupt.
(Optional)
Argument 4 -- the PROCESS in which to run the interrupt, 0 means the
running one.
Argument 5 -- If a "CHAR" interrupt, the CHANNEL.
If a "READ" or "WRITE" interrupt, the LOCATIVE.
Returns -- The HANDLER for the interrupt.
Example: <ON "CLOCK" <FUNCTION () <PRINC " TICK ">> 1>
OPEN-NR: Create and open an I/O channel without changing file's reference date
Object-type: SUBR
Category: I/O
Reference: OPEN
OPEN-NR is the same as OPEN (q.v.), except that the date of last
reference of the opened file is not changed.
Argument:
Template: #DECL ("VALUE" <OR CHANNEL <FALSE STRING STRING FIX>>
"OPTIONAL" STRING "TUPLE" TUPLE)
(Optional)
Argument 1 -- mode
Tuple of arguments -- 'file specification'
Returns -- channel or false giving reason for failure & filename
Example: <OPEN-NR "READ" "OLD FILE">
so it will be reaped sooner
OPEN: Create and open an I/O channel
Object-type: SUBR
Category: I/O
Reference: CHANNEL, RESET
OPEN creates a channel for subsequent input or output.
All arguments are optional. The first arg is the mode for the channel,
a string from the list ("READ" "PRINT" "READB" "PRINTB" "PRINTO"
"DISPLAY"), default "READ". The other arguments specify the file
or other 'external storage medium' involved. These can be:
. a string giving the complete file name
. several strings giving name1, name2, device, and directory
. the string "INT:" and a function, a source or sink for characters
. two fixes, the string "NET", and two more fixes
Omitted parts of the file specification follow these defaults:
<VALUE NM1>, if any, else "INPUT"
<VALUE NM2>, if any, else ">"
<VALUE DEV>, if any, else "DSK"
<VALUE SNM>, if any, else the 'working directory'
For more details, see the manual, SYS.11.01.
Argument:
Template: #DECL ("VALUE" <OR CHANNEL <FALSE STRING STRING FIX>>
"OPTIONAL" STRING "TUPLE" TUPLE)
(Optional)
Argument 1 -- mode
Tuple of arguments -- 'file' specification
Returns -- a channel or a false giving the reason for failure & filename
Example: <OPEN "PRINT" "TPL:">
Make a channel for line-printer output.
OR: Logical OR of its arguments.
Object-type: FSUBR
Category: PREDICATE, PROGRAM-CONTROL
Reference: COND, AND, OR?
OR is an FSUBR that evaluates its arguments, one by one, until
either one of them returns a non-FALSE or it runs out of arguments.
The fact that it is an FSUBR means that it can be used as a
miniature COND. A construct of the form <OR preconditions thing> will
allow 'thing' to be executed only if 'preconditions' is false. In
combination with AND, fairly powerful constructs can be generated.
OR takes any number of arguments, returning either the result of
its last evaluation (#FALSE () if no arguments were given) or the
non-FALSE that caused it to complete.
Argument:
Template: #DECL ("VALUE" <OR FALSE ANY> "ARGS" LIST)
List of arguments -- ANY evalable objects.
Returns -- Terminating non-FALSE or FALSE if all elements were FALSE.
Example: <OR <LOOKUP "FOO" <ROOT>> <INSERT "FOO" <ROOT>>>
This construct only attempts to insert FOO in the ROOT if it is not
already there, avoiding the possibility of an ERROR.
OR?: Logical OR of its arguments, evaluated at call time
Object-type: SUBR
Category: PREDICATE, PROGRAM-CONTROL
Reference: AND?, OR, MAPF, MAPR
OR is a SUBR that looks at its arguments, one by one, until
either one of them is a non-FALSE or it runs out of arguments.
The fact that it is a SUBR means that it can be used as a
first argument to MAPF or MAPR.
OR takes any number of arguments, returning either
its last argument (#FALSE () if no arguments were given) or the
non-FALSE that caused it to complete.
Argument:
Template: #DECL ("VALUE" <OR FALSE ANY> "TUPLE" TUPLE)
Tuple of arguments -- ANY objects.
Returns -- Terminating non-FALSE or FALSE if all elements were FALSE.
Example: <MAPF ,OR? <FUNCTION (T) <G? .T 0>> .VECTOR>
Is any element of VECTOR positive?
ORB: Bitwise logical OR
Object-type: SUBR
Category: ARITHMETIC, BIT-TWIDDLING
Reference: EQVB, XORB, ANDB
ORB takes any number of objects of Primtype WORD, and returns
a WORD containing the bitwise logical OR of the arguments.
Argument:
Template: #DECL ("VALUE" WORD
"TUPLE" <TUPLE [REST <PRIMTYPE WORD>]>)
Tuple of arguments -- Objects of primtype WORD to be ORed together.
Returns -- A WORD containing the bitwise OR of the arguments.
Example: <ORB #WORD *000000000001*
#WORD *000000000001*
#WORD *000000042260*>
#WORD *000000042261*
Primarily useful for getting fingers directly in the bits.
OVERFLOW: Enable or disable overflow error
Object-type: SUBR
Category: ARITHMETIC
Reference: +, -, *, /
OVERFLOW disables or enables -- if its argument is a FALSE or not,
respectively -- overflow and underflow errors caused by arithmetic
SUBRs. Initially these errors are enabled.
Argument:
Template: #DECL ("VALUE" <OR 'T '#FALSE ()>
"OPTIONAL" <OR ANY FALSE>)
(Optional)
Argument 1 -- whether or not to enable over/underflow errors
Returns -- the previous state, initially true, or current state if no arg
Example: <OVERFLOW T>
the initial state
PARSE: Parse a string into a MUDDLE object
Object-type: SUBR
Category: DATA-HANDLING
Reference: UNPARSE, LPARSE
Parse a string into a MUDDLE object, just like reading from a
string instead of a channel.
PARSE takes from 0 to 5 arguments. If parse is given no arguments,
it returns the first item parsed from the local value of the string
PARSE-STRING, and additionally, sets PARSE-STRING to the string having
those characters which were parsed rested off. If parse is given a
string to parse, the atom, PARSE-STRING, is rebound to the string within
that call. If the parse table argument is given to PARSE, the value of
PARSE-TABLE is rebound to it within that call to PARSE. Finally, PARSE
takes a look ahead character, which is treated as if it were logically
concatenated to the front of the string being parsed. The full calling
sequence of PARSE is:
<PARSE string radixfornumberconversion oblistorlistofoblists
parsetable lookaheadchar>
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" STRING
FIX <OR OBLIST
<LIST [REST <OR OBLIST 'DEFAULT>]>>
VECTOR CHARACTER)
(Optional)
Argument 1 -- STRING to parse, if not given, LVAL of PARSE-STRING.
Argument 2 -- FIX, radix for number conversion.
Argument 3 -- An OBLIST or LIST of OBLISTs.
Argument 4 -- A parse-table.
Argument 5 -- A prefix character.
Returns -- A MUDDLE object.
Example: <PARSE "<+ 1 2>">
Returns the FORM <+ 1 2>.
PCODE: Create pointer to pure RSUBR code
Object-type: SUBR
Category: UTILITY
PCODE returns a pure code vector for an RSUBR, given a name
in the internal table of pure RSUBRs and the offset in the block of
code where the RSUBR entry point is. It is most often seen when
a pure code vector is output, as %<PCODE "&" &>.
Argument:
Template: #DECL ("VALUE" PCODE STRING FIX)
Argument 1 -- name in pure-RSUBR table
Argument 2 -- offset in the code
Returns -- a pure code vector
Example: <PCODE "PPRINT" 0>
Calls like this fill FBIN files.
PNAME: Create a distinct STRING which is the name of an ATOM
Object-type: SUBR
Category: IDENTIFIER
Reference: ATOM, INSERT, SPNAME
PNAME takes as argument an ATOM, and returns the STRING which
is the PNAME (printing name) of that ATOM. This name does not include
any oblist trailers or the backslashes that are sometimes printed out
for the convenience of the reader. Several other SUBRs, notably
INSERT, LOOKUP, and ATOM, use the pname of atoms as arguments.
PRINC of the PNAME of an ATOM is one guaranteed way of printing
an ATOM-name without trailers, backslashes, or quotes.
Argument:
Template: #DECL ("VALUE" STRING ATOM)
Argument 1 -- An ATOM.
Returns -- A STRING which contains the atom's pname.
Example: <PNAME \ \ \ !-FOO!-BAR>
Just three spaces, no backslashes, no trailers.
PRIMTYPE-C: Get a primtype code for an object
Object-type: SUBR
Category: TYPE-DEFINITION
Reference: PRIMTYPE TYPE-C
PRIMTYPE-C returns the 'storage type code' for an object.
This gives no more info than PRIMTYPE (q.v.), except for TEMPLATEs:
each TYPE of TEMPLATE has a different PRIMTYPE-C.
Argument:
Template: #DECL ("VALUE" PRIMTYPE-C ATOM)
Argument 1 -- the type to get a code for
Returns -- a 'storage type code'
Example: <PRIMTYPE-C <NEWTYPE FOO TEMPLATE>>
returns a 'storage type code' for my template
PRIMTYPE: Return the primitive type of an object
Object-type: SUBR
Category: TYPE
Reference: UTYPE, TYPE, TYPEPRIM
PRIMTYPE is applied to any MUDDLE object to return an ATOM which
is the name of the PRIMITIVE type of that object. TYPE, which is
similar, returns the type of the object given. TYPEPRIM returns the
primitive type given the name of the type.
Argument:
Template: #DECL ("VALUE" ATOM ANY)
Argument 1 -- Any MUDDLE object.
Returns -- ATOM, the name of the primitive type of the argument.
Example: <TYPE 1>
FIX
<PRIMTYPE 1>
WORD
PRIMTYPE will obviously return the same result for a larger class of
objects than will TYPE.
PRIN1: Print an object on an I/O channel
Object-type: SUBR
Category: I/O
Reference: PRINT
PRIN1 is exactly like PRINT (q.v.) except that it omits the new-line
before and the space afterward.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL" CHANNEL)
Argument 1 -- the object
(Optional)
Argument 2 -- the output channel, default .OUTCHAN
Returns -- the object
Example: <PRIN1 .X>
boring example, sorry
PRINC: Print an object on an I/O channel without indicators
Object-type: SUBR
Category: I/O
Reference: PRIN1, PRINT
PRINC is exactly like PRIN1 (q.v.) except that it omits "s around
strings, !\s before characters, and \s and trailers for atoms.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL" CHANNEL)
Argument 1 -- the object
(Optional)
Argument 2 -- the output channel, default .OUTCHAN
Returns -- the object
Example: <PROG ()
<TERPRI>
<PRINC "LISTENING-AT-LEVEL MEZZANINE PROCESS CHEESE">
<TERPRI>>
Amaze your friends!
PRINT: Print an object on an I/O channel on a new line
Object-type: SUBR
Category: I/O
PRINT outputs the character representation (unparsing) of its first
argument, preceded by carriage-return/line-feed and succeeded by a space.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL" CHANNEL)
Argument 1 -- the object
(Optional)
Argument 2 -- the output channel, default .OUTCHAN
Returns -- the object
Example: <PRINT .X>
not a very wonderful example
PRINTB: Write binary words on an I/O channel
Object-type: SUBR
Category: I/O
PRINTB writes the entire contents of its first argument into a given
channel, as 36-bit binary words.
Argument:
Template: #DECL ("VALUE" <OR UVECTOR STORAGE>
<<OR UVECTOR STORAGE> [REST <PRIMTYPE WORD>]> CHANNEL)
Argument 1 -- the buffer whose contents to write
Argument 2 -- the output channel, open in PRINTB or PRINTO mode
Returns -- arg1
Example: <PRINTB .BUFFER .PRINTB-CHNL>
Can't use a console channel.
PRINTSTRING: Write contents of string on an I/O channel
Object-type: SUBR
Category: I/O
PRINTSTRING writes the entire contents or initial characters of a
string on a given channel. The output appears identical to that
produced by PRINC.
Argument:
Template: #DECL ("VALUE" FIX STRING "OPTIONAL" CHANNEL FIX)
Argument 1 -- the string to write out
(Optional)
Argument 2 -- the output channel, default .OUTCHAN
Argument 3 -- number of characters to output, default all
Returns -- number of characters output
Example: <READSTRING .TRASH
.STY-IN
<PRINTSTRING "HI THERE!" .STY-OUT>>
Suck out the echoed characters on your pseudo-console.
PRINTTYPE: Change or examine the way a TYPE is PRINTed
Object-type: SUBR
Category: TYPE-MANIPULATION, PROGRAM-CONTROL, I/O
Reference: PRINT
Changes the way a specific type is PRINTed, by either mapping
it into another type, or giving an explicit method via an APPLICABLE.
If a type is given, the type being changed will be PRINTed in the
same manner as that type. Note that in this case the two types must
be of the same PRIMTYPE or else ERROR.
If an APPLICABLE is given, it should take one argument, which
will be the object being PRINTed. If ,PRINT is given, the type will
receive no special treatment in printing.
If no second argument is given, PRINTTYPE returns the last arg
given it for that TYPE, or else #FALSE () if the type is receiving no
special treatment in printing.
Argument:
Template: #DECL ("VALUE" <OR ATOM APPLICABLE FALSE> ATOM "OPTIONAL"
<OR ATOM APPLICABLE>)
Argument 1 -- The type whose PRINTTYPE to change or examine.
(Optional)
Argument 2 -- A TYPE (which means 'Print like this type'), or an
APPLICABLE (meaning 'use this when you PRINT this type').
Returns -- The TYPE which was changed or, if no arg 2, the way the
TYPE is being printed.
Example: <PRINTTYPE FORM LIST>
Combine with example for EVALTYPE and make MUDDLE look like LISP.
<PRINTTYPE FORM <FUNCTION (X) <PRINC "FOO">>>
Confuse your friends.
PROCESS: Create a new PROCESS
Object-type: SUBR
Category: TYPE-MANIPULATION, PROCESS-CONTROL
Reference: RESUME, STATE
PROCESS creates a new PROCESS with a given start up function.
This must be an APPLICABLE of one argument, which must be evaled.
If the starter of a PROCESS ever returns a value, that PROCESS is DEAD.
Note that creating a PROCESS will often cause a GC.
Argument:
Template: #DECL ("VALUE" PROCESS APPLICABLE)
Argument 1 -- An APPLICABLE which takes a single evaluated argument.
Returns -- A new PROCESS.
Example:
<SET P <PROCESS ,LISTEN>>
Creates a process which is a read-eval-print loop like <MAIN>.
<STATE .P>
RUNABLE
Means P has never run.
<RESUME T .P>
Starts it.
To treat a process like a simple function:
<RESUME T <PROCESS <FUNCTION (X) .X>>>
Starts it, returns the result of applying arg1 (T) to the function,
and then dies.
PROG: Execute sequential expressions
Object-type: FSUBR
Category: PROGRAM-CONTROL
Reference: REPEAT
This FSUBR is used to bind variables and sequentially execute
MUDDLE expressions and perform appropriate GOs, RETURNs, and AGAINs.
If the first argument to PROG is an atom, it is bound to the
Activation of the PROG.
Otherwise the next object must be the argument list of the PROG.
It contains either Atoms or Lists of an Atom and a MUDDLE expression.
Each single Atom in the argument list is Bound but not Assigned. Each
'listified' Atom is Bound and Assigned to the evaluation of the MUDDLE
expression which appears with it.
If the next argument to the PROG is of type DECL, it is used as
the declaration for the variables of the PROG.
The remaining arguments, at least one must exist, constitute the
body of the PROG. They are executed in sequence with the value of the
last being the value for the entire PROG, unless a RETURN from the
activation of the PROG (explicit or with only one argument) is done.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" <LIST ATOM LIST DECL ANY>)
Optional argument 1 -- An ATOM, to bind the activation of the PROG to.
Argument 2 -- A parameter LIST.
Optional argument 3 -- The DECL of the PROG.
Remainder of arguments -- At least one object, to be sequentially evaled.
Returns -- The last thing evaled in the PROG, or the argument to a
RETURN within the PROG.
Example: <PROG ((C <OPEN "READ" "FOO BAR">))
<COND (.C
<FOO>
<CLOSE .C>)>>
This will FOO only if the file FOO BAR exists.
PURIFY: Purify objects everywhere
Object-type: SUBR
Category: UTILITY
Reference: SUBSTITUTE, FSAVE, RESTORE
PURIFY causes a mini-GC, like SUBSTITUTE, resulting in its args
becoming pure and sharable, and ignored by the garbage collector.
No arg can live on the stack or be of primtype process, locd, or
asoc. Sharing between jobs/forks actually occurs after FSAVE/RESTORE.
Argument:
Template: #DECL ("VALUE" ANY "TUPLE" TUPLE)
Tuple of Arguments -- the objects to be purified, not RSUBRs
Returns -- its last arg, now pure
Example: <PURIFY .GROUP>
OK if no RSUBRs in the group
PUT-DECL: Give a value a DECL or change the existing one
Object-type: SUBR
Category: DATA-HANDLING
Reference: GET-DECL
PUT-DECL gives a DECL to a global or local value, or changes
the existing DECL. It takes a locative to the value and a DECL, which
cannot be FALSE or MANIFEST. It modifies the DECL of the value to
be that second argument.
Note that the new DECL must correspond with the type of the
value, if <DECL-CHECK> is T. For example, if the value is a FIX, you
cannot change the DECL to be VECTOR, without first changing the value.
PUT-DECL may also be used to make a new OFFSET from an old one, given
a new DECL part for the OFFSET.
Argument:
Template: #DECL ("VALUE" LOCD <OR LOCD OFFSET> <OR ATOM <FORM 'QUOTE FORM>>)
Argument 1 -- A locative to a value of an ATOM, or an OFFSET.
Argument 2 -- A new DECL for that value, or a new OFFSET.
Returns -- Argument 1.
Example: <SETG FOO 1>
1
<GDECL (FOO) <PRIMTYPE WORD>>
T
<GET-DECL <GLOC FOO>>
<PRIMTYPE WORD>
<PUT-DECL <GLOC FOO> FIX>
returns locative here
<PUT-DECL <GLOC FOO> VECTOR>
here ERROR, type mismatch, as GVAL of FOO is FIX.
<PUT-DECL <SET X <OFFSET 1 '<FOO FIX>>> '<CHANNEL FIX>>
%<OFFSET 1 '<CHANNEL FIX>>
Note that this is a new OFFSET:
.X
%<OFFSET 1 '<FOO FIX>>
PUT: Change an element of a structure or make an association
Object-type: SUBR
Category: DATA-HANDLING, ASSOCIATION
Reference: PUTPROP, GET
PUT associates a property with an item or (as with GET) if arg 1
is structured and arg 2 is fix, insert the third arg as the fix'th
element.
PUT is thus exactly like PUTPROP if the first argument is not
structured or the second not FIX. If used as PUTPROP, and no third
argument is given, removes any association between ARG 1 and ARG 2.
Returns the first argument.
Argument:
Template: #DECL ("VALUE" ANY ANY ANY "OPTIONAL" ANY)
Argument 1 -- ANY, the object with the association, or the structure
whose Nth element to replace.
Argument 2 -- ANY, the indicator under which the association is
stored, if fix and first arg a structure, clobber the fix'th
element with the value instead.
(Optional)
Argument 3 -- ANY, the value to be associated, if none, the previous
association is removed.
Returns -- The result is the first argument.
Example: <PUT FOO 1 BAR>
Like PUTPROP.
<PUT .FOO 1 BAR>
If .FOO is structured, clobber its first element.
PUTBITS: Change part of a WORD
Object-type: SUBR
Category: BIT-TWIDDLING
Reference: BITS, GETBITS
PUTBITS changes part of a PRIMTYPE WORD, as described by a BITS
and a PRIMTYPE WORD. It takes the rightmost bits of the third
argument, which defaults to 0, and clobbers the bit positions
indicated by the BITS in the first argument.
It is functionally equivalent to the PDP-10 Deposit Byte (DPB)
instruction.
Argument:
Template: #DECL ("VALUE" <PRIMTYPE WORD> <PRIMTYPE WORD> BITS
"OPTIONAL" <PRIMTYPE WORD>)
Argument 1 -- A PRIMTYPE WORD, the destination of the bits.
Argument 2 -- A BITS, describes how many bits to move and where in the
output word to put them.
(Optional)
Argument 3 -- A PRIMTYPE WORD, the source of the bits to move, default 0.
Returns -- The new version of argument 1. Arg 1 itself is not changed.
Example: <PUTBITS -1 <BITS 6 3>>
-505
Args need not be of type WORD.
PUTPROP: Change or create an association
Object-type: SUBR
Category: DATA-HANDLING, ASSOCIATION
Reference: PUT, GET
PUTPROP associates a property with an item under a given
indicator. If no property (or value) is given, any association of the
item and indicator is removed. Note that if PUT's first argument is
not structured and its second argument is not FIX, it is identical to
PUTPROP.
Returns the first argument.
Argument:
Template: #DECL ("VALUE" ANY ANY ANY "OPTIONAL" ANY)
Argument 1 -- ANY, the object with the association
Argument 2 -- ANY, the indicator under which the association is to be
stored.
(Optional)
Argument 3 -- ANY, the value to be associated, if none, the previous
association is removed.
Returns -- The result is the first argument.
Example: <PUTPROP .FOO 1 BAR>
Makes association.
<PUT .FOO 1 BAR>
If .FOO is structured, clobber its first element, else make association.
PUTREST: Make REST of a LIST a given LIST
Object-type: SUBR
Category: DATA-HANDLING
Reference: LIST
PUTREST replaces the rest of a list making arg2 be REST of arg1.
Notice that this does not copy the lists, so it can be used to produce
circular lists.
Argument:
Template: #DECL ("VALUE" <PRIMTYPE LIST>
<PRIMTYPE LIST> <PRIMTYPE LIST>)
Argument 1 -- A LIST, rest of which will be replaced by Argument 2.
Argument 2 -- A LIST, which will become the new REST of Argument 1.
Returns -- The new LIST.
Example: <PUTREST <REST <SET X (1 2 3)> 2> (4 5 6)>
(3 4 5 6)
.X will now be (1 2 3 4 5 6).
<PUTREST <SET CIRCULAR (0)> .CIRCULAR>
Create a circular LIST of one element.
QUIT: Kill a MUDDLE
Object-type: SUBR
Category: SYSTEM
Reference: LOGOUT, VALRET
Causes a MUDDLE to VALRET the string ':KILL<cr>' to its
superior. This will cause the superior to kill the MUDDLE job.
Argument:
Template: #DECL ()
Never returns.
Example: <QUIT>
Only possible example.
QUITTER: Default character interrupt SUBR
Object-type: SUBR
Category: INTERRUPT
Reference: ON, OFF
QUITTER is not normally called by user programs. It is the
default character interrupt SUBR that handles ^S and ^G
Argument:
Template: #DECL ("VALUE" ANY CHARACTER CHANNEL)
Argument 1 -- The CHARACTER typed.
Argument 2 -- The CHANNEL which produced the interrupt.
Returns -- The CHARACTER typed.
Example: For the best example, type ^G and then <FRAMES> to a MUDDLE.
QUOTE: Return its first argument unEVALed.
Object-type: FSUBR
Category: UTILITY
Reference: EVAL
The QUOTE Fsubr takes unEVALuated arguments and returns the first.
It is the way to circumvent the normal EVALuation mechanism.
Note that 'object is an abbreviation for <QUOTE object>.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" LIST)
Arguments -- ANY objects; the first will be returned untouched by QUOTE.
Returns -- Its first argument, untouched by interpreted hands.
Example: `
[CHRIS
BRUCE
NEAL
DAVE
HOWARD]
This will cause the Vector to be returned unEVALuated and therefore
without the overhead of copying.
'(<PUSH TP* (TB)>
<PUSH TP* (TB) 1>
<MCALL 1 PRINC>)
This will return a list of Forms.
RANDOM: Generate a random FIX
Object-type: SUBR
Category: ARITHMETIC
RANDOM generates a random FIX. If the seeds of the MUDDLE
random number generator are not touched, repeated invocations of
RANDOM will return the exact same sequence of numbers. This is for
convenience in debugging. 'Debugged' code should pass the first and
second optional arguments to RANDOM, which change the two seeds it
uses to generate its numbers. Popular choices of new seeds are the
numbers returned by TIME and the contents of various UVECTOR buffers.
Argument:
Template: #DECL ("VALUE" FIX "OPTIONAL" FIX FIX)
(Optional)
Arguments 1 and 2 -- New seed settings for the random number generator.
Returns -- A random FIX.
Example: <MOD <RANDOM> 30>
How to generate a random number between 0 and N.
READ: Read one object from an I/O channel
Object-type: SUBR
Category: I/O
READ returns the entire object whose character representation is next
in the input stream. If there is a comment on the object, it is PUT
on the channel used with indicator COMMENT.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" CHANNEL ANY
<OR OBLIST <LIST [REST <OR OBLIST 'DEFAULT>]>>
VECTOR)
(Optional)
Argument 1 -- input channel, default .INCHAN
Argument 2 -- object to eval and return at end of file, default
<ERROR END-OF-FILE!-ERRORS>
Argument 3 -- oblist or list therof for looking up atoms, default .OBLIST
Argument 4 -- READ-TABLE giving special characters, default .READ-TABLE
Returns -- the object read
Example: <SET NEWOBJ <READ>>
Calls like this make you CALICO-incompatible.
READB: Read binary words from an I/O channel
Object-type: SUBR
Category: I/O
READB fills a buffer with 36-bit binary words and returns the
number of words read. If the end of file is reached, this number will
be less than the size of the buffer. If another READB is attempted,
the end-of-file arg will be evaled and returned.
Argument:
Template: #DECL ("VALUE" FIX
<<OR UVECTOR STORAGE> [REST <PRIMTYPE WORD>]> CHANNEL
"OPTIONAL" ANY)
Argument 1 -- buffer to fill
Argument 2 -- "READB" channel
(Optional)
Argument 3 -- object to eval and return at end of file
Returns -- number of binary words read
Example: <READB <OPEN "READB" "DSK:.FILE. (DIR)">
<IUVECTOR 1024 '0>>
Get your file directory in binary form.
READCHR: Read one character from an I/O channel
Object-type: SUBR
Category: I/O
Reference: TYI
READCHR returns the next character in the input stream from a
given channel. Successive calls return successive characters. If the
channel is open to a console, receipt of a character is held off until
an ESC is typed. If it is open to a pseudo-console in "READ" mode
and no input is available, READCHR returns -1.
Argument:
Template: #DECL ("VALUE" <OR CHARACTER FIX> "OPTIONAL" CHANNEL
ANY)
(Optional)
Argument 1 -- the channel to read from
Argument 2 -- object to eval and return at end of file
Returns -- the character read (-1 if empty STY device)
Example: <READCHR>
!\
If called alone, you get the ESC.
READSTRING: Read into a string from an I/O channel
Object-type: SUBR
Category: I/O
Reference: READB
READSTRING is the string analog to READB (q.v.). It fills a string
buffer with characters from a channel, returning the number of characters
input. One argument tells when to stop reading: after a certain number
of characters or upon reading one of a set of characters.
Argument:
Template: #DECL ("VALUE" FIX STRING "OPTIONAL" CHANNEL <OR FIX STRING>
ANY)
Argument 1 -- buffer to read into
(Optional)
Argument 2 -- channel to read from, default .INCHAN
Argument 3 -- number of chars to read or char to stop reading on
Argument 4 -- object to eval and return at end of file
Returns -- number of characters read
Example: <READSTRING " ">
1
You get the ESC if called alone.
REALTIMER: Set interval between Real-time interrupts
Object-type: SUBR
Category: INTERRUPT
Reference: RUNTIMER
REALTIMER sets the interval (in seconds) between REALT (real-
time) interrupts. The MUDDLE will be interrupted each time this many
seconds elapse.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- Interval between Real-time interrupts (in seconds).
Returns -- Argument 1.
Example: <REALTIMER <* 10 60>>
Interrupt every ten minutes.
REMOVE: Remove an ATOM from its OBLIST
Object-type: SUBR
Category: IDENTIFIER
Reference: INSERT, LOOKUP
REMOVE is the opposite of INSERT. It takes a single argument, an
ATOM, and removes that ATOM from its OBLIST. It can also take two
arguments, a STRING and an OBLIST, and removes the ATOM of that PNAME
from that OBLIST. The ATOM, which now is on no OBLIST, and therefore
has a trailer of !-#FALSE(), is returned. If the ATOM was originally
on no OBLIST, or if the STRING names no ATOM on the OBLIST, REMOVE
returns #FALSE ().
Argument:
Template: #DECL ("VALUE" <OR ATOM FALSE> <OR ATOM STRING> "OPTIONAL"
OBLIST)
Argument 1 -- The ATOM to flush from its OBLIST, or a STRING.
(Optional)
Argument 2 -- If arg 1 was a STRING, this is the OBLIST to mung.
Returns -- The now homeless ATOM.
Example: <INSERT <REMOVE FOO> <ROOT>>
You can move ATOMs from one OBLIST to another with REMOVE and INSERT.
RENAME: Rename or delete a disk file
Object-type: SUBR
Category: I/O
RENAME is for renaming and deleting files. It takes three
kinds of arguments:
(a) two file names (one or more strings) separated by the atom TO,
(b) one file name, or
(c) a channel (output mode) and a file name.
Omitted file-name parts use the OPEN defaults. The action is, respectively,
(a) rename the file named first to the second name,
(b) delete the file, or
(c) rename the file while open for writing.
Argument:
Template: #DECL ("VALUE" <OR 'T <FALSE STRING FIX>>
"TUPLE" <TUPLE <OR STRING CHANNEL>>)
Tuple of arguments -- rename or delete action (see description)
Returns -- whether it succeeded
Example: <RENAME "FOO 3" TO "BAR">
T
Rename FOO 3 to BAR >.
<RENAME "FOO FOO DSK:HARRY;">
T
Delete that file.
REP: Enter a READ-EVAL-PRINT loop
Object-type: SUBR
Category: SYSTEM
Reference: LISTEN, ERRET, RETRY
REP causes an endless READ-EVAL-PRINT loop, which is left only by a
non-local return. It is the last thing that LISTEN does, unless there
is a substitute <VALUE REP>.
Argument:
Template: #DECL ("VALUE" ANY)
Returns -- argument to ERRET
Example: <REP>
no arguments
REPEAT: Execute repeatedly sequential expressions.
Object-type: FSUBR
Category: PROGRAM-CONTROL
Reference: PROG, RETURN, GO, AGAIN
This FSUBR is used to bind varialbes and repeatedly and
sequentially execute MUDDLE expressions and perform appropriate GOs,
RETURNs, and AGAINs.
If the first argument to REPEAT is an atom, it is bound to the
Activation of the REPEAT.
Otherwise the next object must be the argument list of the REPEAT.
It contains either Atoms or Lists of an Atom and a MUDDLE expression.
Each single Atom in the argument list is Bound but not Assigned. Each
'listified' Atom is Bound and Assigned to the evaluation of the MUDDLE
expression which appears with it.
If the next argument to the REPEAT is of type DECL, it is used as
the declaration for the variables of the REPEAT.
The remaining arguments, at least one must exist, constitutes the
body of the REPEAT. They are executed in sequence. When the last has
been evaluated, evaluation begins again with the first expression in
the body. Unless a RETURN or non-local AGAIN or GO is executed at
some time by the body of the REPEAT, the REPEAT will never return.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" <LIST ATOM LIST DECL ANY>)
Optional argument 1 -- ATOM to which to bind the activation of the
REPEAT.
Argument 2 -- Parameter list of the REPEAT.
Optional argument 3 -- DECL of the REPEAT.
Tuple of arguments -- At least one evalable object.
Returns -- the argument to a RETURN from the REPEAT's activation.
Example: <REPEAT ((C ()))
<COND (<N==? <1 <SET C (<RANDOM> !.C)>> 69>)
(ELSE <RETURN .C>)>>
This will create a LIST of random numbers until RANDOM returns 69.
RESET: Reopen a channel at its beginning
Object-type: SUBR
Category: I/O
Reference: ACCESS, OPEN
RESETting a channel means:
for input, empty all buffers and ACCESS the file (if any) to 0;
for output, return to beginning of file, destroying all output if not
"PRINTO". If the channel is closed, it is first opened. RESET on
either console channel causes the interpreter to update device specs.
Argument:
Template: #DECL ("VALUE" <OR CHANNEL <FALSE STRING STRING FIX>> CHANNEL)
Argument 1 -- the channel to reset
Returns -- arg1 or a false if reopen failed
Example: <RESET ,INCHAN>
after detaching and moving to a different console
REST: Remove elements from the front of a structure
Object-type: SUBR
Category: DATA-HANDLING
Reference: BACK, TOP
REST removes the first N elements from a structure, that is,
moves N places down the structure. N defaults to 1 if not given.
For some structures, the effect of REST may be undone with BACK.
Note that the result of REST is always CHTYPEd to its PRIMTYPE,
thus FORMs become LISTs when RESTed, and so on.
Argument:
Template: #DECL ("VALUE" STRUCTURED STRUCTURED "OPTIONAL" FIX)
Argument 1 -- A Structured object.
(Optional)
Argument 2 -- FIX, default 1.
Returns -- The result is the structured object, CHTYPEd to its
primtype.
Example: <SET A <REST [1 2 3 4] 3>>
[4]
<SET B <BACK .A>>
[3 4]
<SET C <BACK .A 2>>
[2 3 4]
<SET D <TOP .A>>
[1 2 3 4]
<SET E <REST .D>>
[2 3 4]
<SET F <REST "XYZ">>
YZ
The relationships between REST, BACK, and TOP are illustrated.
Note that only REST can work on lists
RESTORE: Restore a previously SAVEd core image
Object-type: SUBR
Category: ENVIRONMENT
Reference: SAVE, FSAVE
RESTORE replaces the entire current MUDDLE environment with one
from a file generated by SAVE. It is much faster than FLOAD for very
large programs. RESTORE does not return; the SAVE that originally
created the file returns again with the string "RESTORED" as its
value.
All arguments are optional with a default file name of
DSK:<-user's sname>-;MUDDLE SAVE
Note that RESTORE attempts to restore the state of all channels.
If the SNAME of the MUDDLE doing the SAVE was "", the current
SNAME will not be changed by the RESTORE. This feature is useful
if a SAVE file is to be used by more than one person.
Argument:
Template: #DECL ("VALUE" STRING "OPTIONAL" STRING STRING STRING
STRING)
(Optional)
Arguments -- Up to four STRINGs specifying the file name to RESTORE.
Returns -- The STRING "RESTORED".
Example: <RESTORE "MUDDLE;NCOMP">
Restore the compiler.
RESUME: Resume running a PROCESS
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: RESUMER, PROCESS
RESUME starts a PROCESS running. It takes something to return
as the 'value' of the current PROCESS, and the PROCESS to resume. If
not given, the PROCESS to RESUME is defaulted to be the last PROCESS to
RESUME the PROCESS doing the RESUME, if there was one.
If the process that is doing the RESUME is ever itself RESUMEd,
the first argument to that RESUME will be returned as its value. In
fact, a PROCESS may be treated in the simpler cases as a routine called
by invoking RESUME, which returns the result as RESUME's value.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL" PROCESS)
Argument 1 -- Something to be returned to the resumed process.
(Optional)
Argument 2 -- The PROCESS to resume, default <RESUMER> if there is one.
Returns -- Whatever is passed to RESUME later in another PROCESS to
RESUME this one.
Example: <COND (<RESUMER> <RESUME T <RESUMER>>)>
Resumer our RESUMER, if we have one.
RESUMER: Return the last PROCESS to RESUME a PROCESS
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: RESUME
RESUMER takes an optional process, and returns the last
PROCESS to RESUME it. If not given, the PROCESS is <ME>. If no
process has ever RESUMEd the process given, returns FALSE.
Argument:
Template: #DECL ("VALUE" <OR FALSE PROCESS> "OPTIONAL" PROCESS)
(Optional)
Argument 1 -- A PROCESS, default <ME>.
Returns -- A PROCESS, which last RESUMEd Arg 1, or FALSE if none ever
did.
Example: <PROG ((R <RESUMER>))
<COND (<AND .R <==? <STATE .R> RESUMABLE>>
<RESUME T .R>)>>
RESUME RESUMER if o.k. to do so.
RETRY: Retry a previous Subroutine call from the error level
Object-type: SUBR
Category: ERROR, PROGRAM-CONTROL
Reference: FRAME
RETRY pops the stack down to a given frame and then causes the
Subroutine call that generated that frame to be done again. It is
mostly useful for restarting some program after fixing the cause of an
error.
Argument:
Template: #DECL ("OPTIONAL" FRAME)
(Optional)
Argument 1 -- the frame to be redone, default the last call to ERROR/LISTEN
Returns -- really nothing
Example: <RETRY <FRM 1>>
Often you want to restart from just before the error.
RETURN: Return something from an activation
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: ERRET, GO, RETRY
RETURN takes a value and an ACTIVATION and returns the value
from the ACTIVATION. The ACTIVATION is optional, and defaults to the
most nearly surrounding ACTIVATION, usually that of the current PROG
or REPEAT. The value is also optional, default T.
The result of RETURN is that the ACTIVATION terminates and the
value is returned as its 'result'.
ACTIVATIONs may be implicit, as in they often are in PROGs and
REPEATs, or explicit as in the optional first argument for PROG,
REPEAT, FUNCTION, and second argument for DEFINE. In these cases the
LVAL of the ATOM given is the ACTIVATION of that PROG, REPEAT, etc.
See the Abstracts of these FSUBRs and the Abstract of AGAIN for more
details.
One final note. An ACTIVATION may be CHTYPEd to a FRAME and used
by ERRET, RETRY and so on.
The ACTIVATION argument to RETURN may literally be any legal
activation in the MUDDLE, even one from another PROCESS.
Argument:
Template: #DECL ("VALUE" ANY "OPTIONAL" ANY ACTIVATION)
(Optional)
Argument 1 -- the value to return from the activation, default T.
Argument 2 -- the ACTIVATION to return the value from, default the
most closely surrounding ACTIVATION, as of the current PROG
or REPEAT that is running.
Returns -- Argument 1 (from the ACTIVATION).
Example: <REPEAT (X)
<COND (<EMPTY? .X> <RETURN "DONE">)
(ELSE <PRINT <1 .X>>)>
<SET X <REST .X>>>
Simple use of RETURN in a REPEAT.
RGLOC: Get a locative to the GVAL of an ATOM for pure-program use
Object-type: SUBR
Category: DATA-HANDLING
Reference: LLOC, GLOC
Returns a locative, type LOCR, to the GVAL of the ATOM passed
as its argument. If the ATOM has no GVAL slot, ERROR, unless second
arg is given and true. Pure RSUBRs must use this instead of GLOC.
Argument:
Template: #DECL ("VALUE" LOCR ATOM "OPTIONAL" <OR FALSE ANY>)
Argument 1 -- An ATOM with a GVAL.
(Optional)
Argument 2 -- whether not to give a no-slot error or not
Returns -- A locative (LOCR) to the GVAL of the ATOM.
Example: <AND <GASSIGNED? FOO> <RGLOC FOO>>
Guard against ATOMs with no GVALs.
ROOT: Return the ROOT oblist
Object-type: SUBR
Category: IDENTIFIER
ROOT returns the ROOT OBLIST. This OBLIST is almost always
in the path.
Argument:
Template: #DECL ("VALUE" OBLIST)
Returns -- The ROOT OBLIST.
Example: <ROOT>
Only one there is.
ROT: Logical rotate
Object-type: SUBR
Category: BIT-TWIDDLING, LOGICAL
Reference: LSH
ROT takes an object of Primtype WORD and a FIX, and it returns a
WORD containing the bits in the first argument, rotated the number of
bits specified by the second argument (mod 256). A positive second
argument specifies rotation to the left, a negative FIX specifies
rotating to the right. Rotation is a cyclic logical shift where bits
shifted out at one end are put back in at the other.
Argument:
Template: #DECL ("VALUE" WORD
<PRIMTYPE WORD> FIX)
Arg 1 -- a Primtype WORD containing the bits to rotate
Arg 2 -- a FIX specifying the amount to rotate
Returns -- A WORD containing the rotated bits.
Example: <ROT 8 6>
#WORD *000000001000*
<ROT 8 -6>
#WORD *100000000000*
Primarily useful for getting fingers directly in the bits.
RSUBR-ENTRY: Create entry point to an RSUBR.
Object-type: SUBR
Category: DATA-HANDLING
Reference: RSUBR, ENTRY-LOC
This routine will create an alternate entry point to an RSUBR.
The ATOM supplied will be the name of this alternate entry point. The
DECL will be used for argument and result checking at the new entry.
The FIX is the offset into the actual code of the RSUBR of this entry.
Argument:
Template: #DECL ("VALUE" RSUBR-ENTRY
<VECTOR <OR RSUBR ATOM> ATOM DECL> FIX)
Argument 1 -- a vector containing the RSUBR (or its name) and the new
entry's name and DECL
Argument 2 -- a FIX, an offset in the RSUBR
Returns -- an RSUBR-ENTRY into the RSUBR
Example: <RSUBR-ENTRY [,FOO FOO1 #DECL ("VALUE" LIST STRING)]
245>
This will make a new entry point into the RSUBR FOO. This entry will
have the name FOO1 and have a DECL as given. The offset into the CODE
of FOO for this entry will be 245.
RSUBR-LINK: Change state of automatic RSUBR linking feature
Object-type: SUBR
Category: ENVIRONMENT
Reference: RSUBR
RSUBR-LINK is used to enable and disable the automatic RSUBR
linking feature of MUDDLE. Normally, as they are called, RSUBRs link
up to each other. If RSUBRs are being debugged, this can be a problem
as several different versions may be loaded and reloaded.
Calling RSUBR-LINK with FALSE disables the feature, with non-FALSE
enables it. It is normally enabled.
Argument:
Template: #DECL ("VALUE" <OR ANY FALSE>
"OPTIONAL" <OR ANY FALSE>)
(Optional)
Argument 1 -- FALSE disables automatic RSUBR linking, non-FALSE
enables it.
Returns -- The previous state, or the current state if no arg
Example: <RSUBR-LINK <>>
<GROUP-LOAD "FOO BINARY">
.....debugging.....
<RSUBR-LINK T>
Done debugging.
RSUBR: Create an object of type RSUBR (Relocatable SUBR)
Object-type: SUBR
Category: DATA-HANDLING
RSUBR is a routine that is rarely if ever used other than in the
MUDDLE Assembler. The user (almost) always sees the type RSUBR already
created.
RSUBR creates an object of RSUBR, which stands for Relocatable
SUBR. RSUBRs are created in one of several ways. They can be created
by hand-coding a routine and assembling it. They can be the result of
the assembly of a compiled FUNCTION.
Internally, an RSUBR consists of a code uvector, a name, a DECL,
and (optionally) references, which are all the objects the
RSUBR references outside of itself.
Argument:
Template: #DECL ("VALUE" RSUBR
<VECTOR <OR CODE PCODE> ATOM DECL [REST ANY]>)
Argument 1 -- A VECTOR containing the code (impure or pure), an ATOM (the
name of the RSUBR), a DECL, and references.
Returns -- The argument CHTYPEd to an RSUBR.
Example: <RSUBR [#CODE ![1!] FOO #DECL ()]>
Will create a useless RSUBR
RUNINT: Apply interrupt handler (for internal use only)
Object-type: SUBR
Category: SYSTEM, INTERRUPT
Reference: APPLY
RUNINT is just like APPLY, except that it is called internally to
execute an interrupt handler. It may cause another PROCESS to run.
Argument:
Template: #DECL ("VALUE" ANY APPLICABLE "TUPLE" TUPLE)
Argument 1 -- the handler to be applied
Tuple of arguments -- its args, supplied by interrupt system
Returns -- whatever handler returns
Example: <RUNINT <3 .HANDLER> !.ARGS>
Of course only the interpreter does this.
RUNTIMER: Set time of Run-time interrupt
Object-type: SUBR
Category: INTERRUPT
Reference: REALTIMER
RUNTIMER sets the amount of Run-time (in seconds) the MUDDLE
must have used for a RUNT (run-time) interrupt to occur.
Argument:
Template: #DECL ("VALUE" <OR FIX FLOAT> <OR FIX FLOAT>)
Argument 1 -- The amount of run-time (fix or float) the MUDDLE must
have used for a RUNT (run-time) interrupt to occur.
Returns -- Argument 1.
Example: <RUNTIMER <* 60 60>>
Cause interrupt after one hour time (seconds) used.
SAVE: Saves the core image of a MUDDLE in a continuable state.
Object-type: SUBR
Category: I/O
Reference: FSAVE, RESTORE
SAVE saves the impure part of a MUDDLE's core image in a file on
the disk. This file can later be RESTOREd (q.v.) and whatever was in
progress continued.
SAVE files are zero compressed, and normally a garbage collection
is performed before the SAVE is done to further reduce the rather
considerable size of the resulting file.
SAVE takes the name of the file to SAVE into as its argument, and
optionally, an argument which if given and FALSE, causes the garbage
collect to not occur. The default name of the SAVE file is DSK:MUDDLE
SAVE.
SAVE returns the string "SAVED". RESTORE, which 'returns again'
from the SAVE, returns the string "RESTORED", and thus the caller can
differentiate.
SAVE files are RESTOREable only into MUDDLEs with the same
version number as the MUDDLE that SAVEd them. To check if a SAVE file
is compatible with a MUDDLE, compare the version number with <READ> on
a channel open to the SAVE file.
Argument:
Template: #DECL ("VALUE" '"SAVED" "TUPLE" TUPLE)
(Tuple of arguments)
First element(s) -- STRING(s) specifying the file to SAVE into.
Last element (optional) -- An object, which, if FALSE, inhibits pre-SAVE garbage
collect.
Returns -- the STRING "SAVED"
Example: <SAVE>
Will save core image to DSK:<sname>;MUDDLE SAVE.
SEND-WAIT: Send an IPC message and wait until someone takes it
Object-type: SUBR
Category: SYSTEM
Reference: SEND, IPC-ON, IPC-OFF
SEND-WAIT sends an IPC message to a specific destination from your
MUDDLE, using the ITS IPC (Inter-process communication) feature. SEND
takes 3, 4, or 6 arguments: Two string specifying whom to send the
message to, a message, and optionally a message type number, and a
pair of strings specifying whom the message is from.
Using SEND-WAIT, it is possible to hang until someone takes the
message. SEND returns T if someone takes the message, #FALSE()
otherwise.
When your process receives an IPC message, the condition "IPC"
is signalled. There is a default handler for this condition, called
IPC-HANDLER. See its abstract for more details.
Argument:
Template: #DECL ("VALUE" 'T STRING STRING
<OR STRING <UVECTOR [REST <PRIMTYPE WORD>]> STORAGE>
"OPTIONAL" FIX STRING STRING)
Arguments 1 & 2 -- STRINGs specifying the destination of the message.
Any one who is listening on this pair will receive the message.
They correspond to an ITS UNAME, JNAME pair.
Argument 3 -- A message. This can be a STRING, a UVECTOR of UTYPE
Primtype WORD, or a STORAGE.
(Optional)
Argument 4 -- A message type. This is just an identifying type for
the recipient to look at if he is interested.
Arguments 5 & 6 -- Two STRINGs specifying whom the message is from. If
not given, they are from UNAME JNAME of the MUDDLE.
Returns -- T when the message is taken. Hangs until then.
Example: <SEND-WAIT "CLR" "MUDDLE" "HOW ARE YOU CHRIS?">
Will return T when CLR MUDDLE takes the IPC message.
SEND: Send an IPC message
Object-type: SUBR
Category: SYSTEM
Reference: SEND-WAIT, IPC-ON, IPC-OFF
SEND sends an IPC message to a specific destination from your
MUDDLE, using the ITS IPC (Inter-process communication) feature. SEND
takes 3, 4, or 6 arguments: Two strings specifying whom to send the
message to, a message, and optionally a message type number, and a
pair of strings specifying whom the message is from.
SEND returns T if someone takes the message, #FALSE() otherwise.
Using SEND-WAIT, it is possible to hang until someone takes the message.
When your process receives an IPC message, the condition "IPC"
is signalled. There is a default handler for this condition, called
IPC-HANDLER. See its abstract for more details.
Argument:
Template: #DECL ("VALUE" <OR 'T '#FALSE ()> STRING STRING
<OR STRING <UVECTOR [REST <PRIMTYPE WORD>]> STORAGE>
"OPTIONAL" FIX STRING STRING)
Arguments 1 & 2 -- STRINGs specifying the destination of the message.
Any one who is listening on this pair will receive the message.
They correspond to an ITS UNAME, JNAME pair.
Argument 3 -- A message. This can be a STRING, a UVECTOR of UTYPE
Primtype WORD, or a STORAGE.
(Optional)
Argument 4 -- A message type. This is just an identifying type for
the recipient to look at if he is interested.
Arguments 5 & 6 -- Two STRINGs specifying whom the message is from. If
not given, they are from UNAME JNAME of the MUDDLE.
Returns -- T if the message is taken, else #FALSE ().
Example: <SEND "CLR" "MUDDLE" "HOW ARE YOU CHRIS?">
Will return T only if CLR MUDDLE is listening for IPC messages.
SET: Give an atom a local value
Object-type: SUBR
Category: IDENTIFIER
Reference: ASSIGNED?, LVAL
SET gives an atom (arg1) a local value (arg2) in a given
environment (arg3, optional).
Argument:
Template: #DECL ("VALUE" ANY ATOM ANY
"OPTIONAL" <OR ENVIRONMENT
ACTIVATION
FRAME
PROCESS>)
Argument 1 -- the atom to set
Argument 2 -- the local value to give it
(Optional)
Argument 3 -- the environment for this to occur in
Returns -- arg2
Example: <SET REDEFINE T>
allows redefinitions
SETG: Assign a global value to an atom
Object-type: SUBR
Category: IDENTIFIER
Reference: GVAL, GASSIGNED?, DEFINE
Argument:
Template: #DECL ("VALUE" ANY ATOM ANY)
Argument 1 -- the atom
Argument 2 -- the global value to give it
Returns -- arg2
Example: <SETG REAL-PLUS ,+>
often the first step in redefining primitives
SETLOC: Change the object a locative points to
Object-type: SUBR
Category: DATA-HANDLING
Reference: IN, LEGAL?
Change the object a locative points to. The advantage of SETLOC
is that it is independent of exactly what is pointed to by the locative
passed it. It works equally well for LVALs, GVALs, structures, and
so on.
Note that it is possible to lose if an LVAL to which an LLOC
points has become unbound. Use LEGAL? to check when in doubt.
Argument:
Template: #DECL ("VALUE" ANY LOCATIVE ANY)
Argument 1 -- A locative.
Argument 2 -- Anything, to be the new contents of the thing the
locative points at.
Returns -- Argument 2.
Example: <SET FOO (1 2 3)>
<SET FOOL <AT .FOO 2>>
<IN .FOOL>
2
<SETLOC .FOOL "BAR">
.FOO
(1 "BAR" 3)
Just like PUT, right?
SIN: Sine of an angle
Object-type: SUBR
Category: ARITHMETIC
Reference: COS, ATAN
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- the angle in radians.
Returns -- A FLOAT, the Sine.
Example: <+ <* <COS .X> <COS .X>>
<* <SIN .X> <SIN .X>>>
1.0
One of the common trig. identities.
SLEEP: Sleep interruptably for a given number of seconds
Object-type: SUBR
Category: ENVIRONMENT, INTERRUPT
Reference: HANG
SLEEP allows a process to sleep (using the system call) for
a given period of time. It is also possible to give an object to be
evaluated each time an interrupt occurs and is dismissed back into
the SLEEP. If the result of the evaluation is non-FALSE, the result
is returned as the value of the SLEEP. This enables a switch to be
set at interrupt level and looked at to terminate a SLEEP.
Argument:
Template: #DECL ("VALUE" ANY <OR FIX FLOAT> "OPTIONAL" ANY)
Argument 1 -- the number of seconds to SLEEP.
(Optional)
Argument 2 -- Something to evaluate each time an interrupt dismisses
back into the SLEEP, and terminates the SLEEP if it returns
non-FALSE.
Returns -- The non-FALSE result of the second argument.
Example: <SLEEP 60 .TYPEIN>
Sleep for a minute but stop early if an interrupt handler sets the
ATOM to a non-FALSE.
SNAME: Read or change MUDDLE's SNAME
Object-type: SUBR
Category: SYSTEM
Reads or changes MUDDLE's SNAME, which is the default name for
opening files. If no arguments are given, returns the current SNAME.
If a STRING is given, it is made the current SNAME and returned.
The ATOM SNM may also be set, locally or globally, to change
(temporarily or permanently) the default SNAME of the MUDDLE.
Argument:
Template: #DECL ("VALUE" STRING "OPTIONAL" STRING)
(Optional)
Argument 1 -- A STRING to set the SNAME to. If none is given, just
read the current SNAME.
Returns -- The current SNAME.
Example: <SNAME "FOO">
FOO
<SNAME>
FOO
Set and read SNAME.
SORT: Sort VECTORs, UVECTORs, or TUPLEs
Object-type: SUBR
Category: DATA-HANDLING
SORT is used to order VECTORs, UVECTORs, and TUPLEs. It is a
fairly complex SUBR, which however has good defaults and is fairly
easy to use with them.
It works most efficiently if the sort keys are of primtype WORD,
ATOM, or STRING. However, the keys may be of any type, and SORT will
still work. SORT acts on records which consist of one or more contig-
uous entries in the structure being sorted. One item in the record is
declared to be the sort key. Also, any number of additional structures
may be rearranged based on how the main structure is sorted.
<SORT function ; either FALSE or something applicable
; to two sort keys which returns FALSE
; if the first is not bigger than the
; second. I.e, arg1 > arg2 ??
s1 ; the structure to sort
l1 ; length of sort records in s1, default 1
offset ; REST offset from start of record of
; sort key. Optional, default 0.
s2 l2 - sN lN> ; the VECTORs, UVECTORs, or TUPLEs to
; rearrange, and record lengths in them
If the function is FALSE, then the types of all the sort keys
must be the same, and they must be of primtype WORD, ATOM, or STRING.
In this case a Radix Exchange Sort is used (stolen from TECO). If
function is something applicable, a Shell Sort is used.
Note that if you give your own 'function' it is possible to make
a non-terminating sort. If the condition you create by your function
does not map into the normal one 'return FALSE if first not bigger than
second' then the SORT may not terminate.
See 'Example' section for several examples of the use of SORT.
Argument:
Template: #DECL ("VALUE" <PRIMTYPE <OR VECTOR UVECTOR TUPLE>>
<OR FALSE APPLICABLE> <PRIMTYPE <OR VECTOR UVECTOR TUPLE>>
"OPTIONAL" FIX FIX "TUPLE"
<TUPLE [REST
<PRIMTYPE <OR VECTOR UVECTOR TUPLE>>
FIX]>)
Argument 1 -- The Sorting routine, or FALSE if the internal one is to
be used. Remember internal one only works if keys are WORD,
ATOM, STRING primtypes.
Argument 2 -- The PRIMTYPE VECTOR, UVECTOR, or TUPLE to sort.
(Optional)
Argument 3 -- FIX giving the record size in the
structure given for argument 2. Defaults to 1 if not
given.
Argument 4 -- The REST offset of the sort key in the records of the main
structure. Default is 0.
Tuple of arguments -- Alternating structures and respective record sizes.
These records are permuted the same way as the sorted ones in
the main structure.
Returns -- the sorted arg 1
Example: <SET A <IUVECTOR 500 '<RANDOM>>>
<SORT <> .A>
This is the simplest use of SORT. Note that only one argument is
really given, the FALSE simply defaulting the sorting method to the
internal one.
<SORT <>
[foo
1
bar
2
blech
-1
crock
69]
2>
This sorts the vector based on the atom names, considering records
to be two elements and defaulting the offset to 0. If the offset had
been 1 would sort based on the numbers.
<SORT <FUNCTION (X Y)
<G? <1 .X> <1 .Y>>>
[(101 "FOOBAR") (17 "MUMBLE") (86 "BLECH") (34 "GRITCH")]
1
0
[A
B
C
D
E
F
G
H
I
J
K
L]
3>
This sorts two structures based on the first element of the main
structure. Note that records in the second structure are 3 elements
long.
SPECIAL-CHECK: Change or examine the state of interpreter SPECIAL checking
Object-type: SUBR
Category: ENVIRONMENT
Reference: SPECIAL-MODE, DECL-CHECK
SPECIAL-CHECK turns interpreter SPECIAL checking on or off,
returning the old state, or, if given no argument, returns the current
state. (T indicates special checking is on, #FALSE() off).
Argument:
Template: #DECL ("VALUE" <OR 'T FALSE>
"OPTIONAL" <OR ANY FALSE>)
(Optional arguments)
Argument 1 -- A FALSE or T, indicating which state special checking is
to be put in. If not given, just return current state.
Returns -- The state of special-checking when SPECIAL-CHECK was called.
Example: <SPECIAL-CHECK <>>
This sets the normal initial state -- no special checking.
SPECIAL-MODE: Change or examine the default Special Mode
Object-type: SUBR
Category: ENVIRONMENT
Reference: SPECIAL-CHECK
SPECIAL-MODE is used to change or examine the default special
mode. It takes as argument the atoms SPECIAL or UNSPECIAL, and sets
the default mode accordingly, returning the old mode. If no argument
is given, it just returns the old mode.
Argument:
Template: #DECL ("VALUE" <OR 'SPECIAL 'UNSPECIAL>
"OPTIONAL" <OR 'SPECIAL 'UNSPECIAL>)
(Optional arguments)
Argument 1 -- SPECIAL or UNSPECIAL, the new mode.
Returns -- The mode at the time of the call.
Example: <SPECIAL-MODE UNSPECIAL>
Set the initial state.
SPNAME: Create a shared STRING which is the name of an ATOM
Object-type: SUBR
Category: IDENTIFIER
Reference: ATOM, INSERT, PNAME
SPNAME takes as argument an ATOM, and returns the STRING which
is the PNAME (printing name) of that ATOM. This name does not include
any oblist trailers or the backslashes that are sometimes printed out
for the convenience of the reader. Several other SUBRs, notably
INSERT, LOOKUP, and ATOM, use the pname of atoms as arguments.
PRINC of the PNAME of an ATOM is one guaranteed way of printing
an ATOM-name without trailers, backslashes, or quotes.
SPNAME is more efficient than PNAME (q.v.) if the string will not
be modified. Any attempt to PUT into the string will cause an error.
Argument:
Template: #DECL ("VALUE" STRING ATOM)
Argument 1 -- An ATOM.
Returns -- A STRING which shares the atom's pname.
Example: <SPNAME \ \ \ !-FOO!-BAR>
Just three spaces, no backslashes, no trailers.
SQRT: Square root of a number
Object-type: SUBR
Category: ARITHMETIC
Reference: LOG, EXP
Argument:
Template: #DECL ("VALUE" FLOAT <OR FIX FLOAT>)
Argument 1 -- A FIX or FLOAT.
Returns -- FLOAT, the square root of argument 1.
Example: <SQRT 4>
2.0
Floating is always done.
SQUOTA: Get the address of an internal interpreter symbol (for internal use only)
"VALUE" <OR FIX FALSE>
<PRIMTYPE WORD>
STACKFORM: Apply a function to generated arguments. [OBSOLETE]
******* This FSUBR is obsolete as of MUD54 *******
Object-type: FSUBR
Category: DATA-HANDLING
STACKFORM is obsolete and replaced by a MAPF of only two arguments.
It is documented for historical reasons only. The compiler transforms
applications of STACKFORM into appropriate MAPFs.
The STACKFORM Fsubr was used to APPLY a function to a variable
number of generated arguments. This could also be done by constructing
the appropriate Form and EVALing it. STACKFORM is more efficient; it
builds the Form on the stack and therefore produces no garbage. This
is where STACKFORM obtains its name.
STACKFORM operates as follows:
(0) EVALuate the 1st arg, and save as the applicative object.
(1) EVALuate the 3rd arg, the boolean expression.
(2) If the 3rd arg EVALuated to an object not of Type FALSE
Then, EVALuate the 2nd arg, the argument expression
and save on the stack. GO TO (1)
Else APPLY the saved applicative object
to the stacked arguments and return the result.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" <LIST APPLICABLE ANY ANY>)
Arguments -- see Description.
Returns -- see Description.
Example: <STACKFORM ,STRING
<READCHR>
<NOT <==? <NEXTCHR> <ASCII 27>>>>
This reads characters from the current input channel until an alt-mode
is read. It then returns what was read as one String.
STATE: Return the state of a PROCESS
Object-type: SUBR
Category: PROCESS-CONTROL
STATE returns the state of a PROCESS, as an ATOM from the
following list:
a) RUNNABLE -- PROCESS has never been run.
b) RUNNING -- running now (ie: applied STATE).
c) RESUMABLE -- has run and may run again.
d) DEAD -- has run and may not run again.
Argument:
Template: #DECL ("VALUE" ATOM PROCESS)
Argument 1 -- A PROCESS whose state should be returned.
Returns -- The state of the PROCESS
Example: <STATE <ME>>
RUNNING
This should always be the case.
STORE: Create a non-garbage collected storage area [OBSOLETE]
******* This SUBR is obsolete as of MUD55 *******
Object-type: SUBR
Category: DATA-HANDLING
Reference: ISTORAGE, FREE
STORE creates non-g.c. storage (for E&S etc.). It looks just like
a uvector, but does not move during garbage collection. It takes as
argument a UVECTOR whose contents will be copied into the STORAGE.
Argument:
Template: #DECL ("VALUE" STORAGE UVECTOR)
Argument 1 -- UVECTOR, desired contents of the store.
Returns -- STORAGE, containing old contents of the UVECTOR.
Example: <PROG ()
<SET A <STORE ![1 2 3!]>>
(.A <1 .A> <FREE .A>)>
Notice that once the space is free'd it should not be accessed
STRCOMP: Compare two STRINGs
Object-type: SUBR
Category: PREDICATE, CHARACTER
Reference: =?
STRCOMP alphabetically compares two STRINGs or ATOMs. It
actually is not a predicate, since it can return one of three values:
0 if the first string is =? to the second,
1 if the first is greater (sorts alphabetically after the
second),
and -1 if the second is greater.
If STRCOMP is given ATOMs, it of course uses their pnames to
compare them.
Alphabetically means, in this case, according to the numeric
order of ASCII, which gives the standard alphabetizing rules.
Argument:
Template: #DECL ("VALUE" FIX <OR ATOM STRING> <OR ATOM STRING>)
Argument 1 -- STRING or ATOM
Argument 2 -- STRING or ATOM
Returns -- 0 if argument 1 is =? to argument 2.
1 if argument 1 is greater than argument 2.
-1 if argument 1 is less than argument 2.
Example: <STRCOMP "FOO" "BAR">
1
<G? <STRCOMP "FOO" "BAR"> 0>
T
Converts STRCOMP into a predicate suitable for SORT.
STRING: Create a STRING from CHARACTERs and STRINGs
Object-type: SUBR
Category: DATA-HANDLING
Reference: ISTRING
STRING creates a string with explicit elements. These must be
other STRINGs or CHARACTERs. They will be concatenated together to
form a new STRING.
Argument:
Template: #DECL ("VALUE" STRING
"TUPLE" <TUPLE [REST <OR STRING CHARACTER>]>)
Tuple of arguments -- STRINGs or CHARACTERs, the elements of the new
STRING.
Returns -- Newly created STRING.
Example: <STRING "This is " !\a " string">
This is a string
STRUCTURED?: Is an object structured?
Object-type: SUBR
Category: TYPE, PREDICATE
Reference: TYPE?, LOCATIVE?, APPLICABLE?
STRUCTURED? tests if an object is one of the group of types
known as structured objects. It is similar to applying TYPE? to
the object and the list of structured objects, but relieves the user
from knowing the list, and thus will work for any new structured types
invented.
A structured object is defined as an object which potentially may
have NTH applied to it.
Argument:
Template: #DECL ("VALUE" <OR FALSE 'T> ANY)
Argument 1 -- Any MUDDLE object.
Returns -- T if argument 1 is structured, or FALSE if it is not.
Example: <STRUCTURED? <ROOT>>
T
Lots of types are structured.
SUBSTITUTE: Substitute one type-value pair for another throughout MUDDLE
Object-type: SUBR
Category: DATA-HANDLING
Reference: GC
SUBSTITUTE causes one type-value pair to be substituted for
another throughout MUDDLE. It is not to be used unless you really
know what you are doing. In fact, one of the few legitimate uses for
it (other than just having fun by doing <SUBSTITUTE 2 1>) is to
substitute the 'right' atom for the 'wrong' one, where OBLISTs have
gotten in a bad state.
Argument:
Template: #DECL ("VALUE" ANY ANY ANY)
Argument 1 -- Object to be substituted.
Argument 2 -- Object to be substituted for.
Returns -- Argument 2.
Example: <SUBSTITUTE FOO!-BAR FOO>
Only reasonable use so far found. ATOM impurification is done this
way, more or less.
SUBSTRUC: Copy part of a structure into another
Object-type: SUBR
Category: DATA-HANDLING
SUBSTRUC facilitates the construction of structures that are
composed of sub-parts of existing structures. It copies a set of
contiguous elements of one (non-TEMPLATE) structure into the first
elements of another, old or new, structure, all in one swell foop.
Argument:
Template: #DECL ("VALUE" <OR LIST VECTOR UVECTOR STRING BYTES>
<OR <PRIMTYPE LIST>
<PRIMTYPE VECTOR>
<PRIMTYPE TUPLE>
<PRIMTYPE UVECTOR>
<PRIMTYPE STRING>
<PRIMTYPE BYTES>>
"OPTIONAL" FIX FIX
<OR LIST VECTOR UVECTOR STRING BYTES>)
Argument 1 -- object to copy out of
(Optional)
Argument 2 -- amount to REST arg1 (temporarily) before copying, default 0
Argument 3 -- number of elements to copy, default all
Argument 4 -- object to copy into, TYPE must be <PRIMTYPE arg1> (VECTOR
if arg1 is TUPLE), must not share with arg1 if LIST
Returns -- new object (doesn't share with arg1, VECTOR if arg1 is TUPLE)
or arg4
Example: <SUBSTRUC '(1 2 3) 0 2>
(1 2)
opposite of REST
<SUBSTRUC "SUM OF PARTS" 7 4 <ISTRING 4>>
"PART"
substring function
SUICIDE: Kill the PROCESS you are in and resume another
Object-type: SUBR
Category: PROCESS-CONTROL
Reference: PROCESS, RESUME, DEAD
SUICIDE is exactly like RESUME, except that the PROCESS it is
EVALed in is made DEAD after it is left, and thus cannot be RESUMEd
any longer.
Note that <MAIN> cannot be SUICIDEd.
Argument:
Template: #DECL ("VALUE" ANY ANY "OPTIONAL" PROCESS)
Argument 1 -- The value of the process doing the SUICIDE.
(Optional)
Argument 2 -- A PROCESS to RESUME, default <RESUMER>, if there is one.
Returns -- Nothing really, as the PROCESS SUICIDEd cannot be RESUMEd,
since it will be dead.
Example: <SUICIDE T>
Won't work if <ME> is <MAIN>
TAG: Create a tag within an activation
Object-type: SUBR
Category: PROGRAM-CONTROL
Reference: GO
TAG creates a tag for a non-local GO. GO with a tag argument
allows returning to the middle of any PROG or REPEAT still active.
Argument:
Template: #DECL ("VALUE" TAG ATOM)
Argument 1 -- a legal argument for local GOs
Returns -- a TAG for non-local GOs
Example: <PROG (&)
&
LABEL
<FOO>
&
<LOWER .BAR <TAG LABEL>>
&>
See how easy it is to make confusing programs?
TERPRI: Print a carriage-return and line-feed
Object-type: SUBR
Category: I/O
Reference: CRLF
Argument:
Template: #DECL ("VALUE" '#FALSE () "OPTIONAL" CHANNEL)
(Optional)
Argument 1 -- the channel, default .OUTCHAN
Returns -- #FALSE ()
Example: <TERPRI>
#FALSE ()
Terminate printing on this line.
TIME: Return the Run time of the MUDDLE
Object-type: SUBR
Category: UTILITY, SYSTEM
TIME returns a FLOAT giving the run time of the MUDDLE in
seconds.
TIME takes any number of optional arguments, however, and is thus
often used to pass arguments for examination at a DDT break point.
Argument:
Template: #DECL ("VALUE" FLOAT "TUPLE" <TUPLE [REST ANY]>)
(Optional)
Tuple of arguments -- ANY objects.
Returns -- FLOAT, the run time of the MUDDLE in seconds.
Example: <TIME>
69.104992
Run time.
TOP: Replace elements of a structure removed by REST
Object-type: SUBR
Category: DATA-HANDLING
Reference: BACK, REST
TOP replaces all items removed from a non-list structure by
RESTing. For PRIMTYPE VECTORs, UVECTORs, STRINGs, and TEMPLATEs, TOP
returns the object passed after having returned the pointer to the top
of the object and changed the type to the PRIMTYPE. Since list
structures have no back pointers, it is impossible to either BACK them
or TOP them.
Argument:
Template: #DECL ("VALUE" <OR VECTOR UVECTOR STRING TEMPLATE>
<PRIMTYPE <OR VECTOR UVECTOR STRING TEMPLATE>>)
Argument 1 -- A structured object that can be BACKed (VECTOR, UVECTOR,
STRING, or TEMPLATE.
Returns -- The object with the RESTed elements (if any) returned and
changed to its PRIMTYPE.
Example: <==? <TOP <REST <SET X "FOOBARBLECH"> 6>>
.X>
This will return T, as the same object is always there, just with a
different pointer into it.
TTYECHO: Turn TTY echoing for a CHANNEL on and off
Object-type: SUBR
Category: I/O
Reference: TYI
TTYECHO takes a channel and a FALSE or non-FALSE, ands sets
the TTY echoing for that channel to 'off' if FALSE, 'on' if non-FALSE.
This is useful in conjunction with the SUBR TYI (qv) for applic-
ations where TTY echoing is not straight character at a time.
ERROR and LISTEN automatically do <TTYECHO .INCHAN T> when they
are called.
Argument:
Template: #DECL ("VALUE" CHANNEL CHANNEL <OR ANY FALSE>)
Argument 1 -- A TTY CHANNEL.
Argument 2 -- non-FALSE to turn on echoing, FALSE to turn it off.
Returns -- The channel.
Example: <TTYECHO .INCHAN T>
ERROR and LISTEN do this automatically.
TUPLE: Create a TUPLE with explicit elements
Object-type: SUBR
Category: DATA-HANDLING
Reference: ITUPLE
TUPLE creates a tuple (vector on the stack) with explicit
elements. TUPLE can only be invoked at top level of an atom-value
pair in a parameter list, such as AUX or OPTIONALs, or the top binding
pairs of PROG or REPEAT.
Note that a TUPLE cannot be returned past the FRAME in which it
was bound.
Argument:
Template: #DECL ("VALUE" TUPLE "TUPLE" TUPLE)
Tuple of arguments -- ANY, the elements of the TUPLE.
Returns -- Newly stacked TUPLE.
Example: <PROG ((X <TUPLE 1 2 3 4>)) <+ !.X>>
This is a legitimate, if trivial, use of TUPLE.
<PROG ((X <REST <TUPLE 1 2 3 4>>))
<+ !.X>>
This use of TUPLE is both trivial and illegal: it is not at top level
of the atom-value pair.
TYI: Read a single character as it is typed on the TTY
Object-type: SUBR
Category: I/O
Reference: TTYECHO
TYI is used to read characters from the TTY as they are typed
rather than after an alt-mode is typed, as is the case with READCHR
and READ. It may be used in conjunction with TTYECHO by programs
that wish to do their own reading and echoing.
Argument:
Template: #DECL ("VALUE" CHARACTER "OPTIONAL" CHANNEL)
Argument 1 -- A TTY channel on which to read a character, default .INCHAN.
Returns -- The character read.
Example: <TTYECHO .INCHAN <>>
<REPEAT ()
<PRINC <CHTYPE <+ 32 <CHTYPE <TYI .INCHAN> FIX>> CHARACTER>
.INCHAN>>
Turn echoing off and echo characters read as their value plus 40.
TYPE-C: Get a type code for pure-program use
Object-type: SUBR
Category: TYPE-DEFINITION
Reference: NEWTYPE, TYPE-W
Argument:
Template: #DECL ("VALUE" TYPE-C ATOM "OPTIONAL" ATOM)
Argument 1 -- the newtype to get a code for
(Optional)
Argument 2 -- its primtype, as a check
Returns -- a type code
Example: <TYPE-C MYLIST LIST>
makes or gets a type code for my newtype
TYPE-W: Get a type word for pure RSUBR use
Object-type: SUBR
Category: TYPE-DEFINITION
Reference: NEWTYPE, TYPE-C
Argument:
Template: #DECL ("VALUE" TYPE-W ATOM "OPTIONAL"
ATOM <PRIMTYPE WORD>)
Argument 1 -- name of newtype
(Optional)
Argument 2 -- primtype thereof, as a check
Argument 3 -- right half to include in result
Returns -- a type word
Example: <TYPE-W MYLIST LIST 69>
a type word for NEWTYPE MYLIST
TYPE: Return the type of an object
Object-type: SUBR
Category: TYPE
Reference: UTYPE, TYPE?, PRIMTYPE, TYPEPRIM
TYPE is applied to any MUDDLE object to return an ATOM which is
the name of the type of that object. PRIMTYPE, which is similar,
returns the primitive type of the object given. TYPEPRIM returns the
primitive type given the name of the type.
Argument:
Template: #DECL ("VALUE" ATOM ANY)
Argument 1 -- Any MUDDLE object.
Returns -- ATOM, the name of the type of the argument.
Example: <TYPE TYPE>
ATOM
<TYPE "Comments on example">
STRING
TYPE?, which checks to see if its argument is one of a series of
types, is often used instead of TYPE in conditionals.
TYPE?: Is an object one of a group of types?
Object-type: SUBR
Category: PREDICATE, TYPE
Reference: TYPE
TYPE? takes as arguments an object and at least one type name.
If the object is one of the types given, that type is returned. If it
is not, returns FALSE. TYPE? is essentially the same as MEMQing the
TYPE of the object in a list of types, but is syntactically clearer
and better understood by the compiler.
Argument:
Template: #DECL ("VALUE" <OR FALSE ATOM> ANY "TUPLE"
<TUPLE ATOM [REST ATOM]>)
Argument 1 -- Any MUDDLE object.
Tuple of arguments -- Any number (at least one, though) type names.
Returns -- The type if it is in the tuple, or FALSE if it is not.
Example: <TYPE? 1 FIX FLOAT WORD>
FIX
Will take any number of type names.
TYPEPRIM: Return the primitive type of a type
Object-type: SUBR
Category: TYPE
Reference: UTYPE, TYPE?, PRIMTYPE, TYPE
TYPEPRIM returns the primitive type given the name of the type
of a MUDDLE object. It is thus different from PRIMTYPE, which takes
the object itself.
Argument:
Template: #DECL ("VALUE" ATOM ATOM)
Argument 1 -- An ATOM which is the name of a type.
Returns -- ATOM, the name of the primitive type of the argument.
Example: <TYPE 1>
FIX
<PRIMTYPE 1>
WORD
<TYPEPRIM FIX>
WORD
Illustrates difference between PRIMTYPE and TYPEPRIM.
UNAME: Return the User-name of the MUDDLE
Object-type: SUBR
Category: SYSTEM
Returns the UNAME, or login-name of the MUDDLE. This is the
name under which the person running the MUDDLE logged in. It is also
one of the names of the MUDDLE job.
Argument:
Template: #DECL ("VALUE" STRING)
Returns -- A STRING giving the UNAME of the job.
Example: <UNAME>
Only possible example.
UNASSIGN: Removes the local value of an ATOM
Object-type: SUBR
Category: IDENTIFIER
Reference: LVAL, ASSIGNED?
UNASSIGN removes the local value of an ATOM. After an ATOM
has been UNASSIGNED, LVAL of it will cause an error, and ASSIGNED?
of it will return FALSE.
Argument:
Template: #DECL ("VALUE" ATOM ATOM "OPTIONAL"
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- The ATOM to flush the LVAL of.
(Optional)
Argument 2 -- the environment of the LVAL
Returns -- The ATOM you just UNASSIGNed.
Example: <UNASSIGN SNM>
SNM
if it's giving you trouble
UNMANIFEST: Declare the global value of an ATOM to no longer be a constant
Object-type: SUBR
Category: DATA-HANDLING
Reference: MANIFEST, MANIFEST?, GDECL
UNMANIFEST declares that the current global value of an ATOM is
no longer a constant. Generally a ATOM passed to UNMANIFEST will have
previously been passed to MANIFEST.
UNMANIFEST is generally used to remove the restriction on changing
an MANIFEST variable so that it CAN be changed.
Argument:
Template: #DECL ("VALUE" 'T "TUPLE" <TUPLE [REST ATOM]>)
Tuple of arguments -- ATOMs whose GVALs are no longer constants.
Returns -- T.
Example: <SETG A 1>
<SETG B 2>
<MANIFEST A B>
...
<UNMANIFEST A>
<SETG A 4>
Most common use of UNMANIFEST.
UNPARSE: Recreate the STRING representation of a MUDDLE object
Object-type: SUBR
Category: DATA-HANDLING
Reference: PARSE, LPARSE
UNPARSE create a string representation of a MUDDLE object, just
like printing into a string instead of a channel.
Argument:
Template: #DECL ("VALUE" STRING ANY "OPTIONAL" FIX)
Argument 1 -- ANY, object to be 'printed' into a string.
(Optional)
Argument 2 -- radix for FIX conversion, default ten
Returns -- A STRING, the unparsed object.
Example: <PARSE <UNPARSE (1 2 3 4)>>
This is one way of creating a non-shared copy of a structure.
Object-type: FSUBR
Category: PROGRAM-CONTROL
UNWIND is an FSUBR that takes two forms. It EVALs the first
one, and, if the EVAL returns normally, the value of that EVAL is the
value of UNWIND. If, however, during the EVAL a non-local return
attempts to return beyond the UNWIND in the stack, then the second
form is EVALed, its value is ignored, and the non-local return is
completed. The second form is evaluated in the environment that was
present when the call to UNWIND was made.
This facility is useful for cleaning up data bases that are in
inconsistent states and closing temporary channels that may be left
around. FLOAD sets up an UNWIND to close its CHANNEL if the user
attempts to ERRET without finishing the FLOAD.
Argument:
Template: #DECL ("VALUE" ANY "ARGS" <LIST ANY ANY>)
Argument 1 -- A form to be EVALed.
Argument 2 -- A form to EVAL if a non-local return beyond the UNWIND
happens.
Returns -- The result of EVALing argument 1 (only local return that
can happen).
Example: <DEFINE FOO ACT ("AUX" (C
<OPEN "READ"
"FOOBAR">))
<UNWIND <PROG () "...&..."> <CLOSE .C>>>
Channel C will be closed if the PROG returns non-locally, as from
ACT, for example.
UTYPE: Return the Uniform type of a UVECTOR
Object-type: SUBR
Category: TYPE
Reference: UVECTOR, CHUTYPE
UTYPE returns the name of the uniform type of a UVECTOR. This
is the type of all objects in the UVECTOR. It may be changed by using
CHUTYPE (within limits).
Argument:
Template: #DECL ("VALUE" ATOM <PRIMTYPE UVECTOR>)
Argument 1 -- A UVECTOR
Returns -- An ATOM, which is the name of the UVECTOR's uniform type.
Example: <UTYPE ![1 2 3 4!]>
FIX
Allows you to get the utype without accessing any individual element.
UVECTOR: Create a UVECTOR with explicit elements
Object-type: SUBR
Category: DATA-HANDLING
Reference: IUVECTOR
UVECTOR creates a uvector with explicit elements. Note that all
of these elements must be of the same type, else ERROR. UVECTOR is
different from an explicit usage of excl-[, because in such usage all
the elements must be the same when read in -- they are already a
UVECTOR before evaluation.
Argument:
Template: #DECL ("VALUE" UVECTOR "TUPLE" <TUPLE [REST ANY]>)
Tuple of arguments -- ANY, the elements must all be of same type, and
can't be strings, LOCDs, or on the stack.
Returns -- A new UVECTOR.
Example: <UVECTOR 1 2 3>
Equivalent to ![1 2 3]
<UVECTOR 1 .FOO .BAR>
Not equivalent to ![1 .FOO .BAR!], which is illegal
VALID-TYPE?: Is an ATOM the name of a type?
Object-type: SUBR
Category: TYPE-DEFINITION, PREDICATE
Reference: NEWTYPE
VALID-TYPE? returns #FALSE () if its argument is not the name of a
TYPE, and TYPE-C of its argument if it is. It is much more efficient
than <MEMQ .arg <ALLTYPES>> .
Argument:
Template: #DECL ("VALUE" <OR TYPE-C FALSE> ATOM)
Argument 1 -- an ATOM that might be the name of a TYPE
Returns -- whether or not it really is
Example: <VALID-TYPE? FOO>
#FALSE ()
<NEWTYPE FOO CHARACTER>
FOO
<VALID-TYPE? FOO>
now returns %<TYPE-C FOO CHARACTER>
VALRET: Returns a string to MUDDLE's superior
Object-type: SUBR
Category: ENVIRONMENT
Reference: LOGOUT, QUIT
VALRET returns a string to the MUDDLE's superior. This is
usually only useful if the superior is a MONIT or DDT (which are the
two normal superiors on ITS). VALRET's can be used to execute
commands in DDT and then return to MUDDLE, but because they are
limited to use on ITS, it is untasteful to use VALRET where other
means would suffice.
Argument:
Template: #DECL ("VALUE" ANY STRING)
Argument 1 -- A STRING to return to MUDDLE's superior.
Returns -- ANY.
Example: <VALRET "..SENDRP/-1
70/2Q
:VP
">
This example is a VALRET string that will cause DDT to stop printout
of unsolicited messages.
VALUE: Return the local or else the global value of an atom
Object-type: SUBR
Category: IDENTIFIER
Reference: LVAL, GVAL
If its argument has a local value (in a given environment),
VALUE returns the value; else, if it has a global value, returns that;
else error.
Argument:
Template: #DECL ("VALUE" ANY ATOM "OPTIONAL"
<OR ENVIRONMENT ACTIVATION FRAME PROCESS>)
Argument 1 -- the atom whose value to get
(Optional)
Argument 2 -- the environment to look for a local value in
Returns -- local or else global value
Example: <VALUE SNM>
default disk directory for I/O
VECTOR: Create a VECTOR with explicit elements
Object-type: SUBR
Category: DATA-HANDLING
Reference: IVECTOR
VECTOR creates a vector with explicit elements. It is the
same as enclosing the arguments to VECTOR in [ and ].
Argument:
Template: #DECL ("VALUE" VECTOR "TUPLE" <TUPLE [REST ANY]>)
Tuple of arguments -- ANY, the elements
Returns -- A new VECTOR.
Example: <VECTOR 1 2 3>
equivalent to [1 2 3]
XORB: Bitwise logical Exclusive OR
Object-type: SUBR
Category: ARITHMETIC
Reference: EQVB, ORB, ANDB
XORB takes any number of objects of Primtype WORD, and returns
a WORD containing the bitwise logical exclusive OR of the arguments.
Argument:
Template: #DECL ("VALUE" WORD
"TUPLE" <TUPLE [REST <PRIMTYPE WORD>]>)
Tuple of arguments -- Objects of primtype WORD to be XORed together.
Returns -- A WORD containing the bitwise XOR of the arguments.
Example: <XORB #WORD *000000000001*
#WORD *000000000001*
#WORD *000000042263*>
#WORD *000000042263*
Primarily useful for getting fingers directly in the bits.