version 1.42, 2025/05/05 04:46:35
|
version 1.46, 2025/05/05 12:51:46
|
Line 4
|
Line 4
|
@settitle The FreeM Manual |
@settitle The FreeM Manual |
|
|
@copying |
@copying |
This manual is for FreeM, (version 0.64.0-rc1), which is a free software@footnote{FreeM subscribes to the software licensing philosophy described in @emph{Free Software, Free Society: |
This manual is for FreeM, (version 0.64.0-rc1), which is a free software implementation of the M programming language. |
Selected Essays of Richard M. Stallman}.} implementation of the M programming language. |
|
|
|
Print-optimized versions of this book are typeset in @emph{Computer Modern} by the author using the @emph{GNU Texinfo} tools. |
Print-optimized versions of this book are typeset in @emph{Computer Modern} by the author using the @emph{GNU Texinfo} tools. |
|
|
Line 2012 Identical to @ref{$TRANSLATE()}, except
|
Line 2011 Identical to @ref{$TRANSLATE()}, except
|
* !:: Run an external program or command. |
* !:: Run an external program or command. |
* !!:: Launch a subshell from FreeM direct mode. |
* !!:: Launch a subshell from FreeM direct mode. |
* ABLOCK:: Increment the block counter for one or more event classes. |
* ABLOCK:: Increment the block counter for one or more event classes. |
* ASSERT:: Raise error when a conditional expression evaluates @emph{false}. |
|
* ASTART:: Enable asynchronous event handling for one or more event classes. |
* ASTART:: Enable asynchronous event handling for one or more event classes. |
* ASTOP:: Disable asynchronous event handling for one or more event classes. |
* ASTOP:: Disable asynchronous event handling for one or more event classes. |
* AUNBLOCK:: Decrement the block counter for one or more event classes. |
* AUNBLOCK:: Decrement the block counter for one or more event classes. |
Line 2044 Identical to @ref{$TRANSLATE()}, except
|
Line 2042 Identical to @ref{$TRANSLATE()}, except
|
* VIEW:: Modify FreeM internal parameters. |
* VIEW:: Modify FreeM internal parameters. |
* WRITE:: Write output to current input/output device. |
* WRITE:: Write output to current input/output device. |
* XECUTE:: Interpret string as M code. |
* XECUTE:: Interpret string as M code. |
|
* ZASSERT:: Raise error when a conditional expression evaluates @emph{false}. |
* ZBREAK:: Unknown. |
* ZBREAK:: Unknown. |
* ZCONST:: Define a constant that cannot be altered after initial definition. |
* ZCONST:: Define a constant that cannot be altered after initial definition. |
* ZGO:: Unknown. |
* ZGO:: Unknown. |
Line 2183 In its inclusive form, @code{ABLOCK} inc
|
Line 2182 In its inclusive form, @code{ABLOCK} inc
|
|
|
In its exclusive form, @code{ABLOCK} increments the block counters for all event classes @emph{except for} those named in the list, provided the optional @emph{postcondition} is either @emph{true} or omitted. |
In its exclusive form, @code{ABLOCK} increments the block counters for all event classes @emph{except for} those named in the list, provided the optional @emph{postcondition} is either @emph{true} or omitted. |
|
|
@node ASSERT |
|
@section ASSERT |
|
@cindex ASSERT |
|
@cindex commands, ASSERT |
|
@cindex commands, debugging |
|
@cindex commands, implementation-specific |
|
@cindex commands, non-standard |
|
@emph{FreeM Extension} |
|
|
|
Triggers error @code{ASSERT} if the supplied truth-valued expression @emph{tvexpr} is @emph{false} (@emph{1} is @emph{true}, and @emph{0} is @emph{false}), and that the optional @emph{postcondition} evaluates to @emph{true} or is omitted. |
|
|
|
The @code{ASSERT} error is catchable whether using standard-style, FreeM-style, or DSM 2.0-style error processing. |
|
|
|
@emph{Syntax} |
|
|
|
@example |
|
ASSERT@emph{:postcondition} @emph{<tvexpr>} |
|
@end example |
|
|
|
@emph{Example} |
|
|
|
@example |
|
DEFAULT.USER> SET DEBUG=1 |
|
|
|
|
|
DEFAULT.USER> ASSERT:DEBUG 1=1 |
|
|
|
|
|
DEFAULT.USER> ASSERT:DEBUG 1=0 |
|
|
|
|
|
>> Error ZASSERT: programmer assertion failed in SYSTEM::^%SYSINIT [$STACK = 0] |
|
>> ASSERT:DEBUG 1=0 |
|
^ |
|
@end example |
|
|
|
@node ASTART |
@node ASTART |
@section ASTART |
@section ASTART |
Line 3354 VIEW 133:@emph{tvexpr}
|
Line 3318 VIEW 133:@emph{tvexpr}
|
@cindex XECUTE |
@cindex XECUTE |
@cindex commands, XECUTE |
@cindex commands, XECUTE |
|
|
|
@node ZASSERT |
|
@section ZASSERT |
|
@cindex ZASSERT |
|
@cindex commands, ZASSERT |
|
@cindex commands, debugging |
|
@cindex commands, implementation-specific |
|
@cindex commands, non-standard |
|
@emph{FreeM Extension} |
|
|
|
Triggers error @code{ZASSERT} if the supplied truth-valued expression @emph{tvexpr} is @emph{false} (@emph{1} is @emph{true}, and @emph{0} is @emph{false}), and that the optional @emph{postcondition} evaluates to @emph{true} or is omitted. |
|
|
|
The @code{ZASSERT} error is catchable whether using standard-style, FreeM-style, or DSM 2.0-style error processing. |
|
|
|
@emph{Syntax} |
|
|
|
@example |
|
ZASSERT@emph{:postcondition} @emph{<tvexpr>} |
|
@end example |
|
|
|
@emph{Example} |
|
|
|
@example |
|
DEFAULT.USER> SET DEBUG=1 |
|
|
|
|
|
DEFAULT.USER> ZASSERT:DEBUG 1=1 |
|
|
|
|
|
DEFAULT.USER> ZASSERT:DEBUG 1=0 |
|
|
|
|
|
>> Error ZASSERT: programmer assertion failed in SYSTEM::^%SYSINIT [$STACK = 0] |
|
>> ZASSERT:DEBUG 1=0 |
|
^ |
|
@end example |
|
|
@node ZBREAK |
@node ZBREAK |
@section ZBREAK |
@section ZBREAK |
@cindex ZBREAK |
@cindex ZBREAK |
Line 4590 SET MYSTRING="This is a ""string literal
|
Line 4590 SET MYSTRING="This is a ""string literal
|
@cindex types, custom |
@cindex types, custom |
@cindex classes |
@cindex classes |
|
|
See @ref{Classes}. |
See @ref{Object-Oriented Programming}. |
|
|
@node Globals |
@node Globals |
@chapter Globals |
@chapter Globals |
Line 4946 If you use other M implementations, you
|
Line 4946 If you use other M implementations, you
|
@cindex programming, object-oriented |
@cindex programming, object-oriented |
|
|
@menu |
@menu |
* Classes:: The basis of object-oriented programming. |
* Classes:: The organizing concept of object-oriented programming. |
* Inheritance:: Basing one class upon another. |
* Inheritance:: Making one class derive from another. |
* Methods:: Attaching code to a class. |
* Methods:: Attach code to classes. |
* Public and Private Variables:: Managing class member access. |
* Public and Private Variables:: Determining accessibility. |
* Instantiating Objects:: Creating instances of classes. |
* Instantiating Objects:: Creating instances of classes. |
* Determining Object Class:: Getting object information at runtime. |
|
@end menu |
@end menu |
|
|
@node Classes |
@node Classes |
@section Classes |
@section Classes |
|
|
|
|
@node Class Overview |
|
@subsection Class Overview |
@subsection Class Overview |
|
|
A @emph{class} is the primary organizing concept of FreeM support for object-oriented programming, and in FreeM, is simply an M routine with a few special properties: |
A @emph{class} is the primary organizing concept of FreeM support for object-oriented programming, and in FreeM, is simply an M routine with a few special properties: |
Line 4976 DESTROY(THIS) ; This is the destructor
|
Line 4972 DESTROY(THIS) ; This is the destructor
|
|
|
The above example demonstrates general class syntax. |
The above example demonstrates general class syntax. |
|
|
@node Constructors |
|
@subsection Constructors |
@subsection Constructors |
|
|
A @emph{constructor} is an M entry point that is called when a new instance of a class is created. |
A @emph{constructor} is an M entry point that is called when a new instance of a class is created. |
Line 5001 A constructor looks like this:
|
Line 4996 A constructor looks like this:
|
|
|
In the above example, @emph{<superclass>} represents the name of a class from which this class should inherit. In this case, the @code{FRACTION} class inherits from the @code{OBJECT} class. Note that this is not strictly necessary in this case, as all classes in FreeM automatically inherit from @code{OBJECT}. |
In the above example, @emph{<superclass>} represents the name of a class from which this class should inherit. In this case, the @code{FRACTION} class inherits from the @code{OBJECT} class. Note that this is not strictly necessary in this case, as all classes in FreeM automatically inherit from @code{OBJECT}. |
|
|
@node Destructors |
|
@subsection Destructors |
@subsection Destructors |
A @code{destructor} is called when you @code{KILL} an instance variable. Its tag must be @code{DESTROY}, and it must take one argument (@code{THIS}). |
A @code{destructor} is called when you @code{KILL} an instance variable. Its tag must be @code{DESTROY}, and it must take one argument (@code{THIS}). |
|
|
Line 5028 Inheritance is achieved by specifying th
|
Line 5022 Inheritance is achieved by specifying th
|
CLASS(THIS,INIT):SUPERCLASS |
CLASS(THIS,INIT):SUPERCLASS |
@end example |
@end example |
|
|
@node Runtime Polymorphism |
|
@subsection Runtime Polymorphism |
@subsection Runtime Polymorphism |
|
|
You can achieve runtime polymorphism by subclassing, and defining methods in the subclass that match the names of existing methods in the superclass. Following FreeM inheritance rules, the overridden method in the subclass will be called, and the method in the superclass will not. |
You can achieve runtime polymorphism by subclassing, and defining methods in the subclass that match the names of existing methods in the superclass. Following FreeM inheritance rules, the overridden method in the subclass will be called, and the method in the superclass will not. |
Line 5058 DEFAULT.USER> W MYOBJ.MYMETHOD()
|
Line 5051 DEFAULT.USER> W MYOBJ.MYMETHOD()
|
VALUE |
VALUE |
@end example |
@end example |
|
|
@node Public and Private Variables |
@node Public and Private Variables |
@section Public and Private Variables |
@section Public and Private Variables |
|
|
FreeM supports private fields with the @code{:PRIVATE} specifier in the @code{SET} command, enforcing classical object-oriented data encapsulation. The @code{:PUBLIC} specifier is provided for completeness, and is the default. |
FreeM supports private fields with the @code{:PRIVATE} specifier in the @code{SET} command, enforcing classical object-oriented data encapsulation. The @code{:PUBLIC} specifier is provided for completeness, and is the default. |
Line 5092 NEW MYSTR=$#^%STRING("myString")
|
Line 5085 NEW MYSTR=$#^%STRING("myString")
|
|
|
This will create a local variable called MYSTR of type STRING, and initialize it with the value myString. |
This will create a local variable called MYSTR of type STRING, and initialize it with the value myString. |
|
|
@node Determining Object Class |
@subsection Determining Object Class |
@section Determining Object Class |
|
|
|
To determine the class of any FreeM local variable, you will use the @code{$$TYPE()} method: |
To determine the class of any FreeM local variable, you will use the @code{$$TYPE()} method: |
|
|
Line 5690 Raised when you attempt to use multiple
|
Line 5682 Raised when you attempt to use multiple
|
Raised when attempts are made to set @code{$ECODE} to an invalid error code value. Obsolete and replaced by standard error code @code{M101}. |
Raised when attempts are made to set @code{$ECODE} to an invalid error code value. Obsolete and replaced by standard error code @code{M101}. |
|
|
@item @code{ZASSERT} - @emph{programmer assertion failed} |
@item @code{ZASSERT} - @emph{programmer assertion failed} |
Raised when an @code{ASSERT} expression's result is not true. |
Raised when an @code{ZASSERT} expression's result is not true. |
|
|
@item @code{ZUSERERR} - @emph{user-defined error} |
@item @code{ZUSERERR} - @emph{user-defined error} |
Raised when program code calls @code{THROW} with an error code argument for which the first character is @code{U}, or when @code{$ECODE} is set to an error code for which the first character is @code{U}. |
Raised when program code calls @code{THROW} with an error code argument for which the first character is @code{U}, or when @code{$ECODE} is set to an error code for which the first character is @code{U}. |