For information on changes to the library (adv3), refer to the Recent Library Changes list.
This is the TADS 3.0 General Release version.
x: object
m(p) { }
n = (p) // bad code generated here
p = nil
;
The bad code resulted from the compiler mistakenly using the local symbol table from the method m(p) while generating the code for n; so the compiler incorrectly treated p as a parameter variable in n, even though n has no parameters. This has been corrected.
The local-to-Unicode character set mapper now converts any unmappable character found in a source string to Unicode U+FFFD, the standard Unicode "replacement character." In the past, the mapper converted unmappable characters to question marks, "?". Converting to question marks was undesirable because of the ambiguity it created. When compiling source code, for example, it led the compiler to think that the source file literally contained a question mark where the unmappable character was found; the diagnostics the compiler reported in these cases were thus confusing and misleading. Unicode defines the character U+FFFD specifically for the purpose of replacing source characters that cannot be mapped to Unicode; this gives the compiler and other consumers of mapped characters an unambiguous indication that the original input character was unmappable. The compiler uses this new information to report a specific diagnostic message when it finds a U+FFFD in the input stream.
There are no changes to the compiler or interpreter core in this release. The only changes in the adv3 library and the Windows HTML TADS interpreter.
There are no changes to the compiler or interpreter core in this release. The only changes are in the adv3 library and the Windows HTML TADS interpreter.
testObj: object
prop1 = [ {: say(prop2) } ]
prop2 = 'hello!'
;
Note: 3.0.6l was a library-only release, so there was no system release called 3.0.6l.
export propNotDefined;
class A: object
propNotDefined(prop, [args]) { "This is A.propNotDefined\n"; }
;
class B: A
propNotDefined(prop, [args]) { "This is B.propNotDefined\n"; }
p1() { inherited(); }
;
main(args)
{
local x = new B();
x.p1();
}
When this program is run, the result displayed will be "This is A.propNotDefined". B.p1() attempts to inherit the base class definition of p1(); when it doesn't find an inherited definition, it searches for propNotDefined() using the same search pattern it used to find the inherited p1(). That is, the search starts with B's superclass, because that's where the search for the inherited p1() started from.