--- freem/doc/freem.texi 2025/05/03 03:07:55 1.39 +++ freem/doc/freem.texi 2025/05/05 04:55:42 1.43 @@ -699,7 +699,7 @@ Please note that FreeM is not entirely s * $SYSTEM:: MDC system ID of FreeM. * $TEST:: Truth value of last conditional expression or result of certain @code{LOCK} operations. * $TLEVEL:: Current level of transaction nesting. -* $WITH:: Current variable prefix set by @code{WITH} command. +* $WITH:: Current variable prefix set by @code{ZWITH} command. * $X:: Current horizontal screen position. * $Y:: Current vertical screen position. * $ZA:: Current position of file on @code{$IO}. @@ -895,7 +895,7 @@ uncommitted transactions exist. @cindex $WITH @cindex intrinsic special variables, $WITH -Returns the variable prefix set by the @code{@ref{WITH}} command. +Returns the variable prefix set by the @code{@ref{ZWITH}} command. @node $X @section $X @@ -2018,7 +2018,6 @@ Identical to @ref{$TRANSLATE()}, except * AUNBLOCK:: Decrement the block counter for one or more event classes. * BREAK:: Interrupt a running routine to allow interactive debugging. * CLOSE:: Close an input/output device. -* CONST:: Define a constant that cannot be altered after initial definition. * DO:: Transfer program control to one or more subroutines or introduces a new execution level. * ELSE:: Execute the remainder of a line if @code{@ref{$TEST}} evaluates @emph{false}. * FOR:: Repeat execution of a line or block of code. @@ -2031,7 +2030,6 @@ Identical to @ref{$TRANSLATE()}, except * KSUBSCRIPTS:: Kill only the descendant subscripts of a local, global, global, or structured system variable. * KVALUE:: Kill only the value of a local, global, or structured system variable. * LOCK:: Control advisory locking for concurrency control. -* MAP:: Map a global name to a non-default namespace. * MERGE:: Merge contents of one local, global, or structured system variable into another. * NEW:: Introduce a new scope for a specified local variable or intrinsic special variable or instantiate an object. * OPEN:: Open a sequential or socket input/output device. @@ -2040,28 +2038,30 @@ Identical to @ref{$TRANSLATE()}, except * SET:: Set the value of a local variable, global, intrinsic special variable, or structured system variable. * TCOMMIT:: Commit a transaction. * THEN:: Preserve @code{@ref{$TEST}} until the end of the current line. -* THROW:: Programmatically raise an error condition. * TROLLBACK:: Roll back all pending transactions. * TSTART:: Introduce a new transaction processing level. -* UNMAP:: Remove a mapping of a global to a non-default namespace. * USE:: Set the currently-active input/output device. * VIEW:: Modify FreeM internal parameters. -* WATCH:: Enable or disable watchpoints, or set or clear watchpoints on specified globals, locals, or structured system variables. -* WITH:: Set prefix for future variable references. * WRITE:: Write output to current input/output device. * XECUTE:: Interpret string as M code. * ZBREAK:: Unknown. +* ZCONST:: Define a constant that cannot be altered after initial definition. * ZGO:: Unknown. * ZHALT:: Unknown. * ZINSERT:: Insert code into routine buffer. -* ZJOB:: Unknown. +* ZJOB:: Invokes a job, ignoring any timeouts. * ZLOAD:: Load routine into routine buffer. +* ZMAP:: Map a global name to a non-default namespace. * ZNEW:: Unknown. * ZPRINT:: Print contents of routine buffer. -* ZQUIT:: Unknown. +* ZQUIT:: Quits multiple stack levels at once. * ZREMOVE:: Remove code from routine buffer. * ZSAVE:: Save routine buffer to disk. +* ZTHROW:: Programmatically raise an error condition. * ZTRAP:: Unknown. +* ZUNMAP:: Remove a mapping of a global to a non-default namespace. +* ZWATCH:: Enable or disable watchpoints, or set or clear watchpoints on specified globals, locals, or structured system variables. +* ZWITH:: Set prefix for future variable references. * ZWRITE:: Write local variable, global, or structured system variable to @code{@ref{$IO}}. @end menu @@ -2359,23 +2359,6 @@ In its argumentless form, @code{CLOSE} c In its single-argument form, @code{CLOSE} closes the I/O device associated with channel @emph{channel}, provided that @emph{channel} represents a currently-open device, and the optional @emph{postcondition} is @emph{true} or omitted. -@node CONST -@section CONST -@cindex CONST -@cindex commands, CONST -@cindex commands, non-standard -@emph{FreeM Extension} - -Defines a local @emph{constant}, or variable that cannot be altered after its initial definition, provided the optional @emph{postcondition} is @emph{true} or omitted. - -Constants must only be locals, and globals are not supported. - -@emph{Syntax} - -@example -@code{CONST@emph{:postcondition} @emph{mref1}=@emph{initial-value1},...,@emph{mrefN}=@emph{initial-valueN}} -@end example - @node DO @section DO @cindex DO @@ -2742,21 +2725,6 @@ If @code{LOCK} succeeds within @emph{tim LOCK[@emph{:postcondition}] @emph{name}[:@emph{timeout}][,...@emph{name}[:@emph{timeout}]] @end example -@node MAP -@section MAP -@cindex MAP -@cindex commands, MAP -@cindex commands, implementation-specific -@cindex commands, non-standard - -Maps global name @code{gvn} to be mapped to the non-default namespace @emph{expr V namespace}, provided the optional @emph{postcondition} evaluates to @emph{true} or is omitted. - -@emph{Syntax} - -@example -MAP[@emph{:postcondition}] GLOBAL @emph{gvn}=@emph{expr V namespace} -@end example - @node MERGE @section MERGE @cindex MERGE @@ -3006,27 +2974,6 @@ Saves the value of @code{$TEST} until th IF 1 THEN WRITE "HELLO!",! @end example -@node THROW -@section THROW -@cindex THROW -@cindex commands, THROW -@cindex commands, non-standard -@emph{FreeM Extension} - -Raises an error condition as long as the optional @emph{postcondition} is @emph{true} or omitted. - -@emph{Syntax} - -@example -@code{THROW@emph{:postcondition} @emph{expr V error-code}} -@end example - -@emph{Example} - -@example -@code{THROW "M102"} -@end example - @node TROLLBACK @section TROLLBACK @cindex TROLLBACK @@ -3091,20 +3038,6 @@ If you are using more than one transacti TSTART (FOO,BAR):(SERIAL,TRANSACTIONID="FOO") @end example -@node UNMAP -@section UNMAP -@cindex UNMAP -@cindex commands, UNMAP -@cindex commands, implementation-specific -@cindex commands, non-standard - -Removes any mapping connecting @emph{gvn} to a non-default namespace, provided the optional @emph{postcondition} evaluates to @emph{true} or is omitted. - -@emph{Syntax} - -@example -UNMAP GLOBAL @emph{gvn} -@end example @node USE @section USE @@ -3409,94 +3342,6 @@ VIEW 133:@emph{tvexpr} @end table -@node WATCH -@section WATCH -@cindex WATCH -@cindex commands, WATCH -@cindex commands, debugging -@cindex commands, implementation-specific -@cindex commands, non-standard -@emph{FreeM Extension} - -Sets a watchpoint on a global, local, or SSVN node. - -@emph{Syntax} - - -In its @emph{argumentless} form, @code{WATCH} toggles watchpoints on and off, provided the optional @emph{postcondition} is @emph{true} or omitted. - -@example -WATCH[@emph{:postcondition}] -@end example - -In its @emph{inclusive} form, @code{WATCH} adds, removes, or examines watchpoints, provided the optional @emph{postcondition} is @emph{true} or omitted. - -A @code{+} adds a new watchpoint to the following variable. - -A @code{-} removes an existing watchpoint for the following variable. - -A @code{?} examines the status of a watchpoint for the following variable. - -@example -WATCH[@emph{:postcondition}] [+|-|?]@emph{var1}...,[+|-|?]@emph{varN} -@end example - - -The following example demonstrates turning watchpoint processing on and adding a watchpoint for global variable @code{^snw(1)}. It then changes the value of @code{^snw(1)}. - -@example -DEFAULT.USER> WATCH - -Watchpoints enabled. - -DEFAULT.USER> WATCH +^SNW(1) - -Added '^SNW("1")' to the watchlist. - -DEFAULT.USER> SET ^SNW(1)="new value" - ->> WATCHPOINT: ^SNW("1") => 'new value' (changed 1 times) - -@end example - -The following example will remove that watchpoint: - -@example -DEFAULT.USER> WATCH -^SNW(1) - -Removed '^SNW("1")' from the watchlist. - -DEFAULT.USER> WATCH ?^SNW(1) - -'^SNW("1")' is not being watched. -@end example - -@node WITH -@section WITH -@cindex WITH -@cindex commands, WITH -@cindex commands, non-standard -@emph{FreeM Extension} - -NOTE: This command may be deprecated and removed in future FreeM releases. - -Sets a prefix to be applied to all subsequent local variable or constant references. - -@emph{Syntax} - -@example -@code{WITH@emph{:postcondition} @emph{var-prefix}} -@end example - -In the above single-argument form, sets the @code{$WITH} prefix to @emph{var-prefix}, provided that the optional @emph{postcondition} is either @emph{true} or omitted. - -The @emph{var-prefix} argument may be a string literal or any valid FreeM expression. - -@example -@code{WITH@emph{:postcondition}} -@end example - -In the above argumentless form, clears the @code{$WITH} prefix, provided the optional @emph{postcondition} is either @emph{true} or omitted. Equivalent to @code{WITH ""}. @node WRITE @@ -3518,6 +3363,23 @@ In the above argumentless form, clears t @cindex commands, non-standard @emph{FreeM Extension} +@node ZCONST +@section ZCONST +@cindex ZCONST +@cindex commands, ZCONST +@cindex commands, non-standard +@emph{FreeM Extension} + +Defines a local @emph{constant}, or variable that cannot be altered after its initial definition, provided the optional @emph{postcondition} is @emph{true} or omitted. + +Constants must only be locals, and globals are not supported. + +@emph{Syntax} + +@example +@code{ZCONST@emph{:postcondition} @emph{mref1}=@emph{initial-value1},...,@emph{mrefN}=@emph{initial-valueN}} +@end example + @node ZGO @section ZGO @cindex ZGO @@ -3570,6 +3432,22 @@ Loads routine @emph{} into ZLOAD@emph{:postcondition} @emph{} @end example + +@node ZMAP +@section ZMAP +@cindex ZMAP +@cindex commands, ZMAP +@cindex commands, implementation-specific +@cindex commands, non-standard + +Maps global name @code{gvn} to be mapped to the non-default namespace @emph{expr V namespace}, provided the optional @emph{postcondition} evaluates to @emph{true} or is omitted. + +@emph{Syntax} + +@example +ZMAP[@emph{:postcondition}] GLOBAL @emph{gvn}=@emph{expr V namespace} +@end example + @node ZNEW @section ZNEW @cindex ZNEW @@ -3628,6 +3506,28 @@ In its argumentless form, quits from @co @cindex commands, non-standard @emph{FreeM Extension} + +@node ZTHROW +@section ZTHROW +@cindex ZTHROW +@cindex commands, ZTHROW +@cindex commands, non-standard +@emph{FreeM Extension} + +Raises an error condition as long as the optional @emph{postcondition} is @emph{true} or omitted. + +@emph{Syntax} + +@example +@code{ZTHROW@emph{:postcondition} @emph{expr V error-code}} +@end example + +@emph{Example} + +@example +@code{ZTHROW "M102"} +@end example + @node ZTRAP @section ZTRAP @cindex ZTRAP @@ -3637,6 +3537,117 @@ In its argumentless form, quits from @co @cindex commands, non-standard @emph{FreeM Extension} +@node ZUNMAP +@section ZUNMAP +@cindex ZUNMAP +@cindex commands, ZUNMAP +@cindex commands, implementation-specific +@cindex commands, non-standard + +Removes any mapping connecting @emph{gvn} to a non-default namespace, provided the optional @emph{postcondition} evaluates to @emph{true} or is omitted. + +@emph{Syntax} + +@example +ZUNMAP GLOBAL @emph{gvn} +@end example + +@node ZWATCH +@section ZWATCH +@cindex ZWATCH +@cindex commands, ZWATCH +@cindex commands, debugging +@cindex commands, implementation-specific +@cindex commands, non-standard +@emph{FreeM Extension} + +Sets a watchpoint on a global, local, or SSVN node. + +@emph{Syntax} + + +In its @emph{argumentless} form, @code{ZWATCH} toggles watchpoints on and off, provided the optional @emph{postcondition} is @emph{true} or omitted. + +@example +ZWATCH[@emph{:postcondition}] +@end example + +In its @emph{inclusive} form, @code{ZWATCH} adds, removes, or examines watchpoints, provided the optional @emph{postcondition} is @emph{true} or omitted. + +A @code{+} adds a new watchpoint to the following variable. + +A @code{-} removes an existing watchpoint for the following variable. + +A @code{?} examines the status of a watchpoint for the following variable. + +@example +ZWATCH[@emph{:postcondition}] [+|-|?]@emph{var1}...,[+|-|?]@emph{varN} +@end example + + +The following example demonstrates turning watchpoint processing on and adding a watchpoint for global variable @code{^snw(1)}. It then changes the value of @code{^snw(1)}. + +@example +DEFAULT.USER> ZWATCH + +Watchpoints enabled. + +DEFAULT.USER> ZWATCH +^SNW(1) + +Added '^SNW("1")' to the watchlist. + +DEFAULT.USER> SET ^SNW(1)="new value" + +>> WATCHPOINT: ^SNW("1") => 'new value' (changed 1 times) + +@end example + +The following example will remove that watchpoint: + +@example +DEFAULT.USER> ZWATCH -^SNW(1) + +Removed '^SNW("1")' from the watchlist. + +DEFAULT.USER> ZWATCH ?^SNW(1) + +'^SNW("1")' is not being watched. +@end example + +@node ZWITH +@section ZWITH +@cindex ZWITH +@cindex commands, ZWITH +@cindex commands, non-standard +@emph{FreeM Extension} + +NOTE: This command may be deprecated and removed in future FreeM releases. + +Sets a prefix to be applied to all subsequent local variable or constant references. + +@emph{Syntax} + +@example +@code{ZWITH@emph{:postcondition} @emph{var-prefix}} +@end example + +In the above single-argument form, sets the @code{$WITH} prefix to @emph{var-prefix}, provided that the optional @emph{postcondition} is either @emph{true} or omitted. + +The @emph{var-prefix} argument may be a string literal or any valid FreeM expression. + +@example +@code{ZWITH@emph{:postcondition}} +@end example + +In the above argumentless form, clears the @code{$WITH} prefix, provided the optional @emph{postcondition} is either @emph{true} or omitted. Equivalent to @code{ZWITH ""}. + + + + + + + + @node ZWRITE @section ZWRITE @cindex ZWRITE @@ -4780,6 +4791,13 @@ The effect of this is that the operation @cindex variables, local @cindex local variables +@menu +* Local Variables Overview:: The basics of locals. +* Creating Local Variables:: Creating locals with SET. +* Removing Local Variables:: Removing locals with KILL. +@end menu + +@node Local Variables Overview @section Local Variables Overview FreeM @emph{local variables} have the same data structure as global variables, but are scoped to a single FreeM process, and stored in memory. @@ -4877,7 +4895,7 @@ MYRTN ; @cartouche @quotation -@emph{MDC Type A Extension} +@emph{Style Recommendation} Note that @code{THEN} is not in any currently published version of the @emph{Standard}, but is part of MDC Type A extension X11/1998-31. However, we recommend using @code{THEN} instead of favoring portability, as there is no defensible reason for this incredibly simple feature @emph{not} to be ubiquitous. @@ -4927,24 +4945,10 @@ If you use other M implementations, you @cindex object-oriented programming @cindex programming, object-oriented -@menu -* Classes:: The basis of object-oriented programming. -* Inheritance:: Basing one class upon another. -* Methods:: Attaching code to a class. -* Public and Private Variables:: Managing class member access. -* Instantiating Objects:: Creating instances of classes. -* Determining Object Class:: Getting object information at runtime. -@end menu @node Classes @section Classes -@menu -* Class Overview:: Class basics. -* Constructors:: Managing object creation. -* Destructors:: Cleaning up. -* Runtime Polymorphism:: Selecting methods at runtime. -@end menu @node Class Overview @subsection Class Overview