version 1.27, 2025/04/18 15:39:23
|
version 1.28, 2025/04/18 19:43:18
|
Line 235 Steve Zeck (Code)
|
Line 235 Steve Zeck (Code)
|
$ @command{./freem} [@emph{OPTIONS}...] [[-r <entryref>] | [--routine=<entryref>]] |
$ @command{./freem} [@emph{OPTIONS}...] [[-r <entryref>] | [--routine=<entryref>]] |
@end example |
@end example |
|
|
When FreeM loads, it searches the @code{SYSTEM} namespace for the @code{^%SYSINIT} routine, and begins executing it. |
When FreeM loads, it searches the @code{SYSTEM} namespace for the @code{%SYSINIT} routine, and begins executing it. |
|
|
When @code{-r} or @code{--routine} are passed on the command line, FreeM will load and run the specified routine after running @code{^%SYSINIT}. Beginning with FreeM 0.1.7, routines invoked in this manner are no longer required to perform their own namespace setup with @code{VIEW} commands. |
When @code{-r} or @code{--routine} are passed on the command line, FreeM will load and run the specified routine after running @code{%SYSINIT}. Beginning with FreeM 0.1.7, routines invoked in this manner are no longer required to perform their own namespace setup with @code{VIEW} commands. |
|
|
@section %SYSINIT Routine |
@section %SYSINIT Routine |
|
|
The @code{^%SYSINIT} routine runs every time a FreeM interpreter process starts. This routine defines some useful constants, enables handling of @code{TRIGGER} events, and handles the execution of code passed via the @code{-x\--execute} or routines passed via @code{-r|--routine}. |
The @code{%SYSINIT} routine runs every time a FreeM interpreter process starts. This routine defines some useful constants, enables handling of @code{TRIGGER} events, and handles the execution of code passed via the @code{-x\--execute} or routines passed via @code{-r|--routine}. |
|
|
Do not modify the supplied @code{^%SYSINIT} routine to add site-specific startup items. Instead, create a @code{^LCLINIT} routine in the @code{USER} namespace of one or more environments. @code{^%SYSINIT} will automatically run @code{^LCLINIT} each time it starts. |
Do not modify the supplied @code{%SYSINIT} routine to add site-specific startup items. Instead, create a @code{LCLINIT} routine in the @code{USER} namespace of one or more environments. @code{%SYSINIT} will automatically run @code{LCLINIT} each time it starts. |
|
|
@section Command-Line Options |
@section Command-Line Options |
@cindex options, command-line |
@cindex options, command-line |
Line 278 Allows your M routines to be used as UNI
|
Line 278 Allows your M routines to be used as UNI
|
Selects the FreeM namespace to be entered on startup. Must be defined in @file{/etc/<environment>/freem.conf}. |
Selects the FreeM namespace to be entered on startup. Must be defined in @file{/etc/<environment>/freem.conf}. |
|
|
@item @option{-r @emph{<entryref>}}, @option{--routine=@emph{<entryref>}} |
@item @option{-r @emph{<entryref>}}, @option{--routine=@emph{<entryref>}} |
Causes @code{<entryref>} to be executed at load, instead of @code{^%SYSINIT}. |
Causes @code{<entryref>} to be executed at load, instead of @code{%SYSINIT}. |
|
|
@item @option{--standard=@emph{<standard>}} |
@item @option{--standard=@emph{<standard>}} |
Sets the default FreeM dialect to use for new routine buffers. |
Sets the default FreeM dialect to use for new routine buffers. |
Line 435 Displays a list of @code{LOCK}s held in
|
Line 435 Displays a list of @code{LOCK}s held in
|
@item @command{rbuf} |
@item @command{rbuf} |
Lists the status of all FreeM routine buffers. |
Lists the status of all FreeM routine buffers. |
|
|
@anchor{dbstats} |
|
@item @command{dbstats} |
|
Shows statistics for the BerkeleyDB global handler. |
|
|
|
@anchor{wh} |
@anchor{wh} |
@item @command{wh} |
@item @command{wh} |
Forces an immediate flush of this process's @code{readline} history buffer to disk. |
Forces an immediate flush of this process's @code{readline} history buffer to disk. |
Line 474 DEFAULT.USER>
|
Line 470 DEFAULT.USER>
|
@end example |
@end example |
|
|
@item @command{!@emph{<external-command>}} |
@item @command{!@emph{<external-command>}} |
Invokes a shell to run @emph{<external-command>} from within FreeM. This temporarily disables @command{SIGALRM} handling in FreeM, which may interrupt the use of event-driven M programming commands including @command{ESTART} and @command{ESTOP}. |
Invokes a shell to run @emph{<external-command>} from within FreeM. This temporarily disables @command{SIGALRM} handling in FreeM, which may interrupt the use of event-driven M programming commands including @command{ASTART} and @command{ASTOP}. |
|
|
If the @command{>} character is supplied immediately preceding @emph{<external-command>}, FreeM will append the contents of an M local or global variable referenced in @code{^$JOB($JOB,"PIPE_GLVN")} to the standard input stream of @emph{<external-command>}. |
If the @command{>} character is supplied immediately preceding @emph{<external-command>}, FreeM will append the contents of an M local or global variable referenced in @code{^$JOB($JOB,"PIPE_GLVN")} to the standard input stream of @emph{<external-command>}. |
|
|
Line 663 Please note that FreeM is not entirely s
|
Line 659 Please note that FreeM is not entirely s
|
|
|
Returns a comma-delimited list of error conditions currently present, and is writable. An empty @code{$ECODE} indicates no errors. |
Returns a comma-delimited list of error conditions currently present, and is writable. An empty @code{$ECODE} indicates no errors. |
|
|
|
Writing a value in the format @code{,<error-code>,} into @code{$ECODE} will raise that error condition. |
|
|
@node $ESTACK |
@node $ESTACK |
@section $ESTACK |
@section $ESTACK |
@cindex $ESTACK |
@cindex $ESTACK |
Line 1242 The optional fourth argument is the fina
|
Line 1240 The optional fourth argument is the fina
|
Can be used on the left-hand side of an expression in order to @code{@ref{SET}} a value into a @code{d}-delimited piece of @code{s}, as in: |
Can be used on the left-hand side of an expression in order to @code{@ref{SET}} a value into a @code{d}-delimited piece of @code{s}, as in: |
|
|
@example |
@example |
; ^jpw="this^is^a^piece" |
; ^snw="this^is^a^piece" |
SET $PIECE(^jpw,"^",2)="isn't" ; => "this^isn't^a^piece" |
SET $PIECE(^snw,"^",2)="isn't" ; => "this^isn't^a^piece" |
@end example |
@end example |
|
|
@node $QLENGTH() |
@node $QLENGTH() |
Line 1275 Returns the number of subscripts in @emp
|
Line 1273 Returns the number of subscripts in @emp
|
@code{$QSUBSCRIPT(@emph{expr V glvn},@emph{expr V n})} |
@code{$QSUBSCRIPT(@emph{expr V glvn},@emph{expr V n})} |
@end example |
@end example |
|
|
Returns the @emph{n}th subscript of @emph{glvn}. |
In the RHS form, returns the @emph{n}th subscript of @emph{glvn}. |
|
|
@emph{Example} |
@emph{Example} |
|
|
Line 1283 Returns the @emph{n}th subscript of @emp
|
Line 1281 Returns the @emph{n}th subscript of @emp
|
@code{SET SUB=$QSUBSCRIPT("^GBL(1,2,3)",2) ; => 2} |
@code{SET SUB=$QSUBSCRIPT("^GBL(1,2,3)",2) ; => 2} |
@end example |
@end example |
|
|
|
@emph{Syntax} |
|
|
|
@example |
|
@code{SET $QSUBSCRIPT(@emph{expr V glvn},@emph{expr V n})=@emph{expr} ; => ^GBL(1,4,3)} |
|
@end example |
|
|
|
In the LHS form, sets the @emph{n}th subscript of @emph{glvn} to @emph{expr}. |
|
|
@node $QUERY() |
@node $QUERY() |
@section $QUERY |
@section $QUERY |
@cindex $QUERY |
@cindex $QUERY |
Line 1300 Returns the next subscripted reference i
|
Line 1306 Returns the next subscripted reference i
|
|
|
We will assume the following data structure exists: |
We will assume the following data structure exists: |
@example |
@example |
^jpw(1)=1 |
^snw(1)=1 |
^jpw(1,2)="foo" |
^snw(1,2)="foo" |
^jpw(2)=3 |
^snw(2)=3 |
^jpw(3)="" |
^snw(3)="" |
@end example |
@end example |
|
|
The following code will retrieve the next subscripted name after @code{^jpw(1)}: |
The following code will retrieve the next subscripted name after @code{^snw(1)}: |
|
|
@example |
@example |
@code{SET NEXTNAM=$QUERY(^jpw(1)) ; => ^jpw(1,2)} |
@code{SET NEXTNAM=$QUERY(^snw(1)) ; => ^snw(1,2)} |
@end example |
@end example |
|
|
@node $RANDOM() |
@node $RANDOM() |
Line 3300 WATCH[@emph{:postcondition}] [+|-|?]@emp
|
Line 3306 WATCH[@emph{:postcondition}] [+|-|?]@emp
|
@end example |
@end example |
|
|
|
|
The following example demonstrates turning watchpoint processing on and adding a watchpoint for global variable @code{^jpw(1)}. It then changes the value of @code{^jpw(1)}. |
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 |
@example |
DEFAULT.USER> WATCH |
DEFAULT.USER> WATCH |
|
|
Watchpoints enabled. |
Watchpoints enabled. |
|
|
DEFAULT.USER> WATCH +^JPW(1) |
DEFAULT.USER> WATCH +^SNW(1) |
|
|
Added '^JPW("1")' to the watchlist. |
Added '^SNW("1")' to the watchlist. |
|
|
DEFAULT.USER> SET ^JPW(1)="new value" |
DEFAULT.USER> SET ^SNW(1)="new value" |
|
|
>> WATCHPOINT: ^JPW("1") => 'new value' (changed 1 times) |
>> WATCHPOINT: ^SNW("1") => 'new value' (changed 1 times) |
|
|
@end example |
@end example |
|
|
The following example will remove that watchpoint: |
The following example will remove that watchpoint: |
|
|
@example |
@example |
DEFAULT.USER> WATCH -^JPW(1) |
DEFAULT.USER> WATCH -^SNW(1) |
|
|
Removed '^JPW("1")' from the watchlist. |
Removed '^SNW("1")' from the watchlist. |
|
|
DEFAULT.USER> WATCH ?^JPW(1) |
DEFAULT.USER> WATCH ?^SNW(1) |
|
|
'^JPW("1")' is not being watched. |
'^SNW("1")' is not being watched. |
@end example |
@end example |
|
|
@node WITH |
@node WITH |
Line 4166 Forces a number to positive, whether pos
|
Line 4172 Forces a number to positive, whether pos
|
@section Unary - |
@section Unary - |
@cindex operators, unary - |
@cindex operators, unary - |
|
|
|
Forces a number to negative, whether positive or negative. Also forces numeric coercion of strings. |
|
|
@node + |
@node + |
@section + (Add) |
@section + (Add) |
@cindex operators, + |
@cindex operators, + |
|
|
|
@emph{Syntax} |
|
|
|
@example |
|
S X=1+2 ; => 3 |
|
@end example |
|
|
|
Adds numbers together. |
|
|
@node += |
@node += |
@section += (Add/Assign) |
@section += (Add/Assign) |
@cindex operators, += |
@cindex operators, += |
|
|
|
@emph{Syntax} |
|
|
|
@example |
|
S X=5 |
|
S X+=3 ; => 8 |
|
@end example |
|
|
|
Increments the variable on the LHS by the value on the RHS. |
|
|
@node ++ |
@node ++ |
@section ++ (Postfix Increment) |
@section ++ (Postfix Increment) |
@cindex operators, ++ |
@cindex operators, ++ |
|
|
|
Increments a variable by 1. |
|
|
@node - |
@node - |
@section - (Subtract) |
@section - (Subtract) |
@cindex operators, - |
@cindex operators, - |
|
|
|
Subtracts one number from another. |
|
|
@node -= |
@node -= |
@section -= (Subtract/Assign) |
@section -= (Subtract/Assign) |
@cindex operators, -= |
@cindex operators, -= |
|
|
|
@emph{Syntax} |
|
|
|
@example |
|
S X=5 |
|
S X-=3 ; => 2 |
|
@end example |
|
|
|
Decrements the variable on the LHS by the value on the RHS. |
|
|
@node -- |
@node -- |
@section -- (Postfix Decrement) |
@section -- (Postfix Decrement) |
@cindex operators, -- |
@cindex operators, -- |
|
|
|
Decrements the variable by one. |
|
|
@node * |
@node * |
@section * (Multiply) |
@section * (Multiply) |
@cindex operators, * |
@cindex operators, * |
|
|
|
Multiplies one number by another. |
|
|
@node *= |
@node *= |
@section *= (Multiply/Assign) |
@section *= (Multiply/Assign) |
@cindex operators, *= |
@cindex operators, *= |
|
|
|
|
|
|
@node / |
@node / |
@section / (Divide) |
@section / (Divide) |
@cindex operators, / |
@cindex operators, / |
Line 4606 TL1:DEFAULT.USER> trantab
|
Line 4650 TL1:DEFAULT.USER> trantab
|
------- ------ -------- |
------- ------ -------- |
1 SET ^FOO=3 |
1 SET ^FOO=3 |
2 KILL ^FOO |
2 KILL ^FOO |
3 SET ^jpw=10 |
3 SET ^snw=10 |
4 SET ^BRANDNEW=6 |
4 SET ^BRANDNEW=6 |
|
|
Global checkpoints: |
Global checkpoints: |
Line 4614 TL1:DEFAULT.USER> trantab
|
Line 4658 TL1:DEFAULT.USER> trantab
|
GLOBAL MODE FILES |
GLOBAL MODE FILES |
------ ---- ----- |
------ ---- ----- |
^BRANDNEW CP_REMOVE IN: /usr/local/var/freem/USER/globals/^BRANDNEW |
^BRANDNEW CP_REMOVE IN: /usr/local/var/freem/USER/globals/^BRANDNEW |
^jpw CP_RESTORE IN: /usr/local/var/freem/USER/globals/^jpw |
^snw CP_RESTORE IN: /usr/local/var/freem/USER/globals/^snw |
OUT: /usr/local/var/freem/USER/globals/^jpw.23390.1.chk |
OUT: /usr/local/var/freem/USER/globals/^snw.23390.1.chk |
^FOO CP_RESTORE IN: /usr/local/var/freem/USER/globals/^FOO |
^FOO CP_RESTORE IN: /usr/local/var/freem/USER/globals/^FOO |
OUT: /usr/local/var/freem/USER/globals/^FOO.23390.1.chk |
OUT: /usr/local/var/freem/USER/globals/^FOO.23390.1.chk |
@end verbatim |
@end verbatim |
Line 4834 You can also set up a trigger that appli
|
Line 4878 You can also set up a trigger that appli
|
|
|
This routine is the implementation of the @code{$ZCOLUMNS} intrinsic special variable. |
This routine is the implementation of the @code{$ZCOLUMNS} intrinsic special variable. |
|
|
@section ^%SYSINIT |
@section %SYSINIT |
@cindex ^%SYSINIT |
@cindex %SYSINIT |
@cindex system library routines, ^%SYSINIT |
@cindex system library routines, %SYSINIT |
|
|
This routine is the default startup routine for FreeM running in direct mode. |
This routine is the default startup routine for FreeM running in direct mode. |
|
|
Line 6059 Module headers should adhere to the foll
|
Line 6103 Module headers should adhere to the foll
|
* binding library |
* binding library |
* |
* |
* |
* |
* Author: Serena Willis <jpw@coherent-logic.com> |
* Author: Serena Willis <snw@coherent-logic.com> |
* Copyright (C) 1998 MUG Deutschland |
* Copyright (C) 1998 MUG Deutschland |
* Copyright (C) <Year> Coherent Logic Development LLC |
* Copyright (C) <Year> Coherent Logic Development LLC |
* |
* |