XSharp
XSharp
Bandol GA (2.0.6.0)
Table of Contents
         Foreword                                                                                                                                                                       0
 Part I X# Documentation                                                                                                                                                               8
     1 Getting
         ...................................................................................................................................
                  Started with X#                                                                                                            10
                Version History ...........................................................................................................................................10
                Dialects                ...........................................................................................................................................77
                Bring Your Ow n Runtim  ...........................................................................................................................................80
                                                  e (BYOR)
                Know n Issues           ...........................................................................................................................................81
                Installation            ...........................................................................................................................................81
                New language features   ...........................................................................................................................................83
                     Anonymous Methods...................................................................................................................................86
                     Anonymous Types ...................................................................................................................................87
                     ASTYPE                     ...................................................................................................................................89
                     ASYNC - AWAIT              ...................................................................................................................................89
                     BEGIN CHECKED              ...................................................................................................................................90
                     BEGIN FIXED                ...................................................................................................................................91
                     BEGIN UNCHECKED ...................................................................................................................................91
                     BEGIN UNSAFE               ...................................................................................................................................92
                     BEGIN USING                ...................................................................................................................................92
                     Collection Initializers ...................................................................................................................................93
                     Conditional Access Expression
                                                ...................................................................................................................................94
                     Creating Generic Classes   ...................................................................................................................................95
                     DEFAULT Expressions        ...................................................................................................................................96
                     EVENT (Add and Remove)     ...................................................................................................................................97
                     Expression IS Type...................................................................................................................................100
                     Initializers             ...................................................................................................................................101
                     Interpolated Strings ...................................................................................................................................102
                     LINQ Query Expressions   ...................................................................................................................................103
                     NOP                      ...................................................................................................................................105
                     Object Initializers ...................................................................................................................................105
                     SWITCH                   ...................................................................................................................................106
                     USING                    ...................................................................................................................................107
                     VAR                      ...................................................................................................................................108
                     YIELD                    ...................................................................................................................................108
                     XBase++ class declarations
                                              ...................................................................................................................................109
                Licensing             ...........................................................................................................................................111
                     XSharp Open Softw...................................................................................................................................113
                                                are License
                     Apache 2                 ...................................................................................................................................117
                     BSD                      ...................................................................................................................................121
                     XSharp Compiler Sourcecode
                                              ...................................................................................................................................122
                                                               License
                Acknow ledgem ents    ...........................................................................................................................................127
                Who is w ho in the...........................................................................................................................................128
                                         X# team
     2 Migrating
        ...................................................................................................................................
                      apps from VO to X#                                                                                                    129
                Exam ple       1: The VO...........................................................................................................................................129
                                            Explorer Exam ple
                Exam ple       2: The VOPAD
                                        ...........................................................................................................................................136
                                                   Exam ple
                Exam ple       3: The Pizza
                                        ...........................................................................................................................................139
                                                Exam ple
                Exam ple       4: Ole Autom
                                        ...........................................................................................................................................140
                                                 ation - Excel
                Exam ple       5: OCX - ...........................................................................................................................................145
                                        The Em ail Client Exam ple
     3 The
        ...................................................................................................................................
             X# Runtime                                                                                                                     150
                XSharp.Core                  ...........................................................................................................................................154
                XSharp.RT                    ...........................................................................................................................................154
                XSharp.VO                    ...........................................................................................................................................155
                XSharp.XPP                   ...........................................................................................................................................155
                       XSharp.VFP         ...........................................................................................................................................155
                       XSharp.Macrocom    ...........................................................................................................................................156
                                            piler
                       XSharp.Macrocom    ...........................................................................................................................................156
                                            piler.Full.DLL
                       XSharp.RDD         ...........................................................................................................................................157
                       Installation in the...........................................................................................................................................158
                                           GAC
                       XBase Types        ...........................................................................................................................................158
                            Array Of Type         ...................................................................................................................................159
                            Array Type            ...................................................................................................................................161
                            CodeBlock             ...................................................................................................................................161
                            Date Type             ...................................................................................................................................161
                            Float Type            ...................................................................................................................................161
                            Logic Ttype           ...................................................................................................................................161
                            PSZ Type              ...................................................................................................................................162
                            Symbol Type           ...................................................................................................................................162
                            Usual Type            ...................................................................................................................................162
            4 X#
               ...................................................................................................................................
                  Scripting                                                                                                                        163
            5 Using
               ...................................................................................................................................
                       X# in Visual Studio                                                                                                         168
                       Project System ...........................................................................................................................................168
                           Source code Items ...................................................................................................................................168
                           Forms                   ...................................................................................................................................168
                           Other Item types ...................................................................................................................................168
                           Project Properties ...................................................................................................................................168
                           Resources               ...................................................................................................................................168
                           Settings                ...................................................................................................................................168
                       Source Code Editor  ...........................................................................................................................................168
                           Keyw ord Coloring ...................................................................................................................................169
                           Highlighting Errors ...................................................................................................................................169
                           Regions                 ...................................................................................................................................169
                           Blocks                  ...................................................................................................................................169
                           Parameter Tips          ...................................................................................................................................169
                           Quick Info              ...................................................................................................................................169
                           Code Completion ...................................................................................................................................169
                       Tem plates          ...........................................................................................................................................169
                           Project Templates ...................................................................................................................................169
                           Item Templates          ...................................................................................................................................171
                       Debugger            ...........................................................................................................................................173
            6 X#
               ...................................................................................................................................
                  Programming guide                                                                                                                173
                       Quick Start      ...........................................................................................................................................173
                       Arrays           ...........................................................................................................................................173
                       Classes and Structures
                                        ...........................................................................................................................................173
                       Codeblock, Lam bda
                                        ...........................................................................................................................................173
                                              and Anonym ous Method Expressions
                       Delegates        ...........................................................................................................................................175
                       Enum eration Types
                                        ...........................................................................................................................................175
                       Events           ...........................................................................................................................................175
                       Exceptions and Exception
                                        ...........................................................................................................................................176
                                                        Handling
                       File System and the
                                        ...........................................................................................................................................176
                                              Registry
                       Generics         ...........................................................................................................................................176
                       Indexers         ...........................................................................................................................................176
                       Interfaces       ...........................................................................................................................................176
                       Interoperability ...........................................................................................................................................176
                       LINQ Query Expressions
                                        ...........................................................................................................................................176
                       Mem ory Variables...........................................................................................................................................176
                       Nam espaces      ...........................................................................................................................................180
                       Nullable Types ...........................................................................................................................................180
                       Statem ents, Expressions
                                        ...........................................................................................................................................180
                                                        and Operators
                       Strings          ...........................................................................................................................................180
                       Types            ...........................................................................................................................................180
                              Using                  ......................................................................................................................219
                              Define                 ......................................................................................................................219
                              _DLL                   ......................................................................................................................220
                         Parameters and others   ..........................................................................................................................220
                              Parameters             ......................................................................................................................220
                              Attributes             ......................................................................................................................221
                              Modifiers              ......................................................................................................................221
                              Arguments              ......................................................................................................................222
                              Array Indices          ......................................................................................................................223
                         Statements              ..........................................................................................................................223
                              ?, ??                  ......................................................................................................................226
                              ASYNC .. AWAIT ......................................................................................................................226
                              BEGIN (UN)CHECKED      ......................................................................................................................226
                              BEGIN FIXED            ......................................................................................................................226
                              BEGIN LOCK             ......................................................................................................................226
                              BEGIN SCOPE            ......................................................................................................................227
                              BEGIN SEQUENCE ......................................................................................................................227
                              BEGIN UNSAFE ......................................................................................................................227
                              BEGIN USING            ......................................................................................................................227
                              BREAK                  ......................................................................................................................227
                              DO CASE                ......................................................................................................................227
                              DO WHILE               ......................................................................................................................229
                              EXIT                   ......................................................................................................................229
                              Expression Statement   ......................................................................................................................229
                              FIELD                  ......................................................................................................................229
                              FOR ... NEXT           ......................................................................................................................230
                              FOREACH ... NEXT......................................................................................................................230
                              IF ... ELSE ... ENDIF......................................................................................................................231
                              LOCAL                  ......................................................................................................................231
                              LOOP                   ......................................................................................................................235
                              MEMVAR                 ......................................................................................................................235
                              NOP                    ......................................................................................................................236
                              PARAMETERS             ......................................................................................................................236
                              PRIVATE                ......................................................................................................................237
                              PUBLIC                 ......................................................................................................................239
                              REPEAT ... UNTIL ......................................................................................................................241
                              RETURN                 ......................................................................................................................241
                              Statement Block ......................................................................................................................242
                              SWITCH                 ......................................................................................................................242
                              THROW                  ......................................................................................................................242
                              TRY ... CATCH ... ......................................................................................................................242
                                                     FINALLY
                              YIELD EXIT             ......................................................................................................................242
                              YIELD RETURN           ......................................................................................................................243
                              STATIC                 ......................................................................................................................243
                         Literals                ..........................................................................................................................243
                              Char Literals          ......................................................................................................................244
                              String Literals        ......................................................................................................................245
                              Date Literals          ......................................................................................................................246
                              Logic Literals         ......................................................................................................................246
                              Null Literals          ......................................................................................................................246
                              Numeric Literals ......................................................................................................................247
                              Integer Literals       ......................................................................................................................248
                              Floating point Literals......................................................................................................................248
                              Symbol Literals        ......................................................................................................................248
                         NameSpaces              ..........................................................................................................................249
                              USING                  ......................................................................................................................249
                              BEGIN NAMESPACE        ......................................................................................................................249
                         Identifiers             ..........................................................................................................................249
                         -fovf               ..........................................................................................................................314
                         -fullpaths          ..........................................................................................................................314
                         -help, /?           ..........................................................................................................................314
                         -highentropyva      ..........................................................................................................................315
                         -i                  ..........................................................................................................................315
                         -ins                ..........................................................................................................................316
                         -keycontainer       ..........................................................................................................................317
                         -keyfile            ..........................................................................................................................318
                         -langversion        ..........................................................................................................................319
                         -lb                 ..........................................................................................................................319
                         -lib                ..........................................................................................................................321
                         -link               ..........................................................................................................................322
                         -linkresource       ..........................................................................................................................324
                         -main               ..........................................................................................................................326
                         -memvar             ..........................................................................................................................326
                         -moduleassemblyname ..........................................................................................................................327
                         -modulename:<string>..........................................................................................................................329
                         -namedargs          ..........................................................................................................................329
                         -noconfig           ..........................................................................................................................330
                         -nologo             ..........................................................................................................................330
                         -nostddefs          ..........................................................................................................................331
                         -nostdlib           ..........................................................................................................................331
                         -now arn            ..........................................................................................................................332
                         -now in32manifest ..........................................................................................................................332
                         -ns                 ..........................................................................................................................333
                         -optimize           ..........................................................................................................................335
                         -out                ..........................................................................................................................336
                         -ovf                ..........................................................................................................................337
                         -parallel           ..........................................................................................................................337
                         -pathmap            ..........................................................................................................................337
                         -pdb                ..........................................................................................................................338
                         -platform           ..........................................................................................................................338
                         -ppo                ..........................................................................................................................340
                         -preferreduilang    ..........................................................................................................................340
                         -recurse            ..........................................................................................................................341
                         -reference          ..........................................................................................................................342
                         -refonly            ..........................................................................................................................344
                         -refout             ..........................................................................................................................345
                         -resource           ..........................................................................................................................346
                         -ruleset            ..........................................................................................................................347
                         -s                  ..........................................................................................................................347
                         -show defs          ..........................................................................................................................348
                         -show includes      ..........................................................................................................................348
                         -snk                ..........................................................................................................................349
                         -stddefs            ..........................................................................................................................349
                         -subsystemversion ..........................................................................................................................349
                         -target             ..........................................................................................................................351
                         -touchedfiles       ..........................................................................................................................352
                         -undeclared         ..........................................................................................................................352
                         -unsafe             ..........................................................................................................................353
                         -utf8output         ..........................................................................................................................354
                         -vo1                ..........................................................................................................................354
                         -vo10               ..........................................................................................................................355
                         -vo11               ..........................................................................................................................356
                         -vo12               ..........................................................................................................................356
                         -vo13               ..........................................................................................................................357
                         -vo14               ..........................................................................................................................359
                         -vo15               ..........................................................................................................................360
                      -vo16                       ..........................................................................................................................361
                      -vo2                        ..........................................................................................................................362
                      -vo3                        ..........................................................................................................................363
                      -vo4                        ..........................................................................................................................364
                      -vo5                        ..........................................................................................................................366
                      -vo6                        ..........................................................................................................................367
                      -vo7                        ..........................................................................................................................369
                      -vo8                        ..........................................................................................................................371
                      -vo9                        ..........................................................................................................................373
                      -w                          ..........................................................................................................................374
                      -w arn                      ..........................................................................................................................374
                      -w arnaserror               ..........................................................................................................................375
                      -w in32icon                 ..........................................................................................................................376
                      -w in32manifest             ..........................................................................................................................377
                      -w in32res                  ..........................................................................................................................378
                      -w x                        ..........................................................................................................................379
                      -xpp1                       ..........................................................................................................................379
               X# Com piler Errors
                                 ...........................................................................................................................................380
                                      and Warnings
    8 X#
       ...................................................................................................................................
          Examples                                                                                                                         380
               Anonym ous Method...........................................................................................................................................380
                                       Expressions
               Anonym ous Types ...........................................................................................................................................380
               ASYNC Exam ple ...........................................................................................................................................382
               BEGIN UNSAFE Exam...........................................................................................................................................383
                                     ple
               BEGIN USING Exam...........................................................................................................................................384
                                  ple
               CHECKED Exam ple...........................................................................................................................................384
               EVENT Exam ple ...........................................................................................................................................385
               Expression Exam...........................................................................................................................................387
                                ples
               FIXED Exam ple ...........................................................................................................................................388
               GENERICs Exam ple...........................................................................................................................................388
               Lam da Expressions
                                ...........................................................................................................................................390
               LINQ Exam ple    ...........................................................................................................................................390
               NOP Exam ple     ...........................................................................................................................................392
               SWITCH Exam ple ...........................................................................................................................................392
               Typed Enum s     ...........................................................................................................................................393
               USING Exam ple ...........................................................................................................................................393
               VAR Exam ple     ...........................................................................................................................................394
               Vulcan Runtim e (BYOR)
                                ...........................................................................................................................................395
               YIELD Exam ple ...........................................................................................................................................398
Index 400
       I
    9     XSharp Bandol
1 X# Documentation
        This documentation is still under development. Some sections in the documentation are
        incomplete.
          General
          ·                   We received a request to keep the version numbering simpler. For that
                              reason this new build is called Bandol 2.06 and the file versions for this
                              build are also 2.06. The assembly versions for the runtime assemblies
                              are all 2.0, and we intend to keep those stable as long as possible, so
                              you will not be forced to recompile code that depends on the runtime
                              assemblies.
          ·                   Several fixes that were meant to be included in 2.0.5.0 were not
                              included in that build. This has been corrected in 2.0 6.0
          Compiler
          ·                   A missing ENDTEXT keyword now produces an error XS9086
          ·                   Unbalanced textmerge delimiters produce a warning XS9085
          ·                   The TEXT keyword in the FoxPro dialect is now only recognized when
                              it is the first non whitespace token on a line. As a result of this you can
                              use tokens like <text> in Preprocessor commands again.
          ·                   The VO cast operations on literal strings no longer produce a compiler
                              warning about possible memory leaks.
          Runtime
          ·                   Runtime errors in late bound code were always shown as
                              TargetInvocationException. The true cause of the error was hidden
                              that way. We are now unpacking the error and rethrowing the original
                              error, including the callstack that was leading to that error
          ·                   Some texts in the string resources were updated
          ·                   Calling the Str() function with a -1 value for length and/or decimals
                              produced results that were not compatible with VO. This was fixed.
          ·                   Fixed a problem with DbZap() and files with a DBT memo.
          ·                   In some situations EOF and BOF were not set to TRUE when opening
                              an empty DBF file. This has been fixed.
     RDD System
     ·                   The code to read and write to columns in an Advantage workarea now
                         uses separate column objects, just like the code for the DBF RDD.
                         This makes the code a bit easier to understand and should make the
                         code a bit faster.
     VS Integration
     ·                   The text block between TEXT and ENDTEXT is now displayed in the
                         same color as literal strings
     ·                   The VO compatible Project Item templates no longer automatically add
                         references to your project
     ·                   Project files from version 2.01.0 and later will no longer be "touched"
                         when opening with this version of the X# project system, since there
                         have been no changes to the project file format since that build.
     VOXporter
     ·                   The CATCH block in the generated Start function now calls
                         ErrorDialog() to show the errors. This uses the new language
                         resources to display the full error with VO compatible error information
                         (Gencode, Subcode etc)
     Compiler
     ·                   Blank lines after an END PROPERTY could confuse the compiler.
                         This has been fixed
     ·                   The TEXT .. ENDTEXT command has been implemented in the
                         compiler (FoxPro dialect only)
     ·                   The \ and \\ commands have been implemented (FoxPro dialect only)
     ·                   Procedures in the FoxPro dialect may now return values. Also the /vo9
                         options is now enabled by default in the FoxPro dialect. The default
                         return value for a FUNCTION and PROCEDURE is now TRUE in the
                         foxpro dialect and NIL in the other dialects.
     ·                   Error messages no longer refer to Xbase types by their internal names
                         (XSharp.__Usual) but by their normal name (USUAL).
     MacroCompiler
     ·                   Creating classes with a namespace prefix was not working. This has
                         been fixed.
     Runtime
     ·                   Fixed a problem with ArrayNew() and multiple dimensions
     ·                   When calling constructor of the Array class with a number the
                         elements were already initialized. This was not compatible with
          RDDs
          ·              Zap and Pack operations were not properly setting the DBF file size
          ·              An Append() in shared mode was not properly setting the RecCount
          ·              Opening a file with one of the Advantage SQL RDDs was not working.
                         This has been fixed.
          ·              Writing DateTime.Minvalue to a DBF would not write an empty date but
                         the date 1.1.1 This has been fixed.
          VO SDK
          ·              Fixed a problem in ListView:EnsureVisible().
          ·              Some questionable casts (such as the one that cause the previous
                         problem) have been cleaned up
          Compiler
          ·              Fix a problem in assignment expressions where the Left side is an
                         aliased expression with a workarea in parentheses:
                         (nArea)->LastName := AnotherArea->LastName
          ·              Multiline statements, such as FOR blocks, no longer generate Multiline
                         breakpoints in the debugger.
          ·              Fixed a problem where blank lines or lines with 'inactive' preprocessor
                         comments after a class definition would generate a compiler error.
          ·              Errors for implicit conversions between INT/DWORD and PTR now
                         produce a better error message when they are not supported.
     MacroCompiler
     ·                   Fixed a problem with some aliased expressions
     ·                   The macro compiler now detects that you are overriding a built-in
                         function in your own code and will no longer throw an "ambigous
                         method" exception but will choose function from your code over
                         functions defined in the X# runtime
     Runtime
     ·                   FIxed several problems in the Directory() function
     ·                   Fixed problem with indexing PSZ values
     ·                   Added StackTrace property on the Error object so also errors caught
                         in a BEGIN SEQUENCE will have stack information.
     ·                   Fixed problems with "special" float values and ToString(), such as
                         NaN, PositiveInfinity
     ·                   Fixed a problem with RddSetDefault() with a null parameter
     ·                   DbInfo(DBI_RDD_LIST) was not returning a value. This has been
                         fixed.
     ·                   We have updated many of the language resources, Also the
                         Error:ToString() now uses the language resources for captions like
                         'Arguments' and 'Description'.
     ·                   Low level file errors now include the callstack
     ·                   Fixed some problems in AsHexString()
     ·                   The DosErrString() no longer gets its messages from the language
                         string tables. The messages have been removed and also the related
                         members in the XSharp.VOErrors enum.
     ·                   Added a Turkish language resource.
     RDD System
     ·                   Fix locking problem in FPT files
     ·                   Fixed several problems with OrdKeyCount() and filters, scopes and
                         SetDeleted() setting
     ·                   Some DBF files have a value in the Decimals byte for field definitions
                         for field types that do not support decimals. This was causing
                         problems. These decimals are now ignored.
     ·                   Opening and closing a DBF without making changes was updating the
                         time stamp. This has been fixed.
     ·                   Fixed problems in Pack() and Zap()
     ·                   Fixed a problem where custom indexes were accidentally updated.
     ·                   Fixed several problems with OrdKeyCount() in combination with
                         Filters, SetDeleted() and scopes.
          VO SDK Classes
          ·                 Most of the libraries now compile with "Late Binding" disabled for better
                            performance.
                            To help in doing this some typed properties have been added such as
                            SqlStatement:__Connection which is typed as SQLConnection.
          VOXPorter
          ·                 The program is now able to comment, uncomment and delete source
                            code lines from the VO code when exporting to XSharp.
                            You have to add comments at the end of the line. The following
                            comments are supported:
                         // VXP-COM : comments the line when exporting it
                         // VXP-UNC : uncomments the line
                         // VXP-DEL : deletes the line contents
                         example:
                         // METHOD ThisMethodDoesNotGetDefinedInVOcode() // VXP-UNC
                         // RETURN NIL // VXP-UNC
          Changes in 2.0.3.0 (Bandol RC3)
          Compiler
          ·                 Code generation for STATIC LOCALs of type STRING was not
                            initializing the variables to an empty string when /vo2 was selected.
                            We have also improved code generation for STATIC LOCALs when
                            they are initialized with a compile time constant
          ·                 In preparation for the support for variables passed by reference to
                            functions/methods with clipper calling convention we are now
                            assigning back the locals variables to the parameter array at the end of
                            a function/method with clipper calling convention.
          ·                 The compiler would not complain if you were assigning a value of one
                            enum to a variable of another enum. This has been fixed.
          ·                 Added support for the FoxPro '=' assignment operators. Other dialects
                            also allow the assignment operator but a warning is generated in the
                            other dialects.
          ·                 Xbase++ classes inside BEGIN NAMESPACE .. END NAMESPACE
                            were not recognized. This has been fixed.
          ·                 Statements inside WITH blocks are no longer constrained to
                            assignment expressions and method calls. You can now use the
                            WITH syntax for expressions anywhere inside a WITH block. If the
                         compiler can't find the WITH variable then it will output a new error
                         message (XS9082)
     ·                   Updated the Aliased Expression rules to make sure that compound
                         expressions properly respect the parentheses.
     ·                   The __DEBUG__ macro was not always set correctly. We have
                         changed the algorithm that sets this macro. When the DEBUG define
                         is set then this macro gets defined. When the NDEBUG define is set
                         then this macro is not defined. When both defines are absent then
                         __DEBUG__ is NOT set.
     ·                   The compiler was allowing you to use the '+' operator between
                         variables/ expressions of type string and logic. This is now flagged as
                         an error.
     MacroCompiler
     ·                   Fixed a problem with resolving Field names that were identical to
                         keywords or keyword abbreviations (for example DATE and CODE)
                         and for Field names that are equal to built-in function names (such as
                         SET)
     ·                   Fixed a problem where a complicated expression evaluated with an
                         alias prefix was not evaluated correctly.
     ·                   The macro compiler initializes itself from the Dialect option in the
                         runtime to enable/disable certain behavior.
     ·                   The macro compiler now recognizes the "." operator for workarea
                         access and memvar access when running in the FoxPro dialect.
     Runtime
     ·                   Added functions FieldPutBytes() and FieldGetBytes()
     ·                   Added function ShowArray()
     ·                   Added several defines that were missing, such as MAX_ALLOC and
                         ASC_A.
     ·                   Added Crypt() overloads that accept BYTE[] arguments
     ·                   The ClassDescribe() method for DataObject classes (XPP dialect)
                         now includes properties and methods that were dynamically added.
     ·                   Fixed a problem with the RELEASE command for MemVars. This was
                         also releasing variables defined outside the current function / method.
     ·                   There is now also a difference between the FoxPro dialect and other
                         dialects in the behavior of the RELEASE command.
                         FoxPro completely deletes the variables, the other dialect set the value
                         of the variables to NIL.
     ·                   New PRIVATE memvars are initialized to FALSE in the FoxPro dialect.
                         In the other dialects they are initialized to NIL.
     ·                   Some numeric properties in the RuntimeState were giving a problem
                         when a numeric of one type was written and another numeric type was
                         expected when reading. This has been fixed.
     ·                   Fixed a problem with return NIL values from Macro compiled
                         codeblocks.
     ·                   The parameter to DbClearScope() is now optional
     ·                   The USUAL type now allows to compare between values of type PTR
                         and LONG/INT64 The PTR value is converted to the appropriate
                         Integral type and then an Integral comparison is done.
          ·                  The USUAL type now also allows comparisons between any type and
                             NIL.
          ·                  Casts from USUAL values to SHORT, WORD, BYTE and SBYTE are
                             no longer checked to be compatible with VO.
          RDD System
          ·                  Added support for different block sizes in DBFFPT.
          ·                  DBFFPT now allows to override the block size (when creating) from
                             the users code. Please note that block sizes < 32 bytes prevent the
                             FPT from opening in Visual FoxPro.
          ·                  Added support for reading various Flexfile memo field types, including
                             arrays.
          ·                  Added support for writing to FPT files
          ·                  When creating FPT files we now also write the FlexFile header. Please
                             note that our FPT driver does not support "record recycling" for deleted
                             blocks like FlexFile does. We also only support writing STRING values
                             to FPT files and Byte[] values.
          ·                  Added support for Visual FoxPro created CDX files that were created
                             with the COLLATE option. The RDD dll now contains collation tables
                             for all possible combinations of collation and CodePage.
          ·                  Added support for USUALs with a NIL value and the comparison
                             operators (>, >=, <, <=). These operators return FALSE, except the
                             >= and <= operators which return TRUE when both sides of the
                             comparison are NIL.
          ·                  We exposed several Advantage related function and types. Also the
                             function AdsConnect60() was defined. We have not created functions
                             for all available functions in Ace32 and Ace64, but only the ones
                             needed in the RDD.
          ·                  If you are missing a function in the ACE class, please let us know. All
                             functions should be available and accessible now in the Ace32 and
                             Ace64 classes or in the ACEUNPUB32 or ACEUNPUB64 classes.
          ·                  The ADS RDD was returning incorrect values for LOGIC fields.
          ·                  Fixed some problems with skipping in CDX indexes and scopes and
                             filters.
          ·                  Executing DbGoTop() twice or DbGoBottom() twice for DBFCDX
                             would confuse the RDD. This has been fixed.
          ·                  Fixed a problem with Seeking() in an empty DBF file
          ·                  FieldPut for STRING fields in the Advantage RDD now truncates the
                             fields to the maximum length of the field before assigning the value
          ·                  Fixed a problem with UNIQUE CDX Indexes.
          ·                  You can now create VFP compatible DBF files with DBCreate(). To do
                             so use the following field types (apart from the normal CDLMN):
                         W        Blob
                         Y        Currency
                         B        Double
                         T        DateTime
                         F        Float
                         G        General
                         I        Integer
                         P        Picture
                    Q      Varbinary
                    V      Varchar
                    Special field flags can be indicated by adding a suffix to the type:
                    "0" = Nullable
                    "B" = Binary
                    "+" = AutoIncrement
                    So this creates a nullable date: "D0" and this creates an autoincremental
                    integer "I+".
                    Auto increment columns are initialized with a counter that starts with 1
                    and a step size of 1. You can change that by calling DbFieldInfo:
                            DbFieldInfo(DBS_COUNTER, 1, 100) // sets the counter for field
     1 to 100
                            DbFieldInfo(DBS_STEP, 1, 2)           // sets the step size for
     field 1 to 2
     ·                   Fixed a locking problem with FPT files opened in shared mode
     ·                   Fixed several problems related to OrderKeyCount() and various
                         settings of Scopes and SetDeleted() in the DBFCDX RDD.
     VO SDK Classes
     ·                   Fixed a problem in the DateTimePicker class when assigning only a
                         time value.
     ·                   System classes and RDD classes have been cleaned up somewhat
                         and now compile in AnyCPU mode. So this means that you can use
                         the DbServer class in a 64 bit program !
                         The projects for these two libraries also no longer have the "Late
                         Binding" compiler option enabled. There is still some late bound code
                         in these libraries but this code now uses explicit late bound calls such
                         as Send(), IVarGet() and IVarPut().
     ·                   Because of the change in the handling of __DEBUG__ some SDK
                         assemblies are not better optimized.
                         Please note. If you are using values from types defined in the same
                         assembly as the form then the assembly needs to be (re)compiled
                         first before the form can be successfully opened in the Windows
                         Forms Editor.
          ·              New methods generated from the Windows forms editors will now be
                         generated with a closing RETURN statement.
          ·              We have made some improvements to the presentation of QuickInfo in
                         the source code editor.
          Tools
          ·              VOXporter now also exports VERSIONINFO resources
          Changes in 2.0.2.0 (Bandol RC 2)
          Compiler
          ·              File wide PUBLIC declarations (for MEMVARs) were incorrectly parsed
                         as GLOBALs. Therefore they were initialized with NIL and not with
                         FALSE. They are now generated correctly as public Memvars. The
                         creation of the memvars and the initialization is done in after the Init3
                         procedures in the assembly have run.
          ·              Instance variable initializers now can refer other fields and are allowed
                         to use the SELF keyword. This is still not recommended. The order in
                         which fields are initialized is the order in which they are found in the
                         source code. So make sure the field initializers are defined in the right
                         order in your code.
          ·              AUTO properties are now also initialized with an empty string
                         when /vo2 is enabled.
          ·              The compiler was allowing you to define instance variables for
                         Interfaces. They were ignored during code generation. Now an error
                         message is produced when the compiler detects fields on interfaces.
          ·              When the compiler detects 2 ambiguous symbols with different types
                         (for example a LOCAL and a CLASS with the same name) then the
                         error message now clearly indicates the type for each of these
                         symbols.
          ·              Fixed an exception in the Preprocessor
          ·              Added support for the FoxPro runtime DLL.
          ·              The ANY keyword (an alias for USUAL) is no longer supported.
          ·              Keywords that appear after a COLON (":") DOT (".") or ALIAS (->)
                         operator are no longer parsed as keyword but as identifier. This should
                         solve issues with parsing code that for example accesses the Date
                         property of a DateTime class.
          ·              We have added support for the WITH .. END WITH statement block:
                         Start                                 End
                         PROCEDURE                             END PROCEDURE
                         PROC                                  END PROC
                         FUNCTION                              END FUNCTION
                         FUNC                                  END FUNC
                         METHOD                                END METHOD
                         ASSIGN                                END ASSIGN
                         ACCESS                                END ACCESS
                         VOSTRUCT                              END VOSTRUCT
                         UNION                                 END UNION
          ·              The compiler now registers the Dialect of the main in the Dialect
                         property of the RuntimeState (Non Core dialects only)
          MacroCompiler
          ·              Fixed a problem with escaped literal strings
          ·              Fixed a problem with implicit narrowing conversions
          ·              Fixed a problem with macro compiled alias operations (Customer)-
                         >&fieldName
          Runtime
          ·              Fixed a problem in the Round() function.
          ·              Fixed a problem in the ExecName() function.
          ·              Added FoxPro runtime DLL.
          ·              Added XML support functions in the Xbase++ dialect runtime
          ·              Added support for dynamic class creation in the Xbase++ dialect
                         runtime.
          ·              Fixed a problem in the Push-Pop workarea code for aliased
                         expressions.
          ·              converting a NULL to a symbol would cause an exception. This has
                         been fixed.
          RDD system
          ·              Fixed several problems in the ADS RDD
          ·              The DBFCDX RDD is now included
          ·              The DBFVFP RDD is now included. This RDD can be used to access
                         files with DBF/FPT/CDX extension and support the Visual Foxpro field
                         types, such as Integer, Double, DateTime and VarChar. Reading files
                         should be fully supported. Writing should also work with the exception
                         of the Picture and General formats and with the exception of the
                         AutoIncremental Integer fields. You can also use the RDD to open the
                         various "definition" files from VFP such as projects, forms and reports.
                         The RDD 'knows' about the different extensions for indexes and
                         memos. You can also open DBC files as normal tables. In a future
                         version we will support the VFP database functionality.
     Tools
     ·                   VOXporter now writes DEFINES in the RC files and no longer literal
                         values.
     ·                   VOXporter: fix for module names with invalid chars for filenames
     Compiler
     ·                   Added support for the so called IF Pattern Expression syntax, which
                         consists of an IS test and an assignment to a variable, prefixed with
                         the VAR keyword:
                         IF x is Foo VAR oFoo
                            ? oFoo:DoSomething()
                         ENDIF
          ·              There was a problem when switching between dialects when using the
                         shared compiler. It would sometimes no longer detect dialect specific
                         keywords. This has been fixed.
          ·              Fixed a problem where incorrect code was producing an error "Failure
                         to emit assembly"
          ·              Fixed a problem in code that uses _CAST to cast a 32 bits value to 16
                         bits
          ·              Fixed a problem with overloaded indexed properties where the index
                         parameter in a subclass has a different type than the index parameter
                         in the super class.
          ·              Changed implementation of several aliased operations (ALIAS->FIELD
                         and (ALIAS)->(Expression))
          ·              Changed preprocessor handling of extended strings ( (<token>) )
          ·              The Roslyn code was not marking some variables as 'assigned but
                         not read' to be compatible with the old C# compiler. We are now
                         flagging these assignments with a warning. This may produce a lot of
                         warnings in your code that were not detected before.
                         To support this we have received some requests to "open up" the
                         support for 1 based indexes in the compiler. In the past the compiler
                         would only allow 1 based indexing for variables of type System.Array or
                         of the XBase ARRAY Type.
                         We have now added a couple of interfaces to the runtime. If your type
                         implements one of these interfaces then the compiler will recognize
                         this and allow you to use 1 based indexes in your code and then the
                         compiler will automatically subtract 1 from the numeric index
                         parameter. The XSharp ARRAY type and ARRAY OF type now also
                         implement (one of) these interfaces/
                         The interfaces are:
                             INTERFACE IIndexer
                                 PUBLIC PROPERTY SELF[index PARAMS INT[]] AS USUAL GET SET
                             END INTERFACE
                             INTERFACE IIndexedProperties
                                 PROPERTY SELF[index AS INT   ] AS USUAL GET SET
                                 PROPERTY SELF[name AS STRING] AS USUAL GET SET
                             END INTERFACE
                            INTERFACE INamedIndexer
                               PUBLIC PROPERTY SELF[index AS INT, name AS STRING] AS USUAL
                          GET SET
                            END INTERFACE
          Runtime
          ·              Fixed some problems in the OrderInfo() function
          ·              Fixed several problems with DB..() functions in the runtime
          ·              Fixed several problems with the macro compiler
          ·              Fixed a problem with the handling of default parameters in late bound
                         calls to methods
          ·              Improved error messages for missing methods and/or properties in
                         late bound code.
          ·              The Select() function was changing the current workarea. This has
                         been fixed.
     RDD system
     ·                   Added support for DBF character fields up to 64K.
     ·                   Implemented the DBFCDX RDD
     ·                   Fixed several problems related to the DBFNTX RDD
     ·                   The DBF RDD was using the incorrect locking scheme for Ansi DBF
                         files. It now uses the same scheme as VO and Vulcan.
     ·                   Macro compiled index expressions are not of the type _CodeBlock and
                         not of the type RuntimeCodeBlock (the RuntimeCodeblock is
                         encapsulated inside the _CodeBlock object).
                         That prevents problems when storing these expressions inside a
                         USUAL
                         the current selected element. The complete list can be found on the
                         Tools-Options-TextEditor-XSharp-Intellisense page.
          ·              Assemblies added to a project would not be properly resolved until the
                         next time the project was loaded. This has been fixed.
          ·              Fixed a problem in the codedom parser which feeds the windows form
                         editor. You can now inherit a form from another form in the same
                         assembly. You will have to compile the project first (of course).
          ·              The .CH extension is now also registered as relevant for the X# project
                         system.
          ·              Changed auto indentation for #ifdef commands
          ·              Fixed an exception that could occur during loading of project files with
                         COM references.
          ·              Added templates for class libraries in XPP and VO Dialect
          ·              Sometimes a type lookup for intellisense was triggered inside a
                         comments region. This has been fixed.
          Tools
          ·              VOXPorter was not removing calling conventions when creating
                         delegates. This has been fixed
          ·              VOXporter was sometimes generating project files with many
                         duplicates of resource items. This has been fixed.
          ·              VOXporter now marks prefix identifiers that conflict with one of the new
                         keywords with "@@"
          ·              The delay for the VOXporter welcome screen has been shortened.
          Changes in 2.0.0.9 (Bandol Beta 9)
          Compiler
          ·              The Lexer (the part of the compiler that recognizes keywords, literals
                         etc) has been rewritten and is slightly faster.
          ·              The compiler now supports digit separators for numeric literals. So
                         you can now write 1 million as:
                         1_000_000
          ·              Fixed problem where static local variables were not initialized with ""
                         even when compiler option -vo2 was selected
          ·              #ifdef commands using preprocessor macros such as
                         __XSHARP_RT__ were not working correctly.
          ·              The XBase++ dialect now also supports the 'normal' class syntax.
          ·              We had changed the 'Entrypoint' algorithm in Beta 8. This has been
                         restored now and the -main command line option now works again as
                         well. In stead the "body" of the Start method is now encapsulated in an
                         anonymous function.
          ·              Duplicate include files no longer produce an error but a warning
          ·              Fix for problem with default parameter values with 'L' or 'U' suffix
          ·              Added compiler error when specifying default parameter values for
                         methods/functions with clipper calling convention
          ·              DIM arrays of STRING were not initialized with "" when /vo2 was
                         specified. This has been fixed.
          ·              Added support for Dbase style memory variables (MEMVAR, PUBLIC,
                         PRIVATE, PARAMETERS). See the MEMVAR topic in the help file for
                         more information. This is only available for certain dialects and also
                         requires the /memvar commandline option
     ·                   Added support for undeclared variables (this is NOT recommended!).
                         This is only available for certain dialects and requires the /memvar
                         AND the /undeclared commandline options
     ·                   Fixed a problem for comparisons between USUAL variables and
                         STRING variables
     ·                   Fixed a problem with partial classes where the classname had
                         different casing in the various declarations
     ·                   Fixed a problem with numeric default parameters with L or U suffixes
     ·                   Fixed a problem with line continuation semi colons followed by a single
                         line comment with the multiline comments style.
     ·                   Fixed a problem with methods containing YIELD statements in
                         combination with compiler option /vo9
     ·                   When a visibility modifier was missing on a generic method then this
                         method was created as a private method. This has been fixed.
     ·                   When choosing between overloaded functions in XSharp.RT and
                         XSharp.Core the function in the XSharp.RT assembly would
                         sometimes be chosen although the overload in XSharp.Core was
                         better
     ·                   CASE statements without CASE block but only a OTHERWISE block
                         would crash the compiler. This has been fixed and an warning about
                         an empty CASE statement has been added.
     Runtime
     ·                   Several changes to the Macro compiler, such as the parsing of Hex
                         literals, case sensitivity of parameters (they are no longer case
                         sensitive) and limited support for function overloading.
     ·                   Several missing functions have been added, such as _Quit(),
     ·                   The return value of several Ord..() functions was incorrect. This has
                         been fixed.
     ·                   Fixed a problem with CurDir() for the root directory of a drive
     ·                   Fixed a problem with calling Send() with a single parameter with the
                         value NULL_OBJECT.
     ·                   Solved problem with incorrect parameters for DiskFree() and
                         DiskSpace()
     ·                   MemoRead() and MemoWrit() and FRead..() and FWrite..() now
                         respect the SetAnsi() setting like the functions in the VO Runtime.
     ·                   We have added 2 new functions to read/write binary files:
                         MemoReadBinary() and MemoWritBinary()
     ·                   Not all DBOI_ enum values had the same value as in Vulcan. This has
                         been solved.
     ·                   SetDecimalSep() and SetThousandSep() now also set the numeric
                         separators in the current culture.
     ·                   The USUAL -> STRING conversion now calls AsString()
     ·                   Added support for Dbase style dynamic memory variables (MEMVAR,
                         PUBLIC, PRIVATE, PARAMETERS). See the Memory Variables topic
                         in the help file for more information.
     ·                   The IsDate() function now also returns TRUE for USUALs of type
                         DateTIme. There is also a separate IsDateTime() function. We have
          Tools
          · No changes in this release.
     Compiler
     ·                   The compiler source code has been upgraded to Roslyn 2.10 (C# 7.3).
                         As a result of that there are some new compiler options, such
                         as /refout and we also support the combination of the "PRIVATE
                         PROTECTED" modifier that defines a type member as accessible for
                         subclasses in the same assembly but not for subclasses in other
                         assemblies
     ·                   We have added support for XBase++ class declarations. See the
                         XBase++ class declaration topic for more information about the syntax
                         and what is supported and what not.
     ·                   We have added support for simple macros with the &Identifier syntax
     ·                   We have added support for late bound property access:
                         o                     The <Expression>:&<Identifier> syntax.
                                               This translates to IVarGet(<Expression>,
                                               <Identifier>).
                         o                     The <Expression>:&(<Expression2>) syntax.
                                               This translates to IVarGet(<Expression>,
                                               <Expression2>).
                         o                     Both of these can also be used for assignments
                                               and will be translated to IVarPut:
                                               <Expression>:&<Identifier> := <Value>
                                               This becomes IVarPut(<Expression>, <Identifier>,
                                               <Value>)
                         o                     All of these will work even when Late Binding is not
                                               enabled.
     ·                   We have added a new compiler options /stddefs that allows you to
                         change the standard header file (which defaults to XSharpDefs.xh)
     ·                   We have added a new preprocessor Match marker <#idMarker> which
                         matches a single token (all characters until the first whitespace
                         character)
     ·                   When you select a dialect now, then the compiler will automatically
                         add some compiler macros. The VO dialect declares the macro
                         __VO__, the Vulcan dialect declares the macro __VULCAN__ the
                         harbour dialect declares the macro __HARBOUR__ and the XBase++
                         dialect declares the macro __XPP__.
     ·                   When compiling against the X# runtime then also the macro
                         __XSHARP_RT__ will be defined.
     ·                   We have added a new warning when you pass a parameter without
                         'ref' modifier (or @ prefix) to a method or function that expects a
                         parameter by reference or an out parameter.
     ·                   We have also added a warning that will be shown when you assign a
                         value from a larger integral type into a smaller integral type to warn you
                         about possible overflow problems.
     Runtime
     ·                   This build includes a new faster macro compiler. It should be fully
                         compatible with the VO macro compiler. Some of the .Net features are
                         not available yet in the macro compiler.
     Tools
     ·                   VulcanXPorter was always adjusting the referenced VO libraries and
                         was ignoring the "Use X# Runtime" checkbox
     ·                   VOXPorter now has an option to copy the resources referenced in the
                         AEF files to the Resources subfolder in the project
     ·                   VOXPorter now also copies the cavowed, cavofed and cavoded
                         template files to the properties folders in your project.
     Changes in 2.0.0.7 (Bandol Beta 7)
     Compiler
     ·                   When calling a runtime function with a USUAL parameter the compiler
                         now automatically prefers methods or functions with "traditional' VO
                         types over the ones with enhanced .Net types. For example when
                         there are 2 overloads, one that takes a byte[] and another that takes a
                         string, then the overload that takes a string will get preference over the
                         overload that takes a byte[].
     ·                   Resolved a problem with .NOT. expressions inside IIF() expressions
     ·                   Improved debugger break point generation for Invoke expressions ( like
                         String.Compare())
     ·                   Fixed a pre-processor error for parameters for macros defined in a
                         #define. These parameters must have the right case now. Parameters
                         with a different case will not be resolved any longer.
     ·                   Fixed a pre-processor error where optional match patterns in pre-
                         processor rules were repeated. This is too complicated to explain here
                         in detail <g>.
     ·                   The code generated by the compiler for Array operations now uses the
                         new interfaces declared in the X# runtime (see below).
     Runtime
     ·                   We have added several missing functions, such as _GetCmdLine,
                         Oem2AnsiA() and XSharpLoadLibrary
     ·                   Fixed problems in CreateInstance, IVarGet, IVarPut(), CtoDAnsi() and
                         more.
     ·                   Added VO Compatible overload for FRead4()
     ·                   No longer (cathed) exceptions are produced for empty dates
     ·                   Ferror() was not always return the error of a file operation. This has
                         been fixed
     ·                   We have added a new FException() function that returns the last
                         exception that occurred for a low level file operation
     ·                   Casting a usual containing a PTR to a LONG or DWORD is now
                         supported
     ·                   Some new interfaces have been added related to array handling. The
                         compiler no longer inserts a cast to Array inside the code, but inserts a
                         cast to one of these interfaces depending on the type of the index
                         parameter. The USUAL type implements IIndexer and IIndexProperties
                         and dispatches the call to the objects inside the usual when this
                         objects exposes the interface. This is used for indexed access of
                         properties when using AEval or AScan on an ARRAY OF <type>
                         o                  XSharp.IIndexer
                         o                  XSharp.INamedIndexer
                         o                  XSharp.IIndexedProperties
          SDK Classes
          ·              We have added the Hybrid UI classes from Paul Piko (with permission
                         from Paul)
          Tools
          ·              The Vulcan XPorter now also has an option to replace the runtime and
                         SDK references with references to the X# runtime
          Changes in 2.0.0.6 (Bandol Beta 6)
          Compiler
          ·              The compiler was sometimes still generating warnings for unused
                         variables generated by the compiler. This has been fixed.
          ·              The compiler will now produce a warning that #pragmas are not
                         supported yet (9006)
          ·              Added compiler macro __FUNCTION__ that returns the current
                         function/method name in original casing.
          ·              Literal sub arrays for multidimensional arrays no longer need a type
                         prefix when compiling in the Core dialect
          ·              Fixed problem with the Global class name that would happen when
                         building the runtime assemblies (these have a special convention for
                         the global class names)
          ·              When the calling convention of a method in an interface is different
                         from the calling convention of the implementation (CLIPPER vs Not
                         CLIPPER) then a new error (9067) will be generated by the compiler.
          ·              The calling convention for _DLL functions and procedures is now
                         optional and defaults to PASCAL (stdcall)
          ·              The namespace alias for using statements was not working in all
                         cases.
          ·              The compiler will now generate an error for code that incorrectly uses
                         the VIRTUAL and OVERRIDE modifiers.
          ·              The compiler was throwing an exception for a specific kind of incorrect
                         local variable initializer with generic arguments. This has been fixed.
          ·              Visibility modifiers on GET or SET accessors for properties were not
                         working correctly (INTERNAL, PRIVATE etc). This has been fixed.
          ·              The compiler now handles PSZ(_CAST,...) and PSZ(..) differently.
                         When the argument is a literal string, then the PSZ will only be
                         allocated once and stored in a "PSZ Table" in your assembly. The
                         lifetime of this PSZ is then the lifetime of your app. When this happens
                         then the new compiler warning XS9068 will be shown.
                         When the argument is a string stored in a local or global (or define)
                         then the compiler can't know the lifetime of the PSZ. It will therefore
                         allocate the memory for the PSZ with the StringAlloc() function. This
                         ensures that the PSZ will not go out of scope and be freed. If you use
                         this a lot in your application then you may be repeatedly allocating
                         memory. We recommend that you avoid the use of the cast and
                         conversion operators for PSZs and take control of the lifetime of the
                         PSZ variables by allocating and freeing the PSZ manually. PSZ casts
                         on non strings (numerics or pointers) simply call the PSZ constructor
                         that takes an intptr (this is used on several spots in the Win32API
                         library for 'special' PSZ values).
     ·                   Named arguments are now also supported in the Vulcan dialect. This
                         may lead to compiler errors if your code looks like the code below,
                         because the compiler will think that aValue is a named argument of the
                         Empty() function.
IF Empty(aValue := SomeExpression())
     ·                   If you were inheriting a static class from another class then you would
                         get a compiler warning before. This is now a compiler error, because
                         this had a side effect where the resulting assembly contained a
                         corrupted reference.
     ·                   The overload resolution code now chooses a type method/function
                         over a method/function with clipper calling convention.
     ·                   The XBase++ dialect is now recognized by the compiler. For the time
                         being it behaves the same as Harbour. We have also added the
                         compiler macro __DIALECT_XBASEPP__ that will be automatically
                         define to TRUE when compiling in Xbase++ mode.
     ·                   Fixed a problem in the PDB line number generation that would cause
                         incorrect line numbers in the debugger
          VOXporter
          ·              We have added an option to sort the entities in alphabetical order in the
                         output file.
          ·              We have added an option so you can choose to add the X# Runtime
                         as reference to your application (otherwise the Vulcan runtime is used)
          Runtime
          ·              The SetCentury setting was incorrect after calling
                         SetInternational(#Windows). This has been fixed.
          ·              The Descend function for dates now returns a number just like in VO
          ·              The functions ChrA and AscA have been renamed to Chr() and Asc()
                         and the original functions Chr() and Asc() have been removed. The
                         original functions were using the DOS (Oem) codepage and this is not
                         compatible with Visual Objects.
          ·              On several places in the runtime characters were converted from 8 bit
                         to 16 bit using the System.Encoding.Default codepage. This has been
                         changed. We use the codepage that matches the WinCodePage in
                         the Runtimestate now. So by setting the Windows codepage in the
                         runtime state you now also control the conversions from Unicode to
                         Ansi and back
          ·              The Oem2Ansi conversion was incorrect for some low level file
                         functions.
          ·              We have changed several things in the Late Binding support
          ·              All String - PSZ routines (String2PSz(), StringAlloc() etc) now use the
                         Windows Codepage to convert the unicode strings to ansi.
          ·              If you library is compiled with 'Compatible String comparisons' but the
                         main app isn't, then the string comparisons in the library will follow the
                         same rules as the main app because the main app registers the /vo13
                          setting with the runtime. The "compatible" stringcomparison routines
                         in the runtime now detect that the main app does not want to do VO
                         compatible string comparisons and will simply call the normal .Net
                         comparison routines.
                         We therefore recommend that 3rd party products always use the
                         Compatible String comparisons in their code.
          ·              Preliminary documentation for the runtime was generated from source
                         code comments and has been included as chapter in this
                         documentation.
          The VO SDK
          ·              This build includes the first version of the VO SDK compiled against
                         the X# runtime. We have included the following class libraries
                         o                   Win32API
                         o                   System Classes
                         o                   RDD Classes
                         o                   SQL Classes
                         o                   GUI Classes
                         o                   Internet Classes
                         o                   Console Classes
                         o                  Report Classes
     ·                   All assemblies are named VO<Name>.DLL and the classes in these
                         assemblies are in the VO namespace.
     ·                   This SDK is based on the VO 2.8 SP3 source code. The differences
                         between VO 2.8 SP3 and VO 2.8 SP4 will be merged in the source
                         later,
     ·                   The Libraries for OLE, OleServer and Internet Server are not included.
                         The OleAutoObject class and its support classes is included in the
                         XSharp.VO library. OleControl and OleObject are not included.
     ·                   Preliminary documentation for these classes was generated from
                         source code comments and has been included as chapter in this
                         documentation.
          ·              The XSharp.VO DLL has the VoDb..() functions and the higher level
                         functions such as DbAppend(), EOF(), DbSkip() etc.
                         The VoDb..() functions return success or failure with a logical value. If
                         you want to know what the error was during the last operation then you
                         can access that with the method _VoDbErrInfoPtr() . This returns the
                         last exception that occurred in a RDD operation.
          ·              You can mix calls to the VoDb..() functions and CoreDb...() methods.
                         Under the hood the VoDb..() functions also call the CoreDb methods.
          ·              The higher level functions may throw an exception just like in VO. For
                         example when you call them on a workarea where no table is opened.
                         Some functions simply return an empty value (like Dbf(), Recno()).
                         Others will throw an exception. When you have registered an error
                         handler with ErrorBlock() then this error handler will be called with the
                         error object. Otherwise the system will throw an exception.
          ·              Date values are returned by the RDD system in a DbDate structure,
                         Float values are returned in a DbFloat structure. These structures
                         have no implicit conversion methods. They do however implement
                         IDate and IFloat and they can and will be converted to the Date and
                         Float types when they are stored in a USUAL inside the XSharp.VO
                         DLL. The DbDate structure is simply a combination of a year, month
                         and date. The DbFloat structure holds the value of fields in a Real8,
                         combined with length and the number of decimals.
          ·              More documentation about the RDD system will follow later. Of course
                         you can also look at the help file and source code on GitHub.
          Changes in 2.0.0.5 (Bandol Beta 5)
          Compiler
          ·              The strong named key for assemblies with native resources was
                         invalid. This has been fixed
          ·              When an include file was included twice for the same source (PRG)
                         file then a large number of compiler warnings for duplicate #defines
                         would be generated. Especially when the Vulcan
                         VOWin32APILibrary.vh was included twice then over 15000 compiler
                         warnings would be generated per source file where this happened.
                         This large number of warnings could lead to excessive memory usage
                         by the compiler. We are now outputting a compilation error when we
                         detect that the same file was included twice. We have also added a
                         limit of 500 preprocessor errors per source (PRG) file.
          ·              A change in Beta 4 could result in compiler warnings about unused
                         variables that were introduced automatically by the X# compiler. This
                         warning will no longer be generated.
          ·              The compiler now correctly stores some compiler options in the
                         runtime state of XSharp.
          Runtime
          ·              Fixed a problem in the Ansi2OEM and OEM2Ansi functions.
          ·              Fixed a problem in the sorting for SetCollation(#Windows)
          ·              Fixed a problem with string comparisons in runtime functions like
                         ASort(). This now also respects the new runtime property
                         CompilerOptionVO13 to control the sorting
     Build System
     ·                   The default value for VO15 has been changed back from false to
                         undefined.
     Changes in 2.0.0.4 (Bandol Beta 4)
     Compiler
     ·                   POSSIBLY BREAKING CHANGE: Functions now always take
                         precedence over same named methods. If you want to call a
                         method inside the same class you need to either prefix it with the
                         typename (for static methods) or with the SELF: prefix. If there is no
                         conflicting function name then you can still call the method with just its
                         name. We recommend to prefix the method calls to make your code
                         easier to read.
     ·                   The compiler was accepting just an identifier without a INSTANCE,
                         EXPORT or other prefix and without a type inside a class declaration.
                         It would create a public field of type USUAL. That is no longer possible.
     ·                   Improved the positional keyword detection algorithm (this also affects
                         the source code editor)
     ·                   The || operator now maps to the logical or (a .OR. b) and not to the
                         binary or (_OR(a,b))
     ·                   The VAR statement now also correctly parses
VAR x = SomeFunction()
                         And will compile this with a warning that you should use the
                         assignment operator (:=).
                         We have added this because many people (including we) copy
                         examples from VB and C# where the operator is a single equals token.
     ·                   Error messages about conflicting types now include the fully qualified
                         type name.
     ·                   The compiler no longer includes the width for literal Floats. This is
                         compatible with VO.
     ·                   A Default parameter of type Enum is now allowed.
     Runtime
     ·                   Added several functions that were missing, such as __Str() and
                         DoEvents()
     ·                   Fixed a problem in the macro compiler with non-english culctures.
     ·                   Added several overloads for Is..() functions that take a PSZ instead of
                         a string, such as IsAlpha() and IsUpper().
     Compiler
     ·                   When 2 method overloads have matching prototypes the compiler now
                         prefers the non generic one over the generic one
     ·                   Fixed an exception that could occur when compiling a single line of
                         source code with a preprocessor command in it.
     Runtime
     ·                   Added Mod() function
     ·                   Added ArrayNew() overload with no parameters
     ·                   Fixed problem in __StringNotEquals() when length(RHS) >
                         length(LHS) and SetExact() == FALSE
     ·                   Added missing string resource for USUAL overflow errors
     Vulcan XPorter
     ·                   Project dependencies defined in the solution file were not properly
                         converted
          VO XPorter
          ·               Fixed a problem where resource names were replaced with the value
                          of a define
          Changes in 2.0.0.2 (Bandol Beta 2)
          Compiler
          ·               The compiler now transparently accepts both Int and Dword
                          parameters for XBase Array indices
          ·               When the compiler finds a weakly typed function in XSharp.VO and a
                          strongly typed version in XSharp.Core then it will choose the strongly
                          typed version in XSharp.Core now.
          ·               In the VO and Vulcan dialect sometimes an (incorrect) warning
                          'duplicate usings' was displayed. This is now suppressed.
          ·               The debugger information for the Start function has been improved to
                          avoid unnecessary step back to line 1 at the end of the code
          ·               The debugger break point information for BEGIN LOCK and BEGIN
                          SCOPE has been improved
          ·               The debugger break point information for multi line properties has been
                          improved
          ·               /vo6, /vo7 and /vo11 are now only supported in the VO/Vulcan dialect
          Runtime
          ·               Removed DWORD overloads for Array indexers
          ·               Fixed overload problem for ErrString()
          ·               Fixed overload problem for _DebOut()
          ·               Fixed problems in DTOC() and Date:ToString()
          ·               Fixed ASort() incompatibilities with VO
          ·               Fixed memory blocks now get filled with 0xFF when they are released
                          to help detect problems
          Visual Studio
          ·               Fix 'Hang' in VS2017 when building
          ·               Fix 'Hang' in VS2017 when a tooltip (QuickInfo) was displayed
          ·               Fixed problem with debugging x64 apps
          ·               You can no longer rename or delete the Properties folder
          ·               Selecting 'Open' from the context menu on the the Properties folder
                          now opens the project properties screen
          ·               Updated several icons in the Project Tree
          ·               Enhancements in the Goto Definition
          Build System
          ·               Fix problem with CRLF in embedded resource commandline option
Compiler
     New features
     ·                   Added support for ARRAY OF language construct. See the Runtime
                         chapter for more information about this.
     ·                   Added support for the X# Runtime assemblies when compiling in the
                         VO or Vulcan dialects.
     ·                   Added support for the "Pseudo" function ARGCOUNT() that returns the
                         # of declared parameters in a function/method compiled with clipper
                         calling convention.
     ·                   Added a new warning number for assigning values to a foreach local
                         variable. Assigning to USING and FIXED locals will generate an error.
     Optimizations
     ·                   Optimized the code generation for Clipper calling convention
                         functions/methods
     ·                   The /cf and /norun compiler options are no longer supported
     ·                   The preprocessor no longer strips white space. This should result in
                         better error messages when compiling code that uses the
                         preprocessor.
     ·                   Some parser errors are now more descriptive
     ·                   Changed the method that is used to determine if we compile against
                         CLR2 or CLR4. The compiler checks at the location either system.dll
                         or mscorlib.dll. When this location is in a path that contains "v2", "2.",
                         "v3" or "3." then we assume we are compiling for CLR2. A path that
                         contains "V4" or "4." is considered CLR4. The /clr commandline option
                         for the compiler is NOT supported.
     ·                   The preprocessor now generates an error when it detects recursive
                         #include files.
     Bug fixes
     ·                   Fixed a problem when using the [CallerMemberAttribute] on
                         parameters when compiling in Vulcan or VO Dialect
     ·                   Abstract properties should no longer generate a warning about a body
     ·                   You can now correctly use ENUM values as array indexes.
     ·                   Fixed a problem for Properties with PUBLIC GET and PRIVATE SET
                         accessors.
     ·                   Fixed an issue where assigning an Interface to a USUAL required a
                         cast to Object
     ·                   Fixed an issue where IIF expressions with literal types were returning
                         the wrong type (the L or U suffix was ignored)
     ·                   Fixed an issue where the declaration LOCAL x[10] was not compiled
                         correctly. This now compiles into a local VO Array with 10 elements.
          Runtime
          ·              Added XSharp.Core.DLL, XSharp.VO.DLL and
                         XSharp.Macrocompiler.DLL.
                         Most runtime functions are implemented and supported. See the X#
                         Runtime chapter for more information
          VO XPorter
          ·              SDK related options have been removed. They will be moved to a new
                         tool later.
          Changes in 1.2.1
          Compiler
          ·              Fixed a problem where a compilation error resulted in the message
                         "Failed to emit module" without further information
          ·              Fixed a problem with ++, -- += and similar operations in aliased
                         expressions (like CUSTOMER->CUSTNO++)
            CATCH ID AS ExceptionType
            CATCH ID                  // defaults to Exception type
            CATCH AS ExceptionType
            CATCH            // defaults to Exception type
     Compiler
     ·                   You can now pass NULL for parameters declared by reference for
                         compatibility with VO & Vulcan.
                         We STRONGLY advise not to do this, unless you make sure that the
                         function expects this and does not assign to the reference parameter
                         without checking for a NULL reference first. This will only work when
                         the /vo7 compiler option is enabled.
     ·                   We have made some optimizations in the Lexer. The compiler should
                         be a little faster because of that
     ·                   We fixed a problem with the automatic constructor generation (/vo16)
                         for classes that inherit from classes defined in an external DLL
     ·                   When compiling with /vo2 any string fields assigned in a child class
                         before the super constructor was called would be overwritten with an
                         empty string. The generated code will now only assign an empty string
                         when the string is NULL.
                         Note: we do not recommend to assign parent fields in the child
                         constructor before calling the super constructor. Manually coded
                         default values for parent fields will still overwrite values assigned in the
                         child constructor before the SUPER call
     ·                   Fixed a problem with CHECKED() and UNCHECKED() syntax in the
                         VO dialect
     ·                   Fixed a problem with choosing overloads for methods where an
                         overload exists with a single object parameter and also an overload
                         with an object[] parameter.
     ·                   Added support to the parser for LOCAL STATIC syntax
     VOXPorter
     ·                   The installer now includes the correct version of VOXPorter <g>
     ·                   VOXporter now supports the following commandline options:
                          /s:<source folder or aef>
                   /d:<destination folder>
                   /r:<runtime folder>
                   /nowarning
     ·                   Some code corrections were added for issues found in the GUI
                         classes
     ·                   The template files can now also be found when VOXPorter is run from
                         a different working directory
     Changes in 1.1.2
     Compiler
     ·                   Added compiler warning for code that contains a #pragma
     ·                   Fixed a problem with iif() functions and negative literal values
     VOXPorter
     ·      Fixes for exporting the VO RDD Classes from the SDK
Changes in 1.1.1
          Compiler
          ·              Fixed a problem with Debugger Breakpoints for DO CASE and
                         OTHERWISE
          ·              Fixed a problem with Debugger Breakpoints for sourcecode that is
                         defined in #included files
          ·              Added support for the Harbour Global Syntax where the GLOBAL
                         keyword is optional
          ·              Fixed a problem with FOR.. NEXT loops with negative step values
          ·              In some situations the @@ prefix to avoid keyword conflicts was not
                         removed from workarea names or field names. This has been fixed
          ·              In the VO/Vulcan dialect a warning (XS9015) was generated when a
                         default parameterless SUPER constructor call was automatically
                         generated. This error message is now suppressed. However a
                         generated SUPER constructor call with parameters still generates a
                         warning.
          ·              Prepared the compiler for Xbase type names and function names in
                         the XSharp Runtime
          Preprocessor
          ·              Fixed a crash in the preprocessor
          ·              The preprocessor was generating an error "Optional block does not
                         contain a match marker" for blocks without match marker. This is now
                         allowed.
                         (for example for the ALL clause in some of the Database UDCs )
          ·              When the same include files was used by multiple source files, and
                         different sections of this file were included because of different #ifdef
                         conditions, then the preprocessor would get "confused". This has been
                         fixed.
          ·              Debugger file/line number information from source code imported from
                         #include files is not processed correctly.
Changes in 1.1
          Compiler
          ·              Fixed a problem with Codeblocks used in late bound code after the
                         release of X# 1.0.3
          ·              Fixed a problem with overriding properties in a subclass that inherit
                         from a class where only the Assign (Set) or Access (Get) are defined.
          ·              The compiler option /vo16: automatically generate VO Clipper
                         constructors has been implemented.
     ·                   Fixed a crash in the compiler for compiler errors that occur on line 1,
                         column 1 of the source file
     ·                   Fixed a problem where overflow checking was not following the /ovf
                         compiler option
     ·                   Fixed problem with public modifier for interface methods
     ·                   Added proper error message with unreachable fields in external DLLs
     ·                   Fixed a problem with debugger sequence points (debugger stepping)
     ·                   X# generated pdb files are now marked with the X# language GUID so
                         they are recognized as X# in the VS debugger
     ·                   DATETIME (26) and DECIMAL (27) are added as UsualType to the
                         compiler in preparation of the X# runtime that allows usuals of these
                         types
     ·                   Compiler options /VO15 and /VO16 now produce an error message
                         when used outside the VO/Vulcan dialect
     ·                   Methods declared outside a class (VO style code) would declare a
                         private class and not a public class
     ·                   ASTYPE has been changed to a positional keyword
     ·                   Fixed a problem with the Chr() and _Chr() functions for literal numbers
                         > 127
     ·                   Added support for the __CLR2__ and __CLR4__ compiler macros.
                         The version is derived from the folder name of mscorlib.dll and/or
                         system.dll
     ·                   The Codeblock syntax was not working in the Core dialect.
     ·                   Some new keywords, such as REPEAT, UNTIL, CATCH,
                         FINALLY,VAR, IMPLIED, NAMESPACE, LOCK, SCOPE, YIELD,
                         SWITCH etc are now also positional and will only be recognized as
                         keyword when at the start of a line or after a matching other keyword.
                         This should help prevent cryptic error messages when these
                         keywords are used as function names.
Visual Studio
          Form Editor
          ·                 Improved Windows Form Editor support for types defined in project
                            references. We will now detect the location of the output files for these
                            projects, like the C# and VB project systems.
          ·                 The Code parser for the Form Editor was having problems with
                            untyped methods. This has been fixed.
          Debugger
          This build introduces a first version of the XSharp debugger support
          ·                   The Visual Studio debugger now shows the language X# in the
                              callstack window and other places
          ·                   Functions, Methods and procedures are now displayed in the X#
                              language style in the callstack window
          ·                   Compiler generated variables are no longer shown in the locals list
          ·                   The locals list now shows SELF in stead of this
          ·                   X# predefined types such as WORD, LOGIC etc are shown with their
                              X# type names in the locals window
          Testing
          ·                 Added support for the Test Explorer window
· Added templates for unit testing with XUnit, NUnit and Microsoft Test
     Other
     ·                   Added warning when Vulcan was (re)installed after XSharp, which
                         could cause a problem in the Visual Studio integration
     ·                   The VS Parser was marking Interfaces as structure in stead of
                         interface. This has been fixed.
     ·                   The tool XPorter tools have better names in the VS Tools Menu
     ·                   The VS Background parser gets suspended while looking up type
                         information to improve the intellisense speed
     ·                   Several changes were made to the templates that come with X#
     XPorter
     ·                   Fix problem in propertygroup conditions.
     VOXPorter
     ·                   Generate clipper constructors is now disabled by default
     ·                   Fixed a problem in the VS Template files.
Changes in 1.0.3
     Compiler
     ·                   Fixed a problem with the index calculation for Vulcan Arrays indexed
                         with a usual argument
     ·                   Fixed a problem with the generation of automatic return values for
                         code that ends with a begin sequence statement or a try statement
     ·                   Optimized the runtime performance for literal symbols.
                         The compiler now generates a symbol table for the literal symbols and
                         each literal symbol used in your app is only created once.
                         You may experience a little delay at startup if your app uses a LOT
                         (thousands) of literal symbols. But the runtime performance should be
                         better.
     ·                   Added a compiler error for code where numerics are casted to an
                         OBJECT with the VO compatible _CAST operator.
                         This is no longer allowed:
                         LOCAL nValue as LONG
                         LOCAL oObject as OBJECT
                         nValue := 123
                         oObject := OBJECT(_CAST, nValue)
Changes in 1.0.2
     Compiler
     ·                   Added support for XML doc generation. We support the same tags that
                         the C# compiler and other .Net compiler support.
     ·                   Improved some parser errors.
          Scripting
          ·              The scripting was not working in release 1.01
     VO Xporter
     ·                   Fixed a problem when importing certain VO 2.7 AEF files
     ·                   Fixed a problem with acceptable characters in the solution folder name
     ·                   VO Form and menu entities are also included in the xsproj file
     ·                   Added an option to the INI files to specify the Vulcan Runtime files
                         location (       )
     Compiler
     ·                   Fixed a problem with VERY old versions of the Vulcan Runtime
     ·                   Variables declared as DIM Byte[] and similar are now Pinned by the
                         compiler
     ·                   [Return] attribute was not properly handled by the compiler. This has
                         been fixed
     ·                   Compound Assignment (u+= f or -=) from USUAL and FLOAT were
                         causing a stackoverflow at runtime caused by a problem in the Vulcan
                         Runtime. These expressions now generate a compiler error with the
                         suggestion to change to a simple assignment ( u := u + f)
     VO XPorter
     ·                   We have added a check to make sure that the default namespace for
                         a X# project cannot contain a whitespace character
     New Features
     ·                   We have added support for ENUM Basetypes (ENUM Foo AS WORD)
     ·                   We have added a separate syntax for Lambda Expressions
     ·                   We have added support for Anonymous Method Expressions
     ·                   Typed local variables can now also be used for PCALL() calls
     ·                   Methods with the ExtensionAttribute and Parameters with the
                         ParamArrayAttribute attributes now compile correctly, but with a
                         warning
          Compiler
          ·               Fixed a problem with a late bound assign of a literal codeblock
          ·               Resolved several name conflicts
          ·               Improved several of the error messages
          ·               Fixed compilation problem for Properties with only a SET accessor
          ·               Fixed a crash in a switch block with an if .. endif statement
          ·               Fix problem with virtual instance methods and structures
          ·               Fixed name conflict foreach variables used in Array Literals
          ·               Changed resolution for Functions and static methods with the same
                          name.
                          In the VO/Vulcan dialect functions take precedence over static
                          methods. If you want to call the static method then then you need to
                          prefix the method call with the classname.
          ·               There is a separate topic in this documentation now that describes the
                          syntax differences and similarities between Codeblocks, Lambda
                          Expressions and Anonymous Method Expressions.
          ·               Fixed incorrect error message for Start() function with wrong
                          prototype.
          ·               When an ambiguity is detected between a function and a static
                          method then a warning is displayed
          Visual Studio
          ·               Added parameter tips for Functions and methods from "Using Static"
                          classes
          ·               Added parameter tips for Clipper Calling Convention functions and
                          methods
          ·               Added support for generics in Intellisense
          ·               Intellisense will show keywords in stead of native type names (WORD
                          in stead of System.UInt16 for example)
          ·               Parameter tips are now shown when a opening '(' or '{' is typed as
                          well as when the user types a comma ','.
          ·               Parameter tips will show REF OUT and AS modifiers
          ·               Added intellisense for COM references, both for normal COM
                          references as well as for Primary Interop Assemblies. Also members
                          from implemented interfaces are now included in intellisense code
                          completion (this is very common for COM).
          ·               Improved intellisense for Project References from other languages,
                          such as C# and VB.
          ·               Added intellisense for Functions in referenced projects and referenced
                          Vulcan and/or X# assemblies
          ·               Suppress "special type names" in intellisense lists
          ·               Added support for "VulcanClassLibrary" attribute to help find types and
                          functions
          ·               Errors from the Native Resource compiler are now also included in the
                          error list
          ·               Fixed problem with parameter tips for Constructors
          ·               Added memberlist support for X# type keywords such as STRING,
                          REAL4 etc.
     Tools
     ·                   Added a first version of the VO Xporter tool
     ·                   The installer now registers .xsproj files, .prg, .ppo. .vh, .xh and .xs files
                         so they will be opened with Visual Studio
     Documentation
     ·                   We have added some chapters on how to convert your VO AEF and/or
                         PRG files to a XIDE project and/or a Visual Studio solution.
Changes in 0.2.12
     Scripting
     · We have added the ability to use X# scripts. Some documentation about how this works
       can be found here. You can also find scripting examples in the
       c:\Users\Public\Documents\XSharp\Scripting folder
Compiler
     All dialects
     ·                   The compiler is now based on the Roslyn source code for C# 7.
     ·                   Accesses and Assigns with the same name for the same (partial)
                         class in separate source files are now merged into one property. This
                         will slow down the compiler somewhat. We recommend that you
                         define the ACCESS and ASSIGN in the same source file.
     ·                   Added support for repeated result markers in the preprocessor
     Documentation
     ·                   We have added (generated) topics for all undocumented compiler
                         errors. Some topics only contain the text that is shown by the
                         compiler. More documentation will follow. Also some documentation
                         for the X# Scripting has been added.
Changes in 0.2.11
Compiler
     All dialects
     ·                   Improved some error messages, such as for unterminated strings
     ·                   Added support for the /s (Syntax Check only) command line option
     ·                   Added support for the /parseonly command line option which is used
                         by the intellisense parser
     ·                   Added some compiler errors and warnings for invalid code
     ·                   The preprocessor did not properly handle 4 letter abbreviations for
                         #command and #translate. This has been fixed
     ·                   Fixed some problems found with the preprocessor
     ·                   We switched to a new Antlr parser runtime. This should result in
                         slightly better performance.
     ·                   Changed the way literal characters and strings are defined:
                         o                     In the Vulcan dialect a literal string that is enclosed
                                               with single quotes is a char literal. Double quotes
                                               are string literals
                         o                     In the Core and VO dialect a literal string that is
                                               enclosed with single quotes is a string literal.
                                               Double quotes are also string literals.
                                               To specify a char literal in Core and VO you need
                                               to prefix the literal with a 'c':
     VO/Vulcan Compatibility
     ·                   Added /vo16 compiler option to automatically generate constructors
                         with Clipper calling convention for classes without constructor
          Harbour Compatibilty
          ·                  Started work on the Harbour dialect. This is identical with the
                             VO/Vulcan dialect. The only difference so far is that the IIF()
                             expressions are optional
Visual Studio
          Installer
          ·                  The local template cache and components cache for VS2017 was not
                             cleared properly this has been fixed.
          ·                  Added code to properly unregister an existing CodeDomProvider when
                             installing
          Documentation
          ·                  Several empty chapters are now hidden.
          ·                  Added description of the templates
          Changes in 0.2.10
          This build focuses on the last remaining issues in the VO and Vulcan compatibility and
          adds a lot of new features to the Visual Studio integration.
Compiler
          VO/Vulcan Compatibility
          ·                  We have completed support for the DEFINE keyword. The type clause
                             is now optional. The compiler will figure out the type of the define when
                             no type is specified.
                             The DEFINEs will be compiled to a Constant field of the Functions
                             class, or a Readonly Static field, when the expression cannot be
                             determined at compile time (such as for Literal dates or symbols).
                         This works just like a #xtranslate, with the exception that the define is
                         case sensitive (unless you have enabled the "VO compatible
                         preprocessor" option (/vo8).
                         The only thing that is not working in the preprocessor is the repeated
                         result marker.
     ·                   In VO/Vulcan mode the compiler now accepts "garbage" between
                         keywords such as ENDIF and NEXT and the end of the statement, just
                         like the VO compiler.
                         So you no longer have to remove "comment" tokens after a NEXT or
                         ENDIF. This will compile without changes in the VO and Vulcan
                         dialect:
                              IF X == Y
                                  DoSomething()
                              ENDIF X == Y
                         or
                              FOR I := 1 to 10
                                 DoSomething()
                              NEXT I
                         We do not recommend this coding style, but this kind of code is very
                         common...
     ·                   Fixed an issue with recognition of single quoted strings. These were
                         always recognized as CHAR_CONST when the length of the string
                         was 1. Now they are treated as STRING_CONST and the compiler
                         backend has been adjusted to convert the STRING literals to CHAR
                         literals when needed.
     ·                   In VO and Vulcan dialect when the compiler option /vo1 is used then
                         RETURN statements without value or with a return value of SELF are
                         allowed for the Init() and Axit() methods. Other return values will trigger
                         a compiler warning and will be ignored.
Visual Studio
     ·                   The parser that is used in the Windows Forms editor now also
                         properly handles background images. Both images in the resx for the
                         form and also background images in the shared project resources
     ·                   We have added Nuget support for our project system.
     ·                   We have made several changes to fix problems in project files
                         o                   The project system now silently fixes problems
                                             with duplicate items
                         o                   Fixed a problem with dependencies between
                                             xaml files and their dependent designer.prg files
                                             and other dependent files
                         o                   Fixed a problem with dependent items in sub
                                             folders or in a folder tree that includes a dot in a
                                             folder name.
                         o                   Fixed a problem in the WPF template
     ·                   Fixed a refresh problem when deleting a references node
     ·                   Added implementation of the OAProject.Imports property, which is
                         used by JetBrains
     XPorter
     ·                   Fixed a problem converting WPF style projects
Changes in 0.2.9
     Compiler
     With this build you can compile the Vulcan SDK without changes, except for some
     obvious errors in the Vulcan SDK that Vulcan did not find!
     We consider the Vulcan Compatibility of the compiler finished with the current
     state of the compiler. All Vulcan code should compile without proble now.
VO/Vulcan Compatibility
     Bug fixes
     ·                   Implicit namespaces are now only used when the /ins compiler option
                         is enabled. In Vulcan dialect the namespace Vulcan is always
                         included.
     ·                   Fixed several problems with the @ operator and VOSTRUCT types
     ·                   Fixed a problem with DIM arrays of VOSTRUCT types
     ·                   Fixed a problem with LOGIC values inside VOSTRUCT and UNION
                         types
     ·                   Fixed several problems with the VOStyle _CAST and Conversion
                         operators.
     ·                   Fixed several numeric conversion problems
     ·                   Fixed several problems when mixing NULL, NULL_PTR and
                         NULL_PSZ
     ·                   Fixed several problems with the _CAST operator
     ·                   Fixed several problems with PSZ Comparisons. X# now works just like
                         Vulcan and VO and produces the same (sometimes useless) results
     ·                   Fixed a problem with USUAL array indexes for multi dimensional
                         XBase Arrays
     ·                   Fixed codeblock problems for codeblocks where the last expression
                         was VOID
     ·                   Changed code generation for NULL_SYMBOL
     ·                   Preprocessor #defines were sometimes conflicting with class or
                         namespace names. For example when /vo8 was selected the method
                         System.Diagnostics.Debug.WriteLine() could not be called because
                         the DEBUG define was removing the classname. We have changed
                         the preprocessor so it will no longer replace words immediately before
                         or after a DOT or COLON operator.
     ·                   Fixed a compiler crash when calling static methods in the
                         System.Object class when Late Binding was enabled
     ·                   Fixed String2Psz() problem inside PROPERTY GET and PROPERTY
                         SET
     ·                   And many more changes.
All dialects
          ·                 Indexed access to properties defined with the SELF keyword can now
                            also use the "Index" property name
          ·                 Functions and Procedures inside classes are not allowed (for now)
          ·                 RETURN <LiteralValue> inside an ASSIGN method will no longer
                            allocate a variable and produce an warning
          ·                 Several keywords are now also allowed as Identifier (and will no longer
                            have to be prefixed with @@ ):
                            Delegate, Enum, Event, Field, Func, Instance, Interface,
                            Operator, Proc, Property, Structure, Union, VOStruct and many
                            more
                            As a result the following is now valid code (but not recommended):
                            FUNCTION Start AS VOID
                               LOCAL INTERFACE AS STRING
                               LOCAL OPERATOR AS LONG
                               ? INTERFACE, OPERATOR
                               RETURN
          You can see that the Visual Studio language support also recognizes that INTERFACE
          and OPERATOR are not used as keywords in this context
          Bug fixes
          ·                 Fixed a problem with the REPEAT UNTIL statement
          ·                 Fixed a crash for code with a DO CASE without a matching END
                            CASE
          ·                 Fixed several issues for the code generation for _DLL FUNCTIONs
                            and _DLL PROCEDUREs
          ·                 Fixed a problem (in the Roslyn code) with embedding Native
                            Resources in the Assembly.
          ·                 Fixed a problem with the _OR() and _AND() operators with more than
                            2 arguments.
          ·                 Added support for Pointer dereferencing using the VO/Vulcan Syntax :
                            DWORD(p) => p[1]
          ·                 Fixed several problems with the @ operator
          ·                 When two partial classes had the same name and a different casing
                            the compiler would not properly merge the class definitions.
          ·                 Fixed a crash when a #define in code was the same as a define
                            passed on the commandline
          ·                 Indexed pointer access was not respecting the /AZ compiler option
                            (and always assumed 0 based arrays). This has been fixed
          ·                 Fixed a problem with the caching of preprocessed files, especially files
                            that contain #ifdef constructs.
          ·                 Fixed a problem which could occur when 2 partial classes had the
                            same name but a different case
          ·                 Fixed a compiler crash when a referenced assembly had duplicate
                            namespaces that were only different in Case
          ·                 Fixed problems with Functions that have a [DllImport] attribute.
          ·                 Error messages for ACCESS/ASSIGN methods would sometimes
                            point to a strange location in the source file. This has been fixed.
          ·                 Fixed a problem with Init Procedures that had a STATIC modifier
     Documentation
     · We have added many descriptions to the commandline options
     · We have added a list of the most common compiler errors and warnings.
Changes in 0.2.8
Compiler
     VO/Vulcan Compatibility
     ·                   Default Parameters are now handled like VO and Vulcan do. This
                         means that you can also have date constants, symbolic constants etc
                         as default parameter
     ·                   String Single Equals rules are now 100% identical with Visual Objects.
                         We found one case where Vulcan does not return the same result as
                         Visual Objects. We have chosen to be compatible with VO.
     ·                   When compiling in VO/Vulcan mode then the init procedures in the VO
                         SDK libraries are automatically called. You do not have to call these in
                         your code anymore
                         Also Init procedures in the main assembly are called at startup.
     ·                   The /vo7 compiler option (Implicit casts and conversions) has been
                         implemented. This also includes support to use the @ sign for REF
                         parameters
     ·                   You can now use the DOT operator to access members in
                         VOSTRUCT variables
     ·                   We have fixed several USUAL - Other type conversion problems that
                         required casts in previous builds
          New features
          ·                    We have added support for Collection Initializers and Object Initializers
          ·                    Anonymous type members no longer have to be named. If you select a
                               property as an anonymous type member then the same property
                               name will be used for the anonymous type as well.
          ·                    Missing closing keywords (such as NEXT, ENDIF, ENDCASE and
                               ENDDO) now produce better error messages
          ·                    IIF() Expressions are now also allowed as Expression statement. The
                               generated code will be the same as if an IF statement was used
              We really do not encourage to hide assignments like this, but in case you have used this
              coding style,it works now <g>.
          ·                     AS VOID is now allowed as (the only) type specification for
                                PROCEDUREs
          ·                     We have added a .config file to the exe for the shared compiler that
                                should make it faster
          ·                     The XSharpStdDefs.xh file in the XSharp is now automatically included
                                when compiling. This file declares the CRLF constant for now.
          ·                     Include files are now cached by the compiler. This should increase the
                                compilation speed for projects that depend on large included files,
                                such as the Win32APILibrary header file from Vulcan
          ·                     When a function is found in an external assembly and a function with
                                the same name and arguments is found in the current assembly, then
                                the function in the current assembly is used by the compiler
          ·                     Compiler error messages for missing closing symbols should have
                                been improved
          ·                     Compiler error messages for unexpected tokens have been improved
          Bug fixes
          ·                    Several command-line options with a minus sign were not properly
                               handled by the compiler
          ·              When the # of errors and warnings is larger than the built-in limit of
                         500, then a message will be shown that the error list was truncated
          ·              At the end of the build process a line will be written to the output
                         window with the total # of warnings and errors found
          ·              The colors in the Source Code Editor are now shared with the source
                         code editors for standard languages such as C# and VB
          ·              When you have an inactive code section in your source code,
                         embedded in an #ifdef that evaluates to FALSE then that section will
                         be visibly colored gray and there will be no keyword highlighting. The
                         source code parser for the editor picks up the include files and
                         respects the path settings. Defines in the application properties dialog
                         and the active configuration are not respected yet. That will follow in
                         the next build.
Changes in 0.2.7.1
          Compiler
          ·              The compiler was not accepting wildcard strings for the
                         AssemblyFileVersion Attribute and the AssemblyInformationVersion
                         attribute. This has been fixed
          ·              The #Pragma commands #Pragma Warnings(Push) and #Pragma
                         Warnings(Pop) were not recognized. This has been fixed.
          ·              The compiler was not recognizing expressions like
                         global::System.String.Compare(..). This has been fixed
          Setup
          ·              The installer, exe files and documentation are now signed with a
                         certificate
Changes in 0.2.7
Compiler
     New features:
     ·                   Added support for the VOSTRUCT and UNION types
     ·                   Added support for Types as Numeric values, such as in the construct
                           IF UsualType(uValue) == LONG
     ·                   Added a FIXED statement and FIXED modifier for variables
     ·                   Added support for Interpolated Strings
     ·                   Empty switch labels inside SWITCH statements are now allowed.
                         They can share the implementation with the next label.
                         Error 9024 (EXIT inside SWITCH statement not allowed) has been
                         added and will be thrown if you try to exit out of a loop around the
                         switch statement.
                         This is not allowed.
     ·                   Added support for several /vo compiler options:
                         - vo8 (Compatible preprocessor behavior). This makes the
                         preprocessor defines case insensitive. Also a define with the value
                         FALSE or 0 is seen as 'undefined'
                         - vo9 (Allow missing return statements) compiler option. Missing return
                         values are also allowed when /vo9 is used.
                         Warnings 9025 (Missing RETURN statement) and 9026 (Missing
                         RETURN value) have been added.
                         - vo12 (Clipper Integer divisions)
     ·                   The preprocessor now automatically defines the macros __VO1__
                         until __VO15__ with a value of TRUE or FALSE depending on the
                         setting of the compiler option
     ·                   The FOX version of the compiler is now distributed in Release mode
                         and much faster. A debug version of the compiler is also installed in
                         case it is needed to aid in finding compiler problems.
     Changed behavior
     ·                   The compiler generated Globals class for the Core dialect is now
                         called Functions and no longer Xs$Globals.
     ·                   Overriding functions in VulcanRTFuncs can now be done without
                         specifying the namespace:
                         When the compiler finds two candidate functions and one of them is
                         inside VulcanRTFuncs then the function that is not in VulcanRTFuncs
                         is chosen.
     ·                   Warning 9001 (unsafe modifier implied) is now suppressed for the
                         VO/Vulcan dialect. You MUST pass the /unsafe compiler option if you
                         are compiling unsafe code though!
     ·                   Improved the error messages for the Release mode of the compiler
          Bug fixes
          ·              RETURN and THROW statements inside a Switch statement would
                         generate an 'unreachable code' warning. This has been fixed
          ·              Fixed several problems with mixing signed and unsigned Array Indexes
          ·              Fixed several problems with the FOR .. NEXT statement. The "To"
                         expression will now be evaluated for every iteration of the loop, just like
                         in VO and Vulcan.
          ·              Fixed several compiler crashes
          ·              Fixed a problem with implicit code generation for constructors
          ·              Fixed a visibility problem with static variables inside static functions
          Compiler
          ·              Added alternative syntax for event definition. See EVENT keyword in
                         the documentation
          ·              Added Code Block Support
          ·              Implemented /vo13 (VO compatible string comparisons)
          ·              Added support for /vo4 (VO compatible implicit numeric conversions)
          ·              Aliased expressions are now fully supported
          ·              Fixed a problem with the &= operator
          ·              Fixed several crashes for incorrect source code.
          ·              Fixed several problems related to implicit conversions from/to usual,
                         float and date
          ·              Indexed properties (such as String:Chars) can now be used by name
          ·              Indexed properties can now have overloads with different parameter
                         types
          ·              Added support for indexed ACCESS and ASSIGN
          ·              Fixed a problem when calling Clipper Calling Convention functions
                         and/or methods with a single parameter
          ·              Fixed a crash with defines in the preprocessor
          ·              _CODEBLOCK is now an alias for the CODEBLOCK type
          ·              Fixed a crash for properties defined with parentheses or square
                         brackets, but without actual parameters
     Compiler
     ·                   Fixed a problem that would make PDB files unusable
     ·                   The error "Duplicate define with different value" (9012) has been
                         changed to warning, because our preprocessor does a textual
                         comparison and does not "see" that "10" and "(10)" are equal as well
                         as "0xA" and "0xa". It is your responsibility of course to make sure that
                         the values are indeed the same.
     ·                   Exponential REAL constants were only working with a lower case 'e'.
                         This is now case insensitive
     ·                   Made several changes to the _DLL FUNCTION and _DLL
                         PROCEDURE rules for the parser. Now we correctly recognize the
                         "DLL Hints " (#123) and also allow extensions in these definitions.
                         Ordinals are parsed correctly as well, but produce an error (9018)
                         because the .Net runtime does not support these anymore. Also the
                         Calling convention is now mandatory and the generated IL code
                         includes SetLastError = true and ExactSpelling = true.
     ·                   Fixed a problem with the ~ operator. VO and Vulcan (and therefore X#)
                         use this operator as unary operator and as binary operator.
                         The unary operator does a bitwise negation (Ones complement), and
                         the binary operator does an XOR.
                         This is different than C# where the ~ operator is Bitwise Negation and
                         the ^ operator is an XOR (and our Roslyn backend uses the C# syntax
                         of course).
     Changes in 0.2.5
          ·              Fixed a problem with the Item type for WPF forms, pages and user
                         controls
          ·              The installer now has an option to not take away the association for
                         PRG, VH and PPO items from an installed Vulcan project system.
          ·              Added support for several new item types in the projects
          ·              Added support for nested items
          ·              Added several item templates for WPF, RC, ResX, Settings, Bitmap,
                         Cursor etc.
          Build System
          ·              Added support for the new /vo15 command line switch.
          ·              Added support for compiling native resources.
          Compiler
          ·              A reference to VulcanRT and VulcanRTFuncs is now mandatory when
                         compiling in VO/Vulcan dialect
          ·              Added support for indexed access for VO/Vulcan Arrays
          ·              Added support for VO/Vulcan style Constructor chaining (where
                         SUPER() or SELF() call is not the first call inside the constructor body)
          ·              Added support for the &() macro operator in the VO/Vulcan dialect
          ·              Added support for the FIELD statement in the VO/Vulcan dialect
                         o                    The statement is recognized by the compiler
                         o                    Fields listed in the FIELD statement now take
                                              precedence over local variables or instance
                                              variables with the same name
          ·              Added support for the ALIAS operator (->) in the VO/Vulcan dialect,
                         with the exception of the aliased expressions (AREA->(<Expression>))
          ·              Added support for Late bound code (in the VO/Vulcan dialect)
                         o                    Late bound method calls
                         o                    Late bound property get
                         o                    Late bound property set
                         o                    Late bound delegate invocation
          ·              Added a new /vo15 command line option (Allow untyped Locals and
                         return types):
                         By default in the VO/Vulcan dialect missing types are allowed and
                         replaced with the USUAL type.
                         When you specify /vo15- then untyped locals and return types are not
                         allowed and you must specify them.
                         Of course you can also specify them as USUAL
          ·              The ? and ?? statement are now directly mapped to the appropriate
                         VO/Vulcan runtime function when compiling for the VO/Vulcan dialect
          ·              We now also support the VulcanClassLibrary attribute and
                         VulcanCompilerVersion attribute for the VO & Vulcan dialect.
                         With this support the Vulcan macro compiler and Vulcan Runtime
                         should be able to find our functions and classes
          ·              The generated static class name is now more in par with the class
                         name that Vulcan generates in the VO & Vulcan dialect.
          ·              Added several implicit conversion operations for the USUAL type.
     Documentation
     ·                   Added the XSharp documentation to the Visual Studio Help collection
     ·                   Added reference documentation for the Vulcan Runtime
     Changes in 0.2.4
     Build System
     ·                   Fixed a problem with the /unsafe compiler option
     ·                   Fixed a problem with the /doc compiler option
     ·                   Treat warnings as error was always enabled. This has been fixed.
     Compiler
     ·                   Added support for Lambda expressions with an expression list
          LOCAL dfunc AS System.Func<Double,Double>
          dfunc := {|x| x := x + 10, x^2}
          ? dfunc(2)
     ·                   Added support for Lambda expressions with a statement list
              LOCAL dfunc AS System.Func<Double,Double>
              dfunc :=      {|x|
                                   ? 'square of', x
                                   RETURN x^2
                            }
     ·                   Added support for the NAMEOF intrinsic function
         FUNCTION Test(cFirstName AS STRING) AS VOID
              FUNCTION Test(cFirstName AS STRING) AS VOID
                   IF String.IsNullOrEmpty(cFirstName)
                          THROW ArgumentException{"Empty argument", nameof(cFirstName)}
                   ENDIF
              · Added support for creating methods and functions with Clipper calling convention (VO
                and Vulcan dialect only)
              · Using Statement now can contain a Variable declaration:
                Instead of:
                    VAR ms := System.IO.MemoryStream{}
                       BEGIN USING ms
                     // do the work
                   END USING
              You can now write
                   BEGIN USING VAR ms := System.IO.MemoryStream{}
                          // do the work
                   END USING
          ·                    Added support for /vo10 (Compatible IIF behavior). In the VO and
                               Vulcan dialect the expressions are cast to USUAL. In the core dialect
                               the expressions are cast to OBJECT.
Changes in 0.2.3
     Build System
     ·                   Added support for several new commandline options, such as /dialect
     ·                   The commandline options were not reset properly when running the
                         shared compiler. This has been fixed.
     ·                   The build system will limit the # of errors passed to Visual Studio to
                         max. 500 per project. The commandline compiler will still show all
                         errors.
     Compiler
     ·                   We have started work on the Bring Your Own Runtime support for
                         Vulcan. See separate heading below.
     ·                   The __SIG__ and __ENTITY__ macros are now also supported, as
                         well as the __WINDIR__, __SYSDIR__ and __WINDRIVE__ macros
     ·                   The debugger instructions have been improved. You should have a
                         much better debugging experience with this build
     ·                   Several errors that indicated that there are visibility differences
                         between types and method arguments, return types or property types
                         have been changed into warnings. Of course you should consider to
                         fix these problems in your code.
     ·                   The #Error and #warning preprocessor command no longer require
                         the argument to be a string
     ·                   The SLen() function call is now inlined by the compiler (just like in
                         Vulcan)
     ·                   The AltD() function will insert a call to
                         "System.Diagnostics.Debugger.Break" within a IF
                         System.Diagnostics.Debugger.IsAttached check
     ·                   Several compiler crashes have been fixed
     ·                   Added support for the PARAMS keyword for method and function
                         parameters.
     ·                   Fixed a problem for the DYNAMIC type.
     BYOR
     ·                   XBase type names are resolved properly (ARRAY, DATE, SYMBOL,
                         USUAL etc)
     ·                   Literal values are now resolved properly (ARRAY, DATE, SYMBOL)
     ·                   NULL_ literals are resolved properly (NULL_STRING follows the /vo2
                         compiler option, NULL_DATE, NULL_SYMBOL)
     ·                   The /vo14 compiler option (Float literals) has been implemented
     ·                   The compiler automatically inserts a "Using Vulcan" and "using static
                         VulcanRtFuncs.Functions" in each program
     ·                   You MUST add a reference to the VulcanRTFuncs and VulcanRT
                         assembly to your project. This may be a Vulcan 3 and also a Vulcan 4
Changes in 0.2.2
          Compiler
          ·              We have added a first version of the preprocessor. This
                         preprocessor supports the #define command, #ifdef, #ifndef, #else,
                         #endif, #include, #error and #warning. #command and #translate (to
                         add user defined commands) are not supported yet.
          ·              Missing types (in parameter lists, field definitions etc) were sometimes
                         producing unclear error messages. We have changed the compiler to
                         produce a "Missing Type" error message.
          ·              We rolled the underlying Roslyn code forward to VS 2015 Update 1.
                         Not that you see much of this from the outside <g>, but several fixes
                         and enhancements have made their way into the compiler.
          ·              Added a YIELD EXIT statement (You can also use YIELD BREAK).
          ·              Added an (optional) OVERRIDE keyword which can be used as
                         modifier on virtual methods which are overridden in a subclass.
          ·              Added a NOP keyword which you can use in code which is
                         intentionally empty (for example the otherwise branch of a case
                         statement. The compiler will no longer warn about an empty block
                         when you insert a NOP keyword there.
     ·                   The On and Off keywords could cause problems, because they were
                         not positional (these are part of the pragma statement). This has been
                         fixed.
     ·                   _AND() and _OR() expressions with one argument now throw a
                         compiler error.
     ·                   The compiler now recognizes the /VO14 (store literals as float)
                         compiler switch (it has not been implemented yet).
     ·                   Added a ** operator as alias for the ^ (Exponent) operator.
     ·                   Added an "unsupported" error when using the Minus operator on
                         strings.
     ·                   Fixed a "Stack overflow" error in the compiler that could occur for very
                         long expressions.
     ·                   The right shift operator no longer conflicts with two Greater Than
                         operators, which allows you to declare or create generics without
                         having to put a space between them.
                         (var x := List<Tuple<int,int>>{}
Changes in 0.2.1
     Compiler
     ·                   Several errors have been demoted to warnings to be more compatible
                         with VO/Vulcan
     ·                   Added support for Comment lines that start with an asterisk
     ·                   Added support for the DEFINE statement. For now the DEFINE
                         statement MUST have a type
                         DEFINE WM_USER := 0x0400 AS DWORD
     ·                   Fixed problem with Single Line Properties with GET and SET reversed
     ·                   Several fixes for Virtual and Non virtual methods in combination with
                         the /VO3 compatibility option
     Changes in 0.1.7
     ·                   The "ns" (add default namespace to classes without namespace) has
                         been implemented
     ·                   The "vo3" compiler option (to make all methods virtual ) has been
                         implemented
     ·                   Fixed an issue where the send operator on an expression between
                         parentheses was not compiling properly
     ·                   Relational operators for strings (>, >=, <, <=) are now supported. They
                         are implemented using the String.Compare() method.
          ·              Fixed a problem with local variables declared on the start line from
                         FOR .. NEXT statements
          ·              Added first version of the documentation in CHM & PDF format
          ·              Added several properties to the Visual Studio Project properties dialog
                         to allow setting the new compiler options
          ·              Fixed a problem in the Targets files used by MsBuild because some
                         standard macros such as $(TargetPath) were not working properly
          ·              XIDE 0.1.7 is included. This version of XIDE is completely compiled
                         with XSharp !
          ·              The name of some of the MsBuild support files have changed. This
                         may lead to problems loading a VS project if you have used the VS
                         support from the previous build. If that is the case then please edit the
                         xsproj file inside Visual Studio and replace all references of
                         "XSharpProject" with "XSharp" . Then safe the xsproj file and try to
                         reload the project again
          ·              The WHILE.. ENDDO (a DO WHILE without the leading DO) is now
                         recognized properly
          Changes in 0.1.6
          ·              This version now comes with an installer
          ·              This version includes a first version of the Visual Studio Integration.
                         You can edit, build, run and debug inside Visual Studio. There is no
                         "intellisense" available.
          ·              The compiler now uses 1-based arrays and the “az” compiler option
                         has been implemented to switch the compiler to use 0-based arrays.
          ·              The "vo2" compiler option (to initialize string variables with
                         String.Empty) has been implemented
          ·              Please note that there is no option in the VS project properties dialog
                         yet for the az and vo2 compiler options. You can use the "additional
                         compiler options" option to specify these compiler options.
          ·              The text "this" and "base" in error messages has been changed to
                         "SELF" and "SUPER"
          ·              Error of type “visibility” (for example public properties that expose
                         private or internal types) have been changed to warnings
          ·              Fixed a problem with TRY … ENDTRY statements without CATCH
                         clause
          ·              The compiler now has a better resolution for functions that reside in
                         other (X#) assemblies
          ·              Fixed a problem which could lead to an "ambiguous operator"
                         message when mixing different numeric types.
          Changes in 0.1.5
          ·              When an error occurs in the parsing stage, X# no longer enters the
                         following stages of the compiler to prevent crashes. In addition to the
                         errors from the parser also an error 9002 is displayed.
          ·              Parser errors now also include the source file name in the error
                         message and have the same format as other error messages. Please
                         note that we are not finished yet with handling these error messages.
     Changes in 0.1.4
     ·                   Several changes to allow calculations with integers and enums
     ·                   Several changes to allow VO compatible _OR, _AND, _NOT an _XOR
                         operations
     ·                   Fix interface/abstract VO properties
     ·                   Insert an implicit “USING System” only if not explicitly declared
     ·                   Error 542 turned to warning (members cannot have the same name
                         as their enclosing type)
     ·                   Changes in the .XOR. expression definition
     ·                   Fix double quote in CHAR_CONST lexer rule
     ·                   Allow namespace declaration in class/struct/etc. name (CLASS
                         Foo.Bar)
     ·                   Fix access/assign crash where identifier name was a (positional)
                         keword: ACCESS Value
     ·                   Preprocessor keywords were not recognized after spaces, but only at
                         the start of the line. This has been fixed.
     ·                   Prevent property GET SET from being parsed as expression body
     ·                   Fix default visibility for interface event
     ·                   Unsafe errors become warnings with /unsafe option, PTR is void*
     ·                   Fix dim array field declaration
     ·                   Initial support of VO cast and VO Conversion rules (TYPE(_CAST,
                         Expression) and TYPE(Expression)). _CAST is always unchecked
                         (LONG(_CAST, dwValue)) and convert follows the
                         checked/unchecked rules (LONG(dwValue))
     ·                   Fixed problem with codeblock with empty parameter list
     ·                   Fixed problems with GlobalAttributes.
     ·                   An AUTO property without GET SET now automatically adds a GET
                         and SET block
     ·                   Allow implicit constant double-to-single conversion
     Changes in 0.1.3
     ·                   Change inconsistent field accessibility error to warning and other
                         similar errors
     ·                   Added commandline support for Vulcan arguments. These arguments
                         no longer result in an error message, but are not really implemented,
                         unless an equivalent argument exists for the Roslyn (C#) compiler. For
                         example: /ovf and /fovf are both mapped to /checked, /wx is mapped to
                         /warnaserror. /w should not be used because that has a different
                         meaning /warning level). /nowarn:nnnn should be used in stead
          Changes in 0.1.2.1
          ·              Added default expression
          ·              Fixed problem with events
          ·              Fixed some small lexer problems
          ·              Fixed problem with _DLL FUNCTION and _DLL PROCEDURE
          Changes in 0.1.2
          ·              Fixed problem with handling escape sequences in extended strings
          ·              Fixed issue in FOR.. NEXT statements
          ·              Fixed a problem with SWITCH statements
          ·              Fixed a problem with the sizeof() operator
          ·              Fixed a problem in the REPEAT .. UNTIL statement
          ·              Fixed a problem in TRY .. CATCH .. FINALLY .. END TRY statements.
          ·              Fixed issue in Conditional Access Expression ( Expr ? Expr)
          ·              Allow bound member access of name with type args
          ·              Fixed problem in LOCAL statement with multiple locals
          ·              Fixed a problem when compiling with debug info for methods without a
                         body
          ·              Optimized the Lexer. This should increase the compile speed a lot
          ·              Fixed a problem in the code that reports that a feature is not supported
                         yet
          ·              Fixed a problem when defining Generic types with a STRUCTURE
                         constraint
          ·              Compilere macros (__ENTITY__, __LINE__ etc) were causing a
                         crash. For now the compiler inserts a literal string with the name of the
                         macro.
          ·              Build 0.1.1 did not contain XSC.RSP
          ·              Fixed a problem where identifiers were not recognized when they were
                         matching a (new) keyword
1.1.2   Dialects
        The X# compiler can run in different dialects. The table below shows the differences
        between these dialects.
        You can use the /dialect compiler option to select the dialect that you want to use. The
        Core dialect is default.
          VO and Vulcan support is available in this build of XSharp through what we call the Bring
          Your Own Runtime principle.
          If you own a license of Vulcan, you can copy the DLLs that you find in the <Vulcan.NET
          BaseFolder>\Redist\4.0 folder to a folder that is inside your solution.
          Then add references to the DLLs that you need in your project.
DLLs you MUST add if you compile for the VO/Vulcan dialect:
          · VulcanRT.DLL
          · VulcanRTFuncs.DLL
          These 2 files are NEVER added to your Vulcan projects, Vulcan adds a reference to these
          DLLs automatically. XSharp does not do that, so you should add them yourself.
          DLLs that you MAY want to add, depending on what you are using in your
          application:
          ·   VulcanVOSystemClasses.dll
          ·   VulcanVORDDClasses.dll
          ·   VulcanVOGUIClasses.dll
          ·   VulcanVOInternetClasses.dll
          ·   VulcanVOSQLClasses.dll
          ·   VulcanVOConsoleClasses.dll
          ·   VulcanVOWin32APILibrary.dll
          DLLs that you normally do NOT add to your project (these are handled
          automatically by the Vulcan Runtime)
          · VulcanRDD.DLL
          · VulcanMacroCompiler.DLL
          · VulcanDBFCDX.dll
· VulcanDBFFPT.dll
        Compiler
        ·                   Some VO compatibility compiler options are not implemented yet. The
                            command line options are recognized but nothing is done with them
                            /cs: Case Sensitivity (the compiler is now always Case Insensitive)
                            /vo 11: VO Compatible Numeric conversions
        ·                   The compiler pragmas (#pragma warnings and #pragma options) do
                            not work. They are ignored by the compiler.
        ·                   Some parser errors need improvements
        ·                   Compiler errors may be cryptic every now and then
        ·                   The compiler is case insensitive. There may be a problem with case
                            insensitive matching of interface member names. The case
                            insensitivity cannot be switched off for now.
                            We have also seen problems for classes where different member
                            names are defined with a name that is only different in case.
        ·                   Sometimes you may see a "Include file not found" error, where the file
                            DOES exist. This seems to be a side effect of the codepage that was
                            used to save the include files.
                            When you save the file as UTF8 (File Advanced Save Options in Visual
                            Studio) then this problem almost always disappears.
        Visual Studio
        ·                   New features in the Debugger, such as a window for Globals and RDD
                            Workareas
        VO Xporter
        ·                   DbServer and Fieldspec binaries are not exported yet
        Runtime
        ·                   Some runtime functions are not supported yet.
1.1.5   Installation
        When you install XSharp you will find the following folders on your machine.
Folder Contents
        Registry
        The installer will also write some changes to the registry:
        · HKLM\Software\XSharp
        · HKLM\Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\XSharp
        · HKCR\.ppo
        · HKCR\.prg
        · HKCR\.prgx
        · HKCR\.vh
        · HKCR\.xh
        · HKCR\.xs
        · HKCR\.xsproj
        · HKCR\XSharpScript
        · HKCR\XSharp.headerfile
        · HKCR\XSharp.ppofile
        · HKCR\XSharp.sourcefile
        Below is a list of some of the most visible new language features in the Core language of
        X#, compared to Visual Objects and Vulcan.
        As you can see many new keywords were introduced, but these are positional: they will
        also be recognized as Identifiers on other places, so there is very little chance that you will
        have to make changes to avoid naming conflicts.
         FEATURE                                           Description
                                                            The VO Define is back again in X#. It
            DEFINE <id> := <Expression>                     will be compiled into a constant of the
                                                            Globals class, the same class in which
                                                            all Functions and Methods are
                                                            implemented. The biggest advantage of
                                                            a DEFINE over the preprocessor
                                                            DEFINEs in Vulcan.NET is that there is
                                                            no longer a chance that a DEFINE with
                                                            the same name as a Method, Property
                                                            or Variable will lead to
                                                            incomprehensible compiler errors.
           FEATURE                      Description
                                        The STATIC modifier for USING (note
               USING STATIC <Name>      that the # sign is no longer needed)
                                        allows you to name a static class.
                                        When you do so you can then use the
                                        methods of this class as functions. For
                                        example:
                                           USING STATIC System.Console
                                           FUNCTION Start as VOID
                                              WriteLine("X# is cool!")
                                           RETURN
x := CHECKED(y)
FEATURE Description
x := UNCHECKED(y)
           FEATURE                                        Description
                                                          Tells the compiler to generate code that
               y := CHECKED(x)                            checks for overflow
              USING System.Windows.Forms
              FUNCTION Start() AS VOID
                 TestAnonymous()
                 RETURN
          In this case the object will have the properties ID, Name and OrderCount (all explicitely
          given)
          If you select named properties from another object you can omit the <Name> := part. In
          that case the compiler will simply use the same name:
          In this case the anonymous class will have the properties CustomerID, CustomerName
          (inherited from C) and OrderCount (explicitely given)
          Anonymous types contain one or more public read-only properties. No other kinds of class
          members, such as methods or events, are valid.
          The expression that is used to initialize a property cannot be null, an anonymous function,
          or a pointer type.
          The most common scenario is to initialize an anonymous type with properties from
          another type. In the following example, assume that a class exists that is named Product.
          Class Product includes Color and Price properties, together with other properties that you
          are not interested in. Variable products is a collection of Product objects. The anonymous
          type declaration starts with the new keyword. The declaration initializes a new type that
          uses only two properties from Product. This causes a smaller amount of data to be
          returned in the query.
          If you do not specify member names in the anonymous type, the compiler gives the
          anonymous type members the same name as the property being used to initialize them.
          You must provide a name for a property that is being initialized with an expression, as
          shown in the previous example. In the following example, the names of the properties of
          the anonymous type are Color and Price.
              var productQuery := ;
                  from prod in products ;
                  select CLASS { prod:Color, prod:Price }
          Typically, when you use an anonymous type to initialize a variable, you declare the
          variable as an implicitly typed local variable by using var. The type name cannot be
          specified in the variable declaration because only the compiler has access to the
          underlying name of the anonymous type.
          Remarks
          Anonymous types are class types that derive directly from object, and that cannot be cast
          to any type except object. The compiler provides a name for each anonymous type,
          although your application cannot access it. From the perspective of the common language
          runtime, an anonymous type is no different from any other reference type.
          You cannot declare a field, a property, an event, or the return type of a method as having
          an anonymous type. Similarly, you cannot declare a formal parameter of a method,
          property, constructor, or indexer as having an anonymous type. To pass an anonymous
          type, or a collection that contains anonymous types, as an argument to a method, you can
          declare the parameter as type object. However, doing this defeats the purpose of strong
          typing. If you must store query results or pass them outside the method boundary,
          consider using an ordinary named struct or class instead of an anonymous type.
          Because the Equals and GetHashCode methods on anonymous types are defined in
          terms of the Equals and GetHashCode methods of the properties, two instances of the
          same anonymous type are equal only if all their properties are equal.
1.1.6.3   ASTYPE
          We have added a new keyword that allows you to cast a value to a type with type, just like
          the C# "as" keyword:
             //
             // This example shows that you can call an async task and wait for it to
             finish
             // The result of the async task (in this case the size of the file that has
             been downloaded)
             // will be come available when the task has finished
             // The calling code (The Start()) function will not have to wait until the
             async task has
             // finished. That is why the line "2....." will be printed before the
             results from TestClass.DoTest()
             // The sample also shows an event and displays the thread id's. You can see
             that the DownloadFileTaskAsync() method
             // starts multiple threads to download the web document in multiple pieces.
             USING System
             USING System.Threading.Tasks
             CLASS TestClass
                STATIC PROTECT oLock AS OBJECT          // To make sure we synchronize the
             writing to the screen
                STATIC CONSTRUCTOR
                   oLock := OBJECT{}
                      AWAIT
              webClient:DownloadFileTaskAsync("http://www.xsharp.info/index.php",
              FileName)
                      VAR dirInfo      :=
              System.IO.DirectoryInfo{System.IO.Path.GetTempPath()}
                      VAR Files        := dirInfo:GetFiles("temp.txt")
                      IF Files:Length > 0
                       System.IO.File.Delete(FileName)
                          RETURN Files[1]:Length
                      ENDIF
                      RETURN 0
END CLASS
                  d := UInt32.MaxValue
                  ? "Initial value of d:", d
                  BEGIN UNCHECKED
                     // arithmetic operations inside an UNCHECKED block will not produce
                     // overflow exceptions on arithmetic conversions and operations,
                     // no matter if overflow checking is enabled application-wide or not
                     n := (INT)d
                     ? "Value of n after conversion:", n
                     d ++
                     ? "Value of d after increasing it:", d
                  END UNCHECKED
                  d := UInt32.MaxValue
                  BEGIN CHECKED
                     // arithmetic operations inside a CHECKED block always do
                     // overflow checking and throw exceptions if overflow is detected
                     TRY
                        n := (INT)d
                        d ++
                     CATCH e AS Exception
                        ? "Exception thrown in CHECKED operation:", e:Message
                     END TRY
                  END CHECKED
                  Console.ReadLine()
RETURN
          As you can see the BEGIN FIXED statement requires a local variable declaration. The
          contents of this local (in the example above a CHAR PTR) will be excluded from garbage
          collection inside the block.
          Please note:
          The FIXED keyword and the example above should be used with extreme care. Strings in
          .Net are immutable. You normally should not manipulate strings this way !
                d := UInt32.MaxValue
                ? "Initial value of d:", d
                BEGIN UNCHECKED
                   // arithmetic operations inside an UNCHECKED block will not produce
                   // overflow exceptions on arithmetic conversions and operations,
                   // no matter if overflow checking is enabled application-wide or not
                   n := (INT)d
                   ? "Value of n after conversion:", n
                   d ++
                   ? "Value of d after increasing it:", d
                END UNCHECKED
                d := UInt32.MaxValue
                BEGIN CHECKED
                   // arithmetic operations inside a CHECKED block always do
                   // overflow checking and throw exceptions if overflow is detected
                   TRY
                      n := (INT)d
                       d ++
                    CATCH e AS Exception
                       ? "Exception thrown in CHECKED operation:", e:Message
                    END TRY
                 END CHECKED
                 Console.ReadLine()
              RETURN
              //
              // XSharp allows you to not only use the using statement to link to
              namespaces
              // You can also link to a static class and call the methods in this class as
              if they are functions.
              // The functions WriteLine and ReadKey() in the following code are actually
              resolved as System.Console.WriteLine()
              // and System.Console.ReadKey()
              // Finally there is also the BEGIN USING .. END USING construct which
              controls the lifetime of a variable
              // At the end of the block the Variable will be automatically disposed.
              USING System
              USING STATIC System.Console
END CLASS
             USING   System
             USING   System.Collections.Generic
             USING   System.Linq
             USING   System.Text
                   Console.WriteLine("Object Initializer")
                   VAR oPerson := Person{}{FirstName := "John", LastName := "Smith"}
                   ? oPerson:Name
                   Console.ReadLine()
                   // Combine the two
                   Var oPeople := List<Person> {} {;
                                              Person{}{FirstName := "John", LastName :=
             "Smith"}, ;
                                              Person{}{FirstName := "Jane", LastName :=
             "Doe"} ;
                                           }
                   Console.WriteLine("Collection and Object Initializers")
              //
              // This example shows various new expression formats
              //
              using System.Collections.Generic
              CLASS Person
                 EXPORT FirstName   AS STRING
END CLASS
            /*
            Stack Example - Written by Robert van der Hulst
            This example shows that we can now create generic classes with X# !
            Note: Compile with the /AZ option
            */
            USING System.Collections.Generic
            USING STATIC System.Console
                  ReadLine()
                  RETURN
                  CONSTRUCTOR()
                     SELF(100)
                  CONSTRUCTOR(nCapacity AS INT)
                     _Capacity := nCapacity
                     _Items := T[]{nCapacity}
                     _Size := 0
                     RETURN
              //
              // This example shows various new expression formats
              //
              using System.Collections.Generic
           CLASS Person
              EXPORT FirstName   AS STRING
              EXPORT LastName      as STRING
              EXPORT Parent      as Person
              CONSTRUCTOR(First as STRING, Last as STRING)
                 FirstName   := First
                 LastName   := Last
END CLASS
              ADD
                  <Statements>
              END [ADD]
              REMOVE
                  <Statements>
              END [REMOVE]
              END [EVENT]
Example
              USING System.Collections.Generic
              FUNCTION Start AS VOID
                  LOCAL e AS EventsExample
                  e := EventsExample{}
                  e:Event1 += TestClass.DelegateMethod
                  e:Event1 += TestClass.DelegateMethod
                  e:Event1 -= TestClass.DelegateMethod    // added 2, removed 1, should be
              called once
                  e:Event2 += TestClass.DelegateMethod
                  e:Event2 += TestClass.DelegateMethod
                  e:Event2 -= TestClass.DelegateMethod // added 2, removed 1, should be
              called once
                  e:Event3 += TestClass.DelegateMethod
                  e:RaiseEvent1("This is a test through a multi line event definition")
                  e:RaiseEvent2("This is a test through a single line event definition")
                  e:RaiseEvent3("This is a test through an old style event definition")
                  Console.WriteLine("Press a Key")
                  Console.ReadLine()
              CLASS TestClass
                  STATIC METHOD DelegateMethod(s AS STRING ) AS VOID
                      Console.WriteLine( s)
              END CLASS
     CLASS EventsExample
         PRIVATE eventsTable AS Dictionary<STRING, System.Delegate>
         PRIVATE CONST sEvent1 := "Event1" AS STRING
         PRIVATE CONST sEvent2 := "Event2" AS STRING
         CONSTRUCTOR()
             eventsTable := Dictionary<STRING, System.Delegate>{}
             eventsTable:Add(sEvent1,NULL_OBJECT)
             eventsTable:Add(sEvent2,NULL_OBJECT)
         // Multiline definition
         EVENT Event1 AS EventHandler
             ADD
                 BEGIN LOCK eventsTable
                     eventsTable[sEvent1] := ((EventHandler)
     eventsTable[sEvent1]) + value
                 END LOCK
                 Console.WriteLine(__ENTITY__ + " "+value:ToString())
             END
             REMOVE
                 BEGIN LOCK eventsTable
                     eventsTable[sEvent1] := ((EventHandler)
     eventsTable[sEvent1]) - value
                 END LOCK
                 Console.WriteLine(__ENTITY__+ " "+value:ToString())
             END
         END EVENT
         // Single Line defintion on multilpe lines with semi colons, for better
     reading !
         EVENT Event2 AS EventHandler ;
             ADD     eventsTable[sEvent2] := ((EventHandler)
     eventsTable[sEvent2]) + value ;
             REMOVE eventsTable[sEvent2] := ((EventHandler)
     eventsTable[sEvent2]) - value
              //
              // This example shows various new expression formats
              //
              using System.Collections.Generic
              CLASS Person
                 EXPORT FirstName   AS STRING
                 EXPORT LastName      as STRING
                 EXPORT Parent      as Person
                 CONSTRUCTOR(First as STRING, Last as STRING)
                    FirstName   := First
                    LastName   := Last
END CLASS
RETURN NULL_OBJECT
1.1.6.16 Initializers
             USING   System
             USING   System.Collections.Generic
             USING   System.Linq
             USING   System.Text
                   Console.WriteLine("Object Initializer")
                   VAR oPerson := Person{}{FirstName := "John", LastName := "Smith"}
                   ? oPerson:Name
                   Console.ReadLine()
                   // Combine the two
                   Var oPeople := List<Person> {} {;
                                              Person{}{FirstName := "John", LastName :=
             "Smith"}, ;
                                              Person{}{FirstName := "Jane", LastName :=
             "Doe"} ;
                                           }
                   Console.WriteLine("Collection and Object Initializers")
          Notes
          The expression parsing inside the interpolated strings recognizes:
          · SELF:
          · Local variables, Member variables and Properties with SELF: prefix and without this
            prefix
          · Other expressions must be in C# syntax for now, using the dot (.) operator as send
            operator.
          The expression elements inside the string can use formatting notation just like the
          String.Format() notation. For example:
            USING System.Collections.Generic
            USING System.Linq
            USING STATIC System.Console
              CLASS Developer
                 PROPERTY Name        AS STRING GET FirstName + " " + LastName
                 PROPERTY FirstName     AS STRING AUTO
                 PROPERTY LastName     AS STRING AUTO
                 PROPERTY Country     AS STRING AUTO
              END CLASS
              CLASS Country
                 PROPERTY Name         AS STRING AUTO
                 PROPERTY Region      AS STRING AUTO
              END CLASS
1.1.6.19 NOP
         The NOP keyword allows you to define a line of code that does nothing but satisfies the
         compiler, so it will not complain about missing code.
             USING   System
             USING   System.Collections.Generic
             USING   System.Linq
             USING   System.Text
                    Console.WriteLine("Object Initializer")
                    VAR oPerson := Person{}{FirstName := "John", LastName := "Smith"}
                    ? oPerson:Name
                    Console.ReadLine()
                    // Combine the two
                    Var oPeople := List<Person> {} {;
                                               Person{}{FirstName := "John", LastName :=
              "Smith"}, ;
                                               Person{}{FirstName := "Jane", LastName :=
              "Doe"} ;
                                            }
                    Console.WriteLine("Collection and Object Initializers")
1.1.6.21 SWITCH
              //
              // The SWITCH statement is a replacement for the DO CASE statement
              // The biggest difference is that the expression (in this case sDeveloper)
              is only evaluated once.
              // which will have a performance benefit over the DO CASE statement
              // Empty statement lists for a CASE are allowed. In that case the labels
              share the code (see CHRIS and NIKOS below)
              //
              // Please note that EXIT statements inside a switch are not allowed, however
              RETURN, LOOP and THROW are allowed.
              using System.Collections.Generic
                    END SWITCH
                 NEXT
                   Console.ReadKey()
                 RETURN
1.1.6.22 USING
           //
           // XSharp allows you to not only use the using statement to link to
           namespaces
           // You can also link to a static class and call the methods in this class as
           if they are functions.
           // The functions WriteLine and ReadKey() in the following code are actually
           resolved as System.Console.WriteLine()
           // and System.Console.ReadKey()
           // Finally there is also the BEGIN USING .. END USING construct which
           controls the lifetime of a variable
           // At the end of the block the Variable will be automatically disposed.
           USING System
           USING STATIC System.Console
END CLASS
1.1.6.23 VAR
              //
              // The VAR keyword has been added to the language because in many situations
              // the result of an expression will be directly assigned to a local, and the
              expression
              // will already describe the type of the variable
              // VAR is a synonym for LOCAL IMPLIED in Vulcan
              using System.Collections.Generic
Console.ReadLine()
RETURN
1.1.6.24 YIELD
using System.Collections.Generic
              // The Yield return statement allows you to create code that returns a
              // collection of values without having to create the collection in memory
              first.
              // The compiler will create code that "remembers" where you were inside the
              // loop and returns to that spot.
              FUNCTION Start AS VOID
                 FOREACH nYear AS INT IN GetAllLeapYears(1896, 2040)
                    ? "Year", nYear, "is a leap year."
                 NEXT
                 Console.ReadLine()
              RETURN
            CLASS Developer
               class var list    as array      // class vars are like static variables.
               class VAR nextid as int
               class var random as Random
            PROTECTED:
               VAR id as int NOSAVE           // the Nosave clause will mark the field
            with the [NonSerialized] attribute
            EXPORTED:
               VAR FirstName     as string
               VAR LastName      as string
               VAR Country       as string
               // The inline prefix in the next line is needed when declaring a method
            inside the class .. endclass block.
               INLINE METHOD initClass()      // The XBase++ equivalent of the Static
            constructor
                  list := {}
                  nextid := 1
                  random := Random{}
                  RETURN
                 // SYNC method makes sure that only one thread can run this code at the
              same time
                 SYNC METHOD LivesIn
                 // ACCESS indicates a PROPERTY GET
                 // ASSIGN indicates a PROPERTY SET
                 ACCESS CLASS METHOD Length as dword
                 ACCESS METHOD Age as int
              ENDCLASS
              // This is the implementation of the AGE Property. ACCESS does not have to
              be repeated here
              METHOD Age() as int
                 local nAge as int
                 nAge := random:@@Next(25,60)
                 return nAge
              // This is the implementation of the Length Property. ACCESS does not have
              to be repeated. CLASS however must be specified.
              CLASS METHOD Length as dwor
                 return ALen(list)
1.1.7    Licensing
         XSharp is FREE Software. Of course that does not mean that you can do with it whatever
         you want. We have set a couple of rules that determine what you can and cannot do with
         our software, so our software is released under a license.
         In an ideal world we would have published all of our source code and binaries under a very
         open license agreement, such as the Apache License, just like how the Roslyn code is
         published.
         However the reality is that there are people on this world that would like to take our source
         code and binaries and release this with minimal changes under their own name.
         To prevent that from happening we have been forced to set some limitations to how you
         can use our product.
         For any "normal" developer that uses XSharp to develop applications for end users this
         should present no problems.
         The simplified version of the limitations means that :
         · You can only redistribute the 'runtime' components that are listed in the documentation.
           You can not redistribute our compiler. However when needed, you can ask your
           customer to download our compiler from this website
         · You (when you are a FOX subscriber) have access to the compiler source code and
           may change and rebuild the compiler for internal use inside your company. However you
           are not allowed to publish or redistribute the (changed) compiler to your customers
         We are convinced that you will find our license agreements fair and easy to work with.
         If you have any questions about the licenses, please contact us at info@xsharp.eu
Preamble:
1. Parties.
          The parties to this Agreement are you, the licensee ("You") and
          XSharp. If You are not acting on behalf of yourself as an
          individual, then "You" means your company or organization. A company
          or organization shall in either case mean a single business entity,
          and shall not include its affiliates or wholly owned subsidiaries.
2. The software.
          b.    You may: (i) copy the Software for archival purposes, (ii) copy
          the Software for personal use purposes, (iii) use, copy, and
          distribute the Software solely for your organization's internal use
          and or business operation purposes including copying the Software to
          other workstations inside Your organization. Any copy must contain
          the original Software's proprietary notices in unaltered form.
4. Restrictions.
      b.     You may not distribute the Software via OEM Distribution (as
      defined below) without entering into a separate OEM Distribution
      Agreement with XSharp. "OEM Distribution" means permitting others
      outside Your organization to use the Software, distribution and/or
      use of the Software as either a bundled add-on to, or embedded
      component of, another application, with such application being made
      available to its users as, but not limited to, an on-premises
      application, a hosted application, a Software-as-a-Service offering
      or a subscription service for which the distributor of the
      application receives a license fee or any form of direct or indirect
      compensation. Except as expressly provided herein, you may not:
      ii.   redistribute:
            1. the Software as a whole whether as a wrapped application or
      on a stand-alone basis, or
            2. parts of the Software to create a language distribution, or
            3. the XSharp components with Your Wrapped Application.
      The exception to this rule are the components of the software that
      are explicitly listed in the documentation as “redistributable
      files”. These files are also copied by the installation process of
      the Software into to a separate folder with the name “Redist” under
      the Software’s installation folder.
5. Ownership.
      XSharp and its suppliers own the Software and all intellectual
      property rights embodied therein, including copyrights and valuable
      trade secrets embodied in the Software's design and coding
      methodology. The Software is protected by the copyright laws from
      The Netherlands and international treaty provisions. This Agreement
6. Infringement Indemnification.
7. Limited Warranty.
8. Local Law.
9. Limitation of Liability.
          You agree to comply with all export laws and restrictions and
          regulations of The Netherlands, The European Union or foreign
          agencies or authorities, and not to export or re-export the Software
          or any direct product thereof in violation of any such restrictions,
          laws or regulations, or without all necessary approvals. As
          applicable, each party shall obtain and bear all expenses relating
          to any necessary licenses and/or exemptions with respect to its own
          export of the Software from The Netherlands or the European Union.
11. Severability.
13. Assignment.
1.1.7.2   Apache 2
          Both the source code to the public elements of X# and to Roslyn are published under the
          Apache 2.0 license.
          You can find the public source code on Github in the XSharpPublic repository :
          https://github.com/X-Sharp/XSharpPublic
          The full text of this license is:
           Apache License
            Version 2.0, January 2004
            http://www.apache.org/licenses/
1. Definitions.
           "License" shall mean the terms and conditions for use, reproduction,
           and distribution as defined by Sections 1 through 9 of this document.
           "Legal Entity" shall mean the union of the acting entity and all
           other entities that control, are controlled by, or are under common
           control with that entity. For the purposes of this definition,
           "control" means (i) the power, direct or indirect, to cause the
           direction or management of such entity, whether by contract or
           otherwise, or (ii) ownership of fifty percent (50%) or more of the
           outstanding shares, or (iii) beneficial ownership of such entity.
           "Source" form shall mean the preferred form for making modifications,
           including but not limited to software source code, documentation
           source, and configuration files.
      (b) You must cause any modified files to carry prominent notices
      stating that You changed the files; and
      (c) You must retain, in the Source form of any Derivative Works
      that You distribute, all copyright, patent, trademark, and
      attribution notices from the Source form of the Work,
      excluding those notices that do not pertain to any part of
      the Derivative Works; and
           You may add Your own copyright statement to Your modifications and
           may provide additional or different license terms and conditions
           for use, reproduction, or distribution of Your modifications, or
           for any such Derivative Works as a whole, provided Your use,
           reproduction, and distribution of the Work otherwise complies with
           the conditions stated in this License.
           6. Trademarks. This License does not grant permission to use the trade
           names, trademarks, service marks, or product names of the Licensor,
           except as required for reasonable and customary use in describing the
           origin of the Work and reproducing the content of the NOTICE file.
http://www.apache.org/licenses/LICENSE-2.0
1.1.7.3   BSD
          The Antlr source that we have used in our product is published under the BSD license.
          The full text of this license is:
          THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
          IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
          WARRANTIES
          OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
          IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
          INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
          NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
          USE,
          DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
          THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
          (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
          THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1. DEFINITIONS
          "Contribution" means:
          a) in the case of the initial Contributor, the initial code and
          documentation distributed under this Agreement, and
          b) in the case of each subsequent Contributor:
           i) changes to the Program, and
2. PARTIES
3. GRANT OF RIGHTS
4. RESTRICTIONS.
5. COMMERCIAL DISTRIBUTION
6. LIMITED WARRANTY
7. LIMITATION OF LIABILITY
damages.
8. SEVERABILITY.
9. PATENTS.
http://www.xsharp.info/licenses
1.1.8    Acknowledgements
         We could not have done this project without (source code) contributions from others.
         Below is a list of the contributions that we used for our compiler and Visual Studio
         integration
         Name                                         Description
         Roslyn                                       The X# compiler is based on the open
                                                      source project Roslyn, which contains the
                                                      source to the Microsoft VB and C#
                                                      compilers.
                                                      Our project would have been impossible
                                                      with this source.
         If you are interested in participating in the development of X# please contact us and let us
         know what your area of expertise is. There are plenty of things to do !
         Requirements
         Since X# does not have a runtime yet you need to have the Vulcan Runtime to be able to
         run your VO apps with minimal change in X#. You can use any Vulcan runtime, starting
         with Vulcan 2. Even the runtime from the evaluation version of Vulcan is sufficient.
         The examples
         The examples on the following pages show you a step by step introduction to migrating
         your apps.
         For each example there will be an example supplied with the installer of X#. The examples
         come with a "before" and "after" folder.
becomes
CONSTRUCTOR(oOwner)
          The XPorter will allow you to select a destination folder and names for your Visual Studio
          solution and project files.
          After pressing xPort you will see the following folder s
          C:\XporterOutput\Examples\Explorer
          C:\XporterOutput\Examples\Explorer\Explorer
          C:\XporterOutput\Examples\Explorer\Explorer\Resources
          C:\XporterOutput\Examples\Explorer\Explorer\Properties
          The first folder is the so called “Solution” folder
          The subfolder contains the project and its files.
          If you had selected multiple AEF files then each AEF would have its own subfolder under
          the Solution Folder
          The solution folder contains the files:
           File                                             Contains
File Contains
      To compile and build the project we open the file Explorer.SLN in Visual Studio. Inside
      Visual Studio it looks like:
      The arrows in front of several modules show that there are subitems in these modules.
      Those subitems contain the Form, Menu and Icon resources.
      Now let’s try to build the solution inside Visual Studio. (Menu option Build – Build Solution)
      This compiles the application and builds a debuggable version in the c:
      \XporterOutput\Explorer\Debug folder. You will see that this folder contains an EXE, PDB
      (debug symbols) and copies of the VO runtime libraries:
      Explorer.exe
      Explorer.pdb
      SDK_Defines.dll
      VOGUIClasses.dll
      VORDDClasses.dll
      VOSystemClasses.dll
      VOWin32APILibrary.dll
          XSharp.VO.dll
          XSharp.RT.dll
          XSharp.Core.dll
          Now can try to run the app. This works, but as soon as we select the File/Open menu
          option we will get a runtime error. After some resizing the screen looks similar to this
          The error message is clear: the app uses the splitwindow control and this requires the
          splitwindow support DLL.
          This DLL is located in the Redist folder of your VO installation. Simply copy the
          “Cato3spl.dll” file from your VO Redist folder to the output folder as well as the
          MSVCRT.DLL and try again.
          You can also add the DLLs to your project (Add Existing Item, and point to the DLLs in the
          Redist folder). This will copy them to the project folder. Then set the build action for the 2
          DLLs to None and the “Copy to Output Directory” property to “Preserve Newest”. When
          you now build your app the DLL will be copied to the right folder.
          After that the code will run just like it did in VO with no code changes!
          Let’s have a closer look at what the xPorter has done:
          · Each module in VO has become a PRG file in the X# project
          · Source code has been grouped by class and put in a CLASS .. END CLASS construct
          · Init methods have been renamed to CONSTRUCTOR
          · Compiler macros such as "%CavoSamplesRootDir%\Explorer\" have been replaced
            with literal values: "C:\cavo28SP3\Samples\Explorer\"
          · Recourses have become “children” of the source file where they were defined
          · Locations for resources have also been changed %CavoSamplesRootDir%
            \Explorer\TWO.ICO has been changed to ICONTWO Icon C:
            \cavo28SP3\Samples\Explorer\TWO.ICO.
            Also the RESOURCE keyword has been removed.
          · The binaries for the forms and menus have not been included in this version of the
            XPorter (Beta 11). That will change.
          · The Start file has the biggest change. In VO there was a method in there App:Start().
            However the App class is not defined in this application but part of the GUI Classes.
            There was also no Start function in the App. VO would call the Start function in the GUI
            classes and would merge the App:Start() method in the application with the rest of the
            App class in the GUI Classes.
            This is not allowed in .Net. Classes cannot be spread over more than one assembly
            (the .Net name for of a Library, EXE or DLL).
            Therefore the XPorter has created a new class (xApp) and moved the Start method to
        this Xapp class. It has also added a Start() function which instantiates the App class and
        calls the Start method inside XApp. You can also see in the example below that a TRY ..
        CATCH .. END TRY construct is added which captures the errors that are not catched
        anywhere else and shows an error message in an ErrorBox object. This is the errorbox
        that was shown before because the CATO3SPL.DLL was missing.
      · Finally the Start function is marked with an attribute (The word between the square
        brackets). In this case the attribute is [STAThread] which means that the main function
        (and therefore the whole app) needs to run in Single Threaded Appartment mode. This
        is important if your app uses external code such as OCX/ActiveX controls.
      -
      · If you look closer to the solution explorer in Visual Studio and click on the References
      node in the tree you will see that the example has references to the Vulcan runtime and
      the VO Class libraries as well as the SDK defines library that was included with the
      XPorter.
      · If you open the project properties you will see on the General page that the selected
         dialect is “Visual Object” , on the Dialect page are most VO options are set and on the
         Build page the platform target is x86 (because the GUI classes are designed to run in
         x86 mode) and several warnings have been suppressed. These warnings are:
       Number                                           Meaning
          162                                        Suppresses a warning about Unreachable
                                                     code
          618                                        Suppresses a warning about the use of
                                                     obsolete functions, such as CollectForced
          649                                        Suppresses a warning about unused
                                                     private and/or internal fields.
          9025                                       Suppresses a warning about missing
                                                     return statements
          9032                                       Suppresses a warning about return values
                                                     inside ASSIGN methods and/or
                                                     constructors/destructors
          9043                                       Suppresses a warning about ambiguous
                                                     code, which could happen if two
                                                     assemblies define a function with the same
                                                     name.
      In this particular example only warning 618 is generated by the compiler because the
      CustomerExplorer:Close() method calls CollectForced. After commenting out that line you
      can remove all the “suppressed” warnings from the app and it will compile without any
      warnings.
      You will find the "code before" and "code after" in the XSharp Examples folder
File Contains
File Contains
Open the project in VS and compile. You will see the following errors / warnings
      PadWin.prg(473,1): warning XS1030: #warning: 'The following method did not include
      a CLASS declaration'
      PadWin.prg(480,1): warning XS1030: #warning: 'The following method did not include
      a CLASS declaration'
      PadHelp About.prg(78,3): error XS9046: Cannot assign to 'font' because it is a
      'method'
      PadHelp About.prg(81,8): error XS0119: 'TextControl.Font(params __Usual[])' is a
      method, which is not valid in the given context
      PadHelp About.prg(88,3): error XS9046: Cannot assign to 'font' because it is a
      'method'
      PadHelp About.prg(91,8): error XS0119: 'TextControl.Font(params __Usual[])' is a
      method, which is not valid in the given context
      PadWin.prg(166,19): error XS1061: 'RichEdit' does not contain a definition for
      'RTFChangeFont' and no extension method 'RTFChangeFont' accepting a first argument
      of type 'RichEdit' could be found (are you missing a using directive or an assembly
      reference?)
to
          Note
          The Extension Method works great to enhance existing classes, but has one
          disadvantage: The Vulcan Runtime will not pick up these extension methods for late
          bound code.That is not a problem in this example but may be a problem elsewhere.
          Now we have added an extension method that can be used like a normal method.
          This change also solves the error in PadWin.prg
          Then look at the other problems: they all have to do with a Font property in the TextControl
          class. Unfortunately the VO class libraries have both a Font() method and a Font()
          Access/Assign for the TextControl class. Having a method and a property with the same
          name is not allowed in .Net.
          When the VO Gui classes were ported to Vulcan the decision has been made to rename
          the Font property to Controlfont. So we need to make that change. Simply double click on
          the errors and change
:Font
to
:ControlFont
          (4 times)
          After that the code should compile and run. Clicking the Font button on the toolbar should
          show the font dialog (from the RTFChangeFont extension method)
          Some of the changes that were made to the code (omitting the ones that were also in
          example 1):
          · Manifest.prg is empty but included because it had a dependent resource.
You will find the "code before" and "code after" in the XSharp Examples folder
to
         · This is the place where the Pizza image is used in the example app. To change this,
           open the Order Dialog window (Order Dialog.ORDERDIALOG.xsfrm). Select the button
           on the bottom left and change the "Image" text in the property window from Pizza to
           ImgPizza. Save the form. The code will be regenerated as well.
         · If you look at the order dialog rc file after the changes you will see that the file has been
           marked with a header that this code was generated. Also #defines have been added for
           all windows styles used in the form. The resource is "self contained" so there is no
           dependency on any external file in the resource file.
You will find the "code before" and "code after" in the XSharp Examples folder
              FUNCTION Start()
              LOCAL oExcel AS OBJECT
         oWorkBooks:Close()
         oExcel:Quit()
         WAIT
RETURN NIL
oRange:=oWorkSheet:[Range,"A1","A1"] // A1 cell
oRange:=oWorkSheet:Range["A1","A1"] // A1 cell
      · Note that the name Range is now in front of the Square brackets.
        Range is a so called "Indexed property" of the worksheet. Visual Objects uses a "funny"
        syntax for this.
        X# uses the same syntax that most other languages do. The property looks like an array
        (the square brackets) .
      · Now compile the app in X#. You will get the following errors:
and remove the NIL return value from the RETURN statement.
          · Now 2 errors remain. These indicate that X# does not know how to convert the array
            index from string to int. This is on the line with the range assignment.
            The code above uses 'Late Binding', so the types are not known at compile time. X#
            does not know if the Range property from the Worksheet object is an indexed property
            or if it returns an array. It assumes that it returns an array and wants to specify the array
            index which is numeric (and subtract one because Visual Objects uses 1 based arrays
            where .Net uses 0 based arrays).
          · The best way to fix this is to use strong typing and use the Generated Class wrappers
            for Excel.
            In Visual Objects you would use the 'Automation Server' tool to generate such a class
            wrapper. In .Net there is a similar tool. The easiest way to achieve this is to add a
            reference to Excel to the references of the application:
          · Right Click on "References" in the solution Explorer and Choose "Add Reference"
          · In the 'Add Reference' dialog, choose the COM tabpage
          · Locate the "Microsoft Excel nn.m Object Library". On my machine that is Excel 16.0.
          · Click Ok.
          · This will add an entry to your References list with the name
            "Microsoft.Office.Interop.Excel". This is a generated type library that contains class
            definitions for all types inside Excel.
      · Now go into your code, add a Using statement for the namespace of the Excel classes
        and change "AS OBJECT" to the right types:
             USING Microsoft.Office.Interop.Excel
             FUNCTION Start() AS VOID
             LOCAL oExcel AS Application
             LOCAL oWorkBooks AS Workbooks
             LOCAL oWorksheet AS Worksheet
             LOCAL oRange AS Range
      · Your code is now strongly typed, so you should also get intellisense if you try to select a
        member from one of these objects, such as oExcel:Workbooks.
      · Compile and run the code . It works as expected.
      · You may want to change the value 56 in the SaveAs line to the appropriate enum value:
        xlFileFormat.xlExcel8
      · Now run the app again and everything works as expected.
      · If you look in the folder where the EXE is generated you will see both ExcelTest.Exe and
        Microsoft.Office.Interop.Excel.dll, the type library
      Note 1
      If you are wondering why we declare oExcel as Application but use ApplicationClass to
      instantiate the object, here is the reason:
      Application is the interface, ApplicationClass is the actual class that implements the
      Application interface. This is a model that you will see for most Automation Servers.
      Note 2
      Many people have asked for a way to implement OLE Events. With the X# code and the
      generated type library this is very easy.
      Add the following code to the start method to define a BeforeSave and AfterSave event
         oExcel:WorkbookBeforeSave += OnBeforeSave
         oExcel:WorkbookAfterSave += OnAfterSave
      And run the example again. You will see that both functions are called. Before the save the
      path and name are not set properly, afterwards they are set to the values specified in the
          code
          Some versions of Excel do not support the WorkbookAfterSave event. In that case
          you will get a compile time error
          Note:              If you run this code through the debugger and set a break point in the
                             OnBeforeSaveAs you will see that the callstack in these events is a
                             little bit weird:
                             there is no Start() function inside this callstack ( I have disabled the
                             'Just My code option', otherwise you would only see the line with
                             OnBeforeSave())
          That is because these events are called on a separate thread. If you look at the
          Threads window in VS (Debug - Windows - Threads) you will see that:
          Note 3
          If you look closely in the Add References dialog you may also find other occurrences of
          the Excel library (on the .Net tab). On my machine these are:
          These are so called "Primary Interop Assemblies" (PIAs), pre-compiled assemblies, for
          different Excel versions. You can use these as well. These assemblies are installed with
          the Office Developers Tools for Visual Studio. On my machine they are located in
          subfolders of "c:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for
          Office\PIA" .
You will find the "code before" and "code after" in the XSharp Examples folder
         The first message shows the biggest problem in this example. The second message was
         inserted by the Xporter to warn us that the original code was adding a method to a class
         that exists inside the VO Gui classes.
         Lets fix these problems quickly to be able to compile the app. We will add the OCX Later:
         · Click on the warning. You will see that the XPorter has added a CLASS
           ToolBar_external_class that inherits from Toolbar. The original code was trying to add
           the ShowButtonmenu method to the existing Toolbar class.
         · We can solve this problem, that we have also seen in the VOPAD example by either
           adding an Extension Method or by subclassing the Toolbar class.
         · Just like in the VOPAD example I prefer the extension method.
         · Change the class name and method declaration. We will create 2 overloads, because
           the symTb parameter is optional:
         · Remove the Default() line and replace SELF in the body of the original ShowButtonMenu
           with tbSelf
         · We will also have to make some changes to the code that calls this method. This is due
           to the fact that the code calls ShowButtonMenu on the Toolbar access from the window
           class. This Toolbar access is untyped and therefore returns a USUAL..
           So locate the 2 lines with SELF:ToolBar:ShowButtonMenu and change that to ((Toolbar)
           SELF:ToolBar):ShowButtonMenu. You cannot use the oToolbar field of the Window
           class, because the DataWindow class will return the Toolbar from its framewindow in
           stead of its own toolbar.
           In the improved VO SDK that we will include with our X# runtime we will solve this
           problem by strongly typing properties such as Window:Toolbar.
           Maybe you would be tempted to add the Extension methods to the USUAL type, so you
           would not have to add the casts to the code that calls ShowButtonMenu.
            That will compile, but unfortunately will produce a problem at runtime. The X# compiler
            (like the Vulcan and VO Compilers) knows that the USUAL type is special and will not try
            to emit a method call, but will produce code that calls Send() on the usual to call its
            method. And the Vulcan Runtime does not handle extension methods inside the Send()
            function.
          · We can confirm that this works later when we press the "Reply" button on the toolbar.
            That should bring up the menu with "Reply to Sender" and "Reply to All"
          Now it is time to fix the ActiveX/OCX problem
          · Click on the error about OleControl.
          · As a quick workaround we will change the code and let webbrowser inherit from
            MultiLineEdit. That gives us a control that will certainly work. We will implement the OCX
            later. To do so go to the Class Webbrowser.PRG and change the INHERIT clause. It
            says INHERIT OleControl now. Change that to INHERIT MultiLineEdit.
          · Compile again and now some other errors will be shown. 2 of these mention the type
            cOleMethod. Goto this code by double clicking the error.
          · You will see the Quit method of the Webbrowser class. This code uses an internal
            class and internal methods from the VO OLE Classes. Comment out the contents of
            this method for now.
          · Compile again and you will see that only a few errors are left. Some of these are the
            same as the error in the VOPAD Example and require that we change the Font property
            to ControlFont. Correct that.
          · One error points to an incorrect '+' operator: in the line
          · This is an obvious error in the original VO code that was never picked up by the VO
            Compiler. Remove the + before the double quote
          · The last error comes from the constructor of the Webbrowser class. It is calling the
            CreateEmbedding method from the OleControl. This method does not exist in the
            MultiLineEdit class, so we comment it out for now. We will deal with the Webbrowser
            later.
          · The rest of the code should compile without problems after commenting out the call to
            SELF:CreateEmbedding().
          · You should be able to run the app now.
          · There will be a runtime error if you try to open the Address Book because it uses the
            Databrowser control which depends on Cato3Cnt.dll. Fix this by copying the cato3*.dll
            and msvcrt.dll from the Cavo28\Redist folder to your output folder.
          · Recompile and run the example. I twill now produce an error inside the Display method
            of the Webbrowser class (DisplayHtml if you have used the Email example from VO 2.8
            SP4).
            This method takes the content of the email, writes it to disk and calls the Navigate
            method of the Webbrowser control (late bound, using the Send() function of VO). This
            will not work.
            Since we have changed the webbrowser control and made it a multi line edit we can
            change this behavior. Instead of writing the email text to disk we can simply assign it to
            the TextValue property of the MultiLineEdit. So comment out the body of the Display
            method (do not throw the code away we will need it later) and replace it with:
SELF:TextValue := cText
      · After that the sample should run without problems. You can also display the emails. Of
        course it will not show HTML properly but that is the next step.
      · Tick the checkbox in front of the control and press Ok. This should add the ActiveX to
        the toolbox:
      · You can drag the control to a different place in the Toolbox if you are not happy with
        where it landed.
      · Now drag the Control from the ToolBox to the form. There is no need to size or move
        the control.
      · Visual Studio will add two references to our project. These are:
        o AxSHDocVw, a type library that contains that code for the actual ActiveX control
        o SHDocVw, a type library that contains code for the supporting automation server
          interfaces and classes
          · The form editor will add a field named axWebBrowser1 to the form. This field is of the
            type AxSHDocVw.AxWebBrowser.
          · Goto the property window and change the Modifiers Field to change it from Private to
            it Public (Export).
            That will make the field accessible outside of the webBrowserHost class
          · Save the code, and close the form
          · Now goto the Webbrowser class
          · Add the following using clauses to the top of the file:
                  using Email
                  using AxShDocVw
                  using ShDocVw
          The first using is the namespace where the webBrowserHost window is generated. The
          second namespace is the namespace of the generated ActiveX and the third namespace
          if that of the other types that we need, such as enums and events.
          · Add the following 2 fields (no need to elaborate I think):
          · Goto the constructor of the Webbrowser class and add the following lines of code (in
            stead of the CreateEmbedding() that we commented out before)
          · And add the following methods to make sure that the ActiveX has the same with and
            height as the MultiLineEdit that is its owner and to make sure it is properly destroyed,
              METHOD Resize(oEvent)
               LOCAL oDim as Dimension
               SUPER:Resize(oEvent)
               oDim := SELF:Size
               IF oDim:Width > 0
                  SELF:oWebBrowser:SuspendLayout()
                  SELF:oWebBrowser:Location := System.Drawing.Point{0,0}
                  SELF:oWebBrowser:Size := System.Drawing.Size{oDim:Width,oDim:Height}
                  SELF:oWebBrowser:ResumeLayout()
               ENDIF
               RETURN NIL
METHOD Destroy()
               SUPER:Destroy()
               SELF:oWebBrowser:Dispose()
               SELF:oHost:Dispose()
               RETURN NIL
      · And we need to "restore" the old behavior to display the HTML in the browser window,
        that we commented out before.
        So goto the WebBrowser:Display() method (DisplayHtml for VO 2.8 SP4) and restore
        the old code and change
into
SELF:oWebBrowser:Navigate(cFileName)
SELF:oWebBrowser:Navigate("#top" )
        and change these to early bound method calls using enums in the type library. Also
        remove the NIL values:
         SELF:oWebBrowser:ExecWB(OLECMDID.OLECMDID_PRINT,
         OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT )
      · That wraps it up. Everything works now, including the PrintPreview and Print
        functionality.
      · Of course you can now also use the activeX events and respond to them.
        You have to do that the .Net way. Something like this:
SELF:oWebBrowser:NavigateComplete2 += NavigateComplete2
You will find the "code before" and "code after" in the XSharp Examples folder
          Introduction
          When we designed the X# compile and X# Runtime we had a few focus points in mind:
          ·               The language and runtime should be VO compatible whenever
                          possible. We know that the Vulcan devteam made some decisions not
                          to support certain features from VO, but we decided that we would like
                          to be as compatible as technically possible.
          ·               We want our runtime to be fully Unicode and AnyCPU. It should run on
                          any platform and also both in x86 and x64 mode. That has caused
                          some challenges because VO is Ansi (and not Unicode) and also X86.
                          In VO you can cast a LONG to a PTR. That will not work in X64 mode
                          because a LONG is 32 bits and a PTR 64 bits
          ·               We want the code to compile in "Safe" mode. No unsafe code when
                          not strictly needed. The biggest problem / challenge here is the PTR
                          type. With a PTR you can access memory directly and read/write from
                          memory, even if you don't "own" that memory. However the same PTR
                          type is also used as "unique identifier" for example in the low level file
                          i/o and in the GUI classes for Window and Control handles. These
                          PTR values are never used to read/write memory but are like object
                          references. We have decided to use the .Net IntPtr type for this kind of
                          handles. Of course the compiler can transparently convert between
                          PTR and IntPtr.
          ·               We want to prove that the X# language is a first class .Net
                          development language. That is why we decided to write the X# runtime
                          in X#. By doing that we also create a large codebase to test the
                          compiler. So that is a win - win situation.
          ·               We want the runtime to be thread safe. Each thread has its own
                          "global" state and its own list of open workareas. When a new thread
                          is started it will inherit the state of the main thread but will not inherit
                          the workareas from the main thread
          ·               At this moment the X# Runtime is compiled against .Net Framework
                          4.6.
          Known Issues
          · The macro compiler in this release is fully functional but not as fast as we'd like. We are
            working on a smaller and faster macro compiler.
          · The DBFCDX RDD is missing
      Subsystem                  Remarks
      Low Level File IO          These functions are implemented in XSharp.Core.
                                 There is an important difference between the implementation
                                 in XSharp.Core when compared to VO.
                                 In VO the file handles returned from functions such as
                                 FCreate() and FOpen() are OS file handles. That means that
                                 you can also pass them directly to Win32 API Functions. In
                                 the X# Runtime that is no longer possible.
                                 We use .Net FileStream objects for the File IO. The File
                                 handler returned (which is of the IntPtr type) is a unique key
                                 into a table where we are storing these File IO objects. The
                                 keys are generated from random numbering. You can't and
                                 shouldn't rely on the values of these keys.
      Static Memory IO           The static memory subsystem allocates memory using the
                                 Marshal.AllocHGlobal functionality. Each memory block has 2
                                 guard blocks that contain information about the group number,
                                 size and a magic number. We have also implemented
                                 memory groups.
                                 Unlike in VO you cannot release all blocks in a group by
                                 simply closing the Memory Group.
                                 If you want to enumerate allocated blocks you should first call
                                 MemTrace(TRUE) to enable block tracing.
                                 Then create a function with the following prototype
      Late Binding Support       The Runtime fully supports late binding. The late binding
                                 support still needs some optimizations.
                                 We recommend to only use this when necessary. New code
                                 should either use the DYNAMIC type or try to use early bound
                                 code as much as possible.
          If you want to convert an X# variable to a Vulcan variable you may have to cast it to an
          intermediate type first.
          For dates you can do something similar. In that case you should cast the X# date to a
          DateTime.
1.3.1     XSharp.Core
          This is the base DLL of the X# Runtime. It contains:
          •                  Common interfaces, such as IDate, IFloat, ICodeBlock,
                             IMacroCompiler, used by other X# components
          •                  Runtime functions that use standard .Net datatypes such as SLen(),
                             AllTrim(), SLen().
          ·                  The Runtime State (SetDeleted(), SetExact() etc)
          ·                  The Workarea information
          ·                  The nation resources and collations.
          •                  RDD related functions that do not depend on XBase types as DATE,
                             USUAL and FLOAT.
          ·                  The low level File/IO
1.3.2     XSharp.RT
          This DLL adds the following features to the runtime:
          ·                  XBase specific types , such as DATE, ARRAY, USUAL, PSZ,
                             SYMBOL etc
          ·                  CodeBlock type (base class for compile time codeblocks)
          ·                  _CodeBlock type (base class for macro compiled codeblocks)
          ·                  Runtime functions that accept parameters of these types.
          ·                  Memory related functions (MemAlloc, MemFree etc)
         This assembly should be linked in when you compile for anything other than the Core
                          dialect
1.3.3    XSharp.VO
         This DLL adds some specific types and functions that are unique to the VO and Vulcan
         dialect. Functions such as
         QueryRtRegInt()
         QueryRtRegString()
         MB..()
1.3.4    XSharp.XPP
         This DLL adds some specific types and functions that are unique to the Xbase++ dialect
         and also many of the Xbase++ defines.
         Functions such as
         ClassCreate
         ClassDestroy()
         ClassObject()
         XMLDocOpenFile()
         XMLDocSetAction()
         etc.
1.3.5    XSharp.VFP
         This DLL adds some specific types and functions that are unique to the FoxPro dialect
         Functions such as
         CreateObject()
         etc.
1.3.6     XSharp.Macrocompiler
          This DLL is the X# "fast" macro compiler. The Macro compiler is written in C# and has a
          hardcoded dependency on XSharp.Core.
SetMacroCompiler(typeof(XSharp.Runtime.MacroCompiler))
          If you don't do this then the runtime will try to locate the macro compiler in the following
          locations:
          ·                     The directory where the XSharp.RT.DLL is loaded from
          ·                     The directories in the path. If you use this then make sure that the
                                assemblies listed below are in the same folder as
                                XSharp.MacroCompiler.DLL
          ·                     The Global Assembly Cache (GAC). If you use this mechanism then
                                make sure that the assemblies listed below are also in the GAC.
          Note
          The XSharp installer adds the Macro compiler and the assemblies it depends on to the
          GAC so you will be able to run your apps without adding the macro compiler to the
          references list of your application. Please make sure you include the macro compiler in
          your installer when deploying your applications.
1.3.7     XSharp.Macrocompiler.Full.DLL
          This DLL is the X# "full" macro compiler. The Macro compiler is created as a class
          wrapper on top of the X# scripting engine
We are working on a smaller and faster macro compiler. More news about that will follow.
         XSharp.MacroCompiler.Full.dll and add the following code to the startup code of your
         application:
SetMacroCompiler(typeof(XSharp.MacroCompiler))
         If you don't do this then the runtime will try to locate the standard macro compiler in the
         following locations:
         ·                     The directory where the XSharp.R.DLL is loaded from
         ·                     The directories in the path. If you use this then make sure that the
                               assemblies listed below are in the same folder as
                               XSharp.MacroCompiler.DLL
         ·                     The Global Assembly Cache (GAC). If you use this mechanism then
                               make sure that the assemblies listed below are also in the GAC.
         Note
         The XSharp installer adds the Macro compiler and the assemblies it depends on to the
         GAC so you will be able to run your apps without adding the macro compiler to the
         references list of your application. Please make sure you include the macro compiler in
         your installer when deploying your applications.
1.3.8    XSharp.RDD
         This DLL contains the various RDDs that come with X#:
         · DBFNTX (including DBT memos)
         · DBFCDX (Including FPT memos)
         You can also uses "limited" RDDs with do not have all the functionality:
         · CAVODBF or DBF: Just DBF Files
         · DBFDBT: DBF files with DBT memos, no index support
         · DBFFPT: DBF files with FPT memos, no index support
         ·   Advantage.ADSADT
         ·   Advantage.AXSQLCDX
         ·   Advantage.AXSQLNTX
         ·   Advantage.AXSQLVFP
          ·   XSharp.Core.DLL
          ·   XSharp.RT.DLL
          ·   XSharp.VO.DLL
          ·   XSharp.XPP.DLL
          ·   XSharp.VFP.DLL
          ·   XSharp.RDD.DLL
          ·   XSharp.Macrocompiler.DLL
          ·   VOConsoleClasses.dll
          ·   VOGUIClasses.dll
          ·   VOInternetClasses.dll
          ·   VORDDClasses.dll
          ·   VOReportClasses.dll
          ·   VOSQLClasses.dll
          ·   VOSystemClasses.dll
          ·   VOWin32APILibrary.dll
          Some components are dynamically loaded at runtime and do not have to added as
          references to your application:
          · XSharp.RDD.DLL
          · XSharp.Macrocompiler.DLL
          The X# runtime tries to locate these assemblies in the GAC and in the directory where the
          application is installed.
          If you are not installing the runtime to the GAC, then you must make sure that these two
          DLLs are available in your application folder. Otherwise you will get a runtime error when
          these DLLs are needed.
          The table below shows the type mapping between XBase types in X#.
          All types in the namespace XSharp are implemented in XSharp.VO.DLL and are only supported when
          NOT compiling in the Core dialect
          Runtime functions that expect a codeblock for Arrays expect a Lambda expression for
          ARRAY OF.
          The difference is that the parameters to the Lambda expression will be typed, so there is
          no late binding necessary.
          Parameters to a Codeblock are always of type usual and therefore either require Late
          Binding support or need to be casted to the right type inside the codeblock.
          We have also introduced a special multi dimensional syntax. Given the example below
          you can also get the first name of the first developer in the array by using the following
          syntax:
          This may be useful when you work with existing generated code and the existing code
          was using a define for the elements in the multi dimensional array.
          If you had a (generated) define like
DEFINE DEVELOPER_FirstName := 1
then you can change the code generator and generate this in stead
Example code
               ? oDeveloper:LastName, oDeveloper:FirstName
            NEXT
            RETURN
            CLASS Developer
               PROPERTY FirstName AS STRING AUTO
               PROPERTY LastName AS STRING AUTO
                  CONSTRUCTOR()
                     RETURN
               CONSTRUCTOR (cFirst AS STRING, cLast AS STRING)
                    FirstName := cFirst
                    LastName := cLast
               METHOD ToString() AS STRING
                    RETURN Firstname+" " + LastName
            END CLASS
1.3.10.3 CodeBlock
         This is the parent class for compile time codeblocks.
         There is also a subclass _CodeBlock which is the parent class for macro compiled
         (runtime) codeblocks
         The internal type names are XSharp.CodeBlock and XSharp._CodeBlock
          Note
          Please do not use the PSZ type for new code. It is only included for backward
          compatibility.
          Even new code that calls the windows API can use a better alternative, for example using
          the [DllImportAttribute] from the framework
        Note that some Usual Type numbers are not included in this table. There are defines in
        the compiler for these numbers, but they are never stored inside a USUAL.
        So you can write UsualType(uValue) == REAL8 but that will NEVER be true.
        You can assign values of these other types to a USUAL but the values will be converted to
        a type listed in the first table. For example if you assign a DWORD to a USUAL then the
        runtime will look at the value of the DWORD and if it is smaller or equal to MAX_LONG
        then it will store the value as a LONG. Otherwise it will store it as a FLOAT. Please note
        that although we support the Int64 type the DWORD conversion does not use this to be
        compatible with VO. Also if you assign a PSZ to a USUAL then it will be stored as a
        STRING. So the runtime will automatically call Psz2String() to get the string
        representation.
1.4     X# Scripting
        Below is the text from the presentation from the session that Nikos did in Cologne during
        the XBase.Future 2017 conference.
        The examples from this session are stored during the installation of X# in the folder c:
        \Users\Public\Documents\XSharp\Scripting
            o Updated at runtime
          · Rapid prototyping
          Scripting is...
          · Expression evaluation
            o Built-in interpreter
            o Self-contained functionality
            o Simple expressions or full statements
          · Source file(s) without a project
            o Single file (multiple sources may be loaded by a single script)
            o No need for a full IDE or SDK
            o Dynamic compilation without an IDE
            o Definition of complex structures, classes
          X# as a scripting language
          · Roslyn script engine
            o C# scripting
          · Standalone expressions
            o No START function
            o Global statements, expressions
            o Similar to the macro compiler (but not the same!)
            o Host object maintains state
          X# as a scripting language
          · Complex declarations allowed
            o Types, functions can be declared
            o No namespaces!
          · External references
            o Loading assemblies
            o No implicit access to host assembly
            o No isolation (e.g. separate AppDomain)
            o LanguageService.CodeAnalysis.Scripting
            o LanguageService.CodeAnalysis.Xsharp.Scripting
          · Run a script
            o XSharpScript.RunAsync("? 'HELLO'")
            o CompilationErrorException is thrown if the source has errors
· ScriptState.GetVariable(string name)
          Known issues:
          · Some of the intellisense features are not supported yet.
          · There are no editors for VO Binary entities yet
          · No support yet for .Net Core, .Net Standard, Portable class libraries and shared projects
                                               XUnit                                   template
                                               Framework                               uses a
                                                                                       NuGet
                                                                                       package to
                                                                                       retrieve the
                                                                                       correct
                                                                                       assemblies
                                       Category: Forms
                                       Windows Forms        A Windows form       2.0
                                       Form                 with separate
                                                            designer.prg
                                       Category:
                                       Resources
                         Category: WCF
                         WCF Service        A WCF Service         3.0
                         Category: WPF
                         WPF Flow           Dynamically           3.0
                         Document           formatted XAML
                                            document
1.5.4 Debugger
         Codeblocks
         Historically the XBase language has known the CodeBlock Type. A codeblock is specified
         as
{| params | expression }
         The parameters inside a codeblock are of type USUAL and its return value is also of type
         USUAL.
         To evaluate a codeblock you call the Eval() runtime function and pass this function the
         codeblock and parameters when needed
         In stead of a single expression, you can also use an expression list. The value of the last
         expression in the list is returned as the result of the codeblock.
          Vulcan has also added the possibility to the language to include a list of statements as
          "body" of the codeblock. The result of the last statement is returned to the calling code.
          When the last statement is "Void" then a NIL will be returned:
          Note that the closing Curly must be on a line of its own and the first statement must
          appear on a new line as well.
          Lambda Expressions
          Lamda expressions look a lot like Codeblocks. They are usually used in combination with
          Delegates.
Parameters are optional and the return type can be VOID, so this works as well
          The parameters of a Lambda expression may be typed. This can be convenient for
          documentation purposes but can also help the compiler to find the right overload for a
          method:
         The body of the Lambda may also be a single expression, expression list and a statement
         list.
         Anonymous Method Expressions
         These work almost the same as Lambda Expressions.
         Take the example below:
1.6.5    Delegates
1.6.6    Enumeration Types
1.6.7    Events
          Warning! Dynamically scoped variables are NOT supported in the Core and Vulcan
          dialects. In other dialects they are supported only if the -memvar compiler option is
          enabled.
      · List the variable name as part of a PRIVATE statement. If you do not make an
        assignment at this time, the variable takes on the NIL value and data type; otherwise, it
        takes on the data type of its assigned value. You can assign a new value (with a new
        datatype) to a variable at any time:
             PRIVATE X := 10, y
        This creates x as a numeric variable and y as an untyped variable with the value NIL.
        You can later change the values and their types by assigning other values to them:
           X := "X# Is great"
           Y := Today()
      · List the variable name as part of a PARAMETERS statement within a FUNCTION,
        PROCEDURE or METHOD definition. The variable takes on the data type of its
        associated argument when the routine is called, or NIL if the argument is omitted. You
        can assign a new value (and a new data type) to the variable at any time.
      · Assign a value to a non-existent variable name (for example, x := 10). The variable takes
        on the data type of its assigned value until you assign a new value to it. (x is numeric,
        but the assignment x := "Ms. Jones" changes it to a string.) This will only work if you
        have used the -undeclared as well as the -memvar commandline options.
      Private variables have these properties:
      · You can access them within the creating routine and any routines called by the creator.
        In other words, private variables are automatically inherited by called routines without
        having to pass them as arguments.
      · You can hide them from a called routine by explicitly creating a private (using PRIVATE
        or PARAMETERS) or declaring a local (using LOCAL) variable with the same name in
        the called routine.
      · They are automatically released from memory when the creator returns to its calling
        routine, or you can release them explicitly using RELEASE, CLEAR ALL, or CLEAR
        MEMORY.
      In this example, the function Volume() expects three arguments, or parameters, to be
      passed. When the function is called, it creates three private variables, nLength, nWidth,
      and nHeight to accept the arguments. Because they are created with the PARAMETERS
      statement, any higher-level variables (either public or private) created with these names
      are temporarily hidden, preventing their values from being overwritten in memory:
         FUNCTION Volume()
            PARAMETERS nLength, nWidth, nHeight
            RETURN nLength * nWidth * nHeight
      In the next example, a modified version of Volume() creates a private variable (assuming
      no other variable name nVolume is visible) to store its return value. If the variable nVolume
      exists prior to calling Volume() and is visible to Volume() (for example, nVolume may be
      public or private to the routine that called Volume()), its value is overwritten in memory and
      will remain changed when the function returns to its calling routine:
         FUNCTION Volume()
            PARAMETERS nLength, nWidth, nHeight
            nVolume := nLength * nWidth * nHeight
            RETURN nVolume
      In this version, Volume() specifies the nVolume variable as PRIVATE. Doing this
      temporarily hides any higher-level variable (either public or private) with the same name,
      preventing its value from being overwritten in memory:
              FUNCTION Volume()
                 PARAMETERS nLength, nWidth, nHeight
                 PRIVATE nVolume := nLength * nWidth * nHeight
                 RETURN nVolume
          Public
          The second category of undeclared variable is public. Public variables have application-
          wide lifetime and visibility, and you can define them in only one way:
          · List the variable name as part of a PUBLIC statement. If you do not make an
            assignment at this time, the variable takes on a value of FALSE (or NIL for array
            elements); otherwise, it takes on the data type of its assigned value. You can assign a
            new value (and a new data type) to the variable at any time.
          Public variables have these properties:
          · Once they are created, you can access them anywhere in the application. In other
            words, public variables are automatically inherited by all routines in the application
            without having to pass them as arguments or post them as return values.
          · You can hide them from a routine by explicitly creating a private (using PRIVATE or
            PARAMETERS) or declaring a local (using LOCAL) variable with the same name.
          · They are not released from memory until you explicitly release them using RELEASE,
            CLEAR ALL, or CLEAR MEMORY.
          In this example, the function Volume() is defined without arguments. Instead, the calling
          routine, Compute(), creates three public variables, nLength, nWidth, and nHeight that are
          automatically visible to Volume():
              PROCEDURE Compute()
              PUBLIC nLength := 5, nWidth := 2, nHeight := 4
              ? Volume() // Result: 40
              FUNCTION Volume()
              RETURN nLength * nWidth * nHeight
          In the next example, a modified version of Volume() creates a public variable to store the
          computed volume, getting around having to return a value to the calling routine. Since
          nVolume is public, it is not released from memory when Volume() returns:
              PROCEDURE Compute()
              PUBLIC nLength := 5, nWidth := 2, nHeight := 4
              Volume()
              ? nVolume // Result: 40 , this will only compile with -undeclared
              RETURN
              PROCEDURE Volume()
              PUBLIC nVolume
              nVolume := nLength * nWidth * nHeight
              RETURN
          A better solution for the use of the nVolume variable from last example that will not require
          the -undeclared commandline option is:
           PROCEDURE Compute()
           PUBLIC nLength := 5, nWidth := 2, nHeight := 4
           MEMVAR nVolume   // tell the compiler that nVolume is a Public or private
           Volume()
           ? nVolume // Result: 40
           RETURN
or
           PROCEDURE Compute()
           PUBLIC nLength := 5, nWidth := 2, nHeight := 4
           Volume()
           ? _MEMVAR->nVolume // Result: 40
           RETURN
           ? nVolume
           QOut(nVolume)
      For dynamically scoped variables, you can use the _MEMVAR alias to qualify a variable
      reference. In some cases, you may have to do this in order to help the compiler resolve
      what might otherwise be an ambiguous reference (for example, if you have a field variable
      with the same name as a memory variable and want to use the memory variable in an
      expression).
      Note: MEMVAR is an abbreviation for memory variable, a term that is synonymous with
      dynamically scoped variable.
      Assuming that the database file Measures has fields named nLength, nWidth, and
      nHeight, this example calls Volume() using the field variable values:
           FUNCTION Calculate()
           PRIVATE nLength := 5, nWidth := 2, nHeight := 3
           USE measures
           ? Volume(nLength, nWidth, nHeight)
           ...
      To force the function to use the private variables instead of the field variables,
      you could use the _MEMVAR-> (or, more simply, M->) alias to qualify the
      variable names:
              FUNCTION Calculate()
              PRIVATE nLength := 5, nWidth := 2, nHeight := 3
              USE measures
              ? Volume(_MEMVAR->nLength, _MEMVAR->nWidth, _MEMVAR->nHeight)
              ...
          Of course, it is better to avoid ambiguous situations like the one described above by taking
          care to have unique field and variable names, but the point is that the compiler has certain
          default rules for handling ambiguous references. If you do not want to be at the mercy of
          those defaults, it is best to qualify variable names in all cases.
          MEMVAR Declarations
          Although you may hear them referred to as such, the statements mentioned so far in the
          discussion of dynamically scoped variables are not declarations. The term declaration
          refers to a statement whose purpose is to inform the compiler of something—PRIVATE,
          PARAMETERS, and PUBLIC are statements that generate memory variables at runtime.
          In fact you never have to declare a dynamically scoped variable to the compiler, which is
          the reason for their inefficiency. Because they are not created using compile-time
          declaration statements, the compiler has to generate runtime code for handling such
          issues as type translation, memory management, and resolving ambiguous references to
          variable names since it is possible for several variables with the same name to be visible
          at one time.
          You can, however, declare dynamically scoped variables with the MEMVAR statement and
          they will be created as PRIVATE variables:
              FUNCTION Calculate()
              MEMVAR nLength, nWidth, nHeight
              nLength := 5
              nWidth := 2
              nHeight := 3
              USE measures
              ? Volume(nLength, nWidth, nHeight)
          ...
          In this case, the MEMVAR statement causes memory variables to take precedence over
          field variables with the same names, causing Volume() to be called with the private
          variables.
          Using MEMVAR to declare dynamically scoped variable names to the compiler may make
          your programs slightly more efficient (especially if you have lots of ambiguous
          references); however, it will not eliminate the runtime overhead of these variables.
1.6.16 Namespaces
1.6.17 Nullable Types
1.6.18 Statements, Expressions and Operators
1.6.19 Strings
1.6.20 Types
1.7       X# Reference
1.7.1     X# Language Reference
          This section is a reference to the X# language
          X# Language elements
          The following table shows reference topics that provide tables of keywords, symbols and
          literals used as tokens in X#.
          Title                                        Description
                                                       Contains links to information about all X#
          Keyword Reference (X#)
                                                       language keywords.
                                                       Contains a table of symbols and operators
          Symbol and Operator Reference (X#)
                                                       that are used in the X# language.
                                                       Describes the syntax for literal values in X#
          Literals (X#)                                and how to specify type information for X#
                                                       literals.
1.7.1.1   X# Keywords
          The table below has the keywords that are available in the X# language.
          · The Keywords in the VO column find their origin in the Visual Objects language. When
            the compiler dialect is set to VO then these keywords may be abbreviated (4 letter
            minimum)
          · The Keywords in the VN column were introduced in Vulcan.NET. These keywords may
            never be abbreviated, and most of these keywords are positional, so are only
            recognized in certain positions in the language. That also means that these keywords
            may be used as Variable Names or Method names
          · The Keywords in the X# column were introduced in X#. Just like the VN keywords they
            may never be abbreviated and they are also positional.
          · Keywords that are listed in the Id column may also be used as an identifier. These are
            so called "context sensitive" keywords. You may see in the Visual Studio editor that
            these keywords will change color depending on the position in the source.
            For example if you start typing PROPERTY the word will be shown in the IDENTIFIER
            color:
               But as soon as you continue to complete the PROPERTY definition it will get the
          KEYWORD color:
                                                                                    Descripti
           Keyword        VO           VN          X#           Id      Topic
                                                                                    on
                                                                                    Class and
           ABSTRAC
                                       Y                        Y       Modifiers   Member
           T
                                                                                    Modifier
                                                                                    Class
           ACCESS          Y                                            Entities
                                                                                    Member
                                                                                    REMOVE
           ADD                                      Y           Y       Entities    Part of an
                                                                                    Event
                                                                                    Part of
                                                                                    VOSTRUC
           ALIGN           Y                                    Y       Entities
                                                                                    T
                                                                                    declaration
                                                                                    Character
                                                                                    Encoding
                                                                        _DLL
           ANSI                        Y                        Y                   flag for
                                                                        Functions
                                                                                    _DLL
                                                                                    declaration
                                                                        XBase
                                                                                    XBase
           ARRAY           Y                                            Specific
                                                                                    datatype
                                                                        Types
                                                                        Statement   Part of
                                                                        s,          type
           AS              Y
                                                                        Parameter   specificati
                                                                        s           on
                                                         Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                         on
                                                         Sort order
      ASCENDI                             LINQ
                                Y    Y                   in LINQ
      NG                                  Queries
                                                         query
                                                         Calling
                                          Calling
                                                         Conventio
      ASPEN            Y             Y    Conventio
                                                         n
                                          ns
                                                         (obsolete)
                                                         Global
      ASSEMBL
                                     Y    Attributes     Attribute
      Y
                                                         Target
                                                         Class
      ASSIGN           Y                  Entities
                                                         Member
                                                         Entity
                                                         Modifier for
                                          Statement
      ASYNC                     Y    Y                   Async
                                          s
                                                         Processin
                                                         g
                                                         Character
                                                         Encoding
                                                         flag for
                                                         _DLL
                                                         declaration
                                          _DLL
      AUTO                 Y         Y                   . Also part
                                          Functions
                                                         of
                                                         PROPER
                                                         TY
                                                         declaration
                                                         .
                                                         Expressio
                                                         n modifier
                                          Statement
      AWAIT                     Y    Y                   for Async
                                          s
                                                         Processin
                                                         g
                                                         Indicates
                                          Statement
      BEGIN            Y                                 the start of
                                          s
                                                         a Block
                                                         Breaks out
                                                         of the
                                                         current
                                          Statement
      BREAK            Y                                 Begin
                                          s
                                                         Sequence
                                                         .. END
                                                         block
                                                           Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                           on
                                                           Part of the
                                               LINQ        "GROUP
           BY                      Y    Y
                                               Queries     BY" clause
                                                           in LINQ
                                               Native      Native
           BYTE          Y
                                               Types       Type
                                                           Calling
                                               Calling
           CALLBAC                                         Conventio
                         Y              Y      Conventio
           K                                               n
                                               ns
                                                           (obsolete)
                                                           CASE
                                                           clause of
                                                           DO CASE
                                               Statement   statement.
           CASE          Y
                                               s           Also CASE
                                                           cause of
                                                           SWITCH
                                                           statement.
                                                           CATCH
                                               Statement   clause of
           CATCH              Y
                                               s           TRY
                                                           statement
                                                           Call
                                                           function
                                                           through
                                               Pseudo      Pointer
           CCALL         Y
                                               Functions   (untyped)
                                                           with strict
                                                           calling
                                                           convention
                                                           Call
                                                           function
                                                           through
           CCALLNA                             Pseudo      Pointer
                              Y
           TIVE                                Functions   (untyped)
                                                           with strict
                                                           calling
                                                           convention
                                               Native      Native
           CHAR               Y         Y
                                               Types       Type
                                                           Indicate
                                               Statement
                                                           that code
           CHECKE                              s,
                                   Y    Y                  in
           D                                   Expressio
                                                           expression
                                               ns
                                                           or block
                                                         Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                         on
                                                         should not
                                                         be
                                                         checked
                                                         for
                                                         overflow
                                                         Part of
      CLASS            Y                  Entities       CLASS
                                                         declaration
                                                         Calling
                                                         Conventio
                                                         n (All
                                          Calling
                                                         parameter
      CLIPPER          Y             Y    Conventio
                                                         s are
                                          ns
                                                         USUALs
                                                         and
                                                         Optional)
                                          XBase          XBase
      CODEBL
                       Y                  Specific       Specific
      OCK
                                          Types          Type
                                                         Class
      CONST                Y         Y    Entities       Member
                                                         modifier
      CONSTR                                             Class
                           Y              Entities
      UCTOR                                              Member
                                          XBase          XBase
      DATE             Y                  Specific       Specific
                                          Types          Type
                                                         DECLARE
                                                         METHOD,
                                          Statement
      DECLARE          Y             Y                   ACCESS,
                                          s
                                                         ASSIGN
                                                         (obsolete)
                                          Pragma         #Pragma
                                          Statement      command,
      DEFAULT              Y         Y    s,             DEFAULT
                                          Expressio      expression
                                          ns             .
      DEFINE           Y             Y    Entities       Constant
                                                         User
      DELEGAT
                           Y         Y    Entities       Defined
      E
                                                         Type
      DESCEN                              LINQ           Sort order
                                Y    Y
      DING                                Queries        in LINQ
                                                           Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                           on
                                                           query
           DESTRUC                                         Class
                              Y                Entities
           TOR                                             Member
                                                           Part of
                                               Statement
           DIM           Y              Y                  variable
                                               s
                                                           declaration
                                                           Part of
                                                           function/pr
           DLLEXPO
                         Y              Y      Entities    ocedure
           RT
                                                           declaration
                                                           (obsolete)
                                                           DO CASE
                                                           and DO
                                               Statement
           DO            Y                                 WHILE
                                               s
                                                           statement
                                                           s
                                                           FOR
                                               Statement
           DOWNTO        Y              Y                  NEXT
                                               s
                                                           statement
                                               Native      Native
           DWORD         Y
                                               Types       Type
                                               Native      Native
           DYNAMIC                 Y    Y
                                               Types       Type
                                               Statement   IF
           ELSE          Y
                                               s           Statement
                                               Statement   IF
           ELSEIF        Y
                                               s           Statement
                                                           End for
                                                           many
                                               Statement
           END           Y                                 (block)
                                               s
                                                           statement
                                                           s
                                               Statement   DO CASE
           ENDCASE       Y
                                               s           statement
                                                           DO
                                               Statement
           ENDDO         Y                                 WHILE
                                               s
                                                           statement
                                               Statement   IF
           ENDIF         Y
                                               s           statement
                                                           User
           ENUM               Y         Y      Entities
                                                           Defined
                                                         Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                         on
                                                         Type
                                                         Part if
                                          LINQ
      EQUALS                    Y    Y                   LINQ
                                          Queries
                                                         Query
                                                         Class
      EVENT                Y         Y    Entities
                                                         Member
                                                         Exit
                                                         current
                                          Statement      FOR, DO
      EXIT             Y
                                          s              WHILE or
                                                         REPEAT
                                                         loop
                                                         Modifier for
      EXPLICIT             Y         Y    Modifiers
                                                         Operator
                                                         Class
      EXPORT           Y                  Modifiers      member
                                                         modifier
                                                         Class
      EXTERN                    Y    Y    Modifiers      member
                                                         modifier
                                                         Logic
      FALSE            Y                  Literals
                                                         Literal
                                                         Calling
                                          Calling
      FASTCAL                                            Conventio
                       Y             Y    Conventio
      L                                                  n
                                          ns
                                                         (obsolete)
                                                         Database
                                          Statement
      FIELD            Y             Y                   field
                                          s
                                                         declaration
                                                         TRY ..
                                          Statement
      FINALLY              Y                             FINALLY
                                          s
                                                         statement
                                                         BEGIN
                                          Modifiers,
                                                         FIXED and
      FIXED                     Y    Y    Statement
                                                         Variable
                                          s
                                                         modifier
                                          XBase          XBase
      FLOAT            Y                  Specific       Specific
                                          Types          Type
                                          Statement      FOR
      FOR              Y
                                          s              NEXT
                                                           Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                           on
                                                           statement
                                                           FOREACH
                                               Statement
           FOREACH            Y         Y                  IN NEXT
                                               s
                                                           statement
                                                           FROM
                                               LINQ        clause in
           FROM                    Y    Y
                                               Queries     LINQ
                                                           Queries
                                                           Function
           FUNC          Y              Y      Entities
                                                           declaration
           FUNCTIO                                         Function
                         Y                     Entities
           N                                               declaration
                                                           GET Part
           GET                Y         Y      Entities    of a
                                                           Property
                                                           Global field
           GLOBAL        Y              Y      Entities
                                                           declaration
                                                           Part of the
                                               LINQ        "GROUP
           GROUP                   Y    Y
                                               Queries     BY" clause
                                                           in LINQ
                                                           Class
           HIDDEN        Y                     Modifiers   member
                                                           modifier
                                                           IF
                                                           Statement
                                               Statement
                                                           and
           IF            Y                     s, Pseudo
                                                           IF(..,..,..)
                                               Functions
                                                           Immediate
                                                           IF
                                               Pseudo      Immediate
           IIF           Y
                                               Functions   IF
                                                           Part of
           IMPLEME
                              Y         Y      Entities    CLASS
           NTS
                                                           declaration
                                                           Modifier for
           IMPLICIT           Y         Y      Modifiers
                                                           Operator
                                                           Variable
                                               Statement
           IMPLIED            Y         Y                  declaration
                                               s
                                                           with
                                                          Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                          on
                                                          implied
                                                          type
                                                    FIELD
                                                    declaration
                                          Workarea,
                                                    ,
      IN               Y             Y    LINQ
                                                    FOREACH
                                          Queries
                                                    IN NEXT
                                                    statement
                                                          Part of
      INHERIT          Y             Y    Entities        CLASS
                                                          declaration
                                                          Class
      INITONLY             Y         Y    Modifiers       member
                                                          modifier
                                                          Class
      INSTANCE         Y             Y    Fields          Member
                                                          declaration
                                          Native          Native
      INT              Y
                                          Types           Type
                                          Native          Native
      INT64                Y
                                          Types           Type
                                                          User
      INTERFAC
                           Y         Y    Entities        Defined
      E
                                                          Type
                                                          INTO
                                          LINQ            CLause for
      INTO                      Y    Y
                                          Queries         LINQ
                                                          Queries
                                                          Class and
      INTERNAL             Y         Y    Modifiers       Member
                                                          modifier
                                          Statement       Part of
                                          s,              type
      IS               Y
                                          Parameter       specificati
                                          s               on
                                                          JOIN
                                          LINQ            Clause for
      JOIN                      Y    Y
                                          Queries         LINQ
                                                          Query
                                          LINQ            LET
      LET                       Y    Y
                                          Queries         Clause for
                                                            Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                            on
                                                            LINQ
                                                            Query
                                                            Local
                                               Statement    Variable
           LOCAL         Y
                                               s            Declaratio
                                                            n
                                                            BEGIN
                                               Statement
           LOCK               Y         Y                   LOCK
                                               s
                                                            statement
                                               Native       Native
           LONG          Y
                                               Types        Type
                                               Native       Native
           LONGINT       Y
                                               Types        Type
                                                            Goto start
                                                            of FOR,
                                               Statement    DO
           LOOP          Y
                                               s            WHILE or
                                                            REPEAT
                                                            loop
                                                            VOSTRUC
           MEMBER        Y                     Entities
                                                            T fields
                                                             dBase
                                               Statement    Style
           MEMVAR        Y
                                               s            Variable
                                                            declararion
                                                            Class
           METHOD        Y                     Entities
                                                            Member
                                                            Global
           MODULE                  Y    Y      Attributes   Attribute
                                                            Target
                                                            Return
                                               Pseudo       Name of
           NAMEOF                  Y    Y
                                               Functions    parameter
                                                            or variable
                                                            BEGIN
           NAMESPA
                              Y         Y      Entities     NAMESPA
           CE
                                                            CE
                                                            Class
           NEW                Y         Y      Modifiers    Member
                                                            modifier
                                                          Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                          on
                                                          FOR and
                                          Statement
      NEXT             Y                                  FOREACH
                                          s
                                                          statement
                                                          Empty
      NIL              Y                  Literals
                                                          USUAL
                                                          "Do
      NOP                       Y    Y    Literals        Nothing"
                                                          statement
                                                          Untyped
      NULL             Y                  Literals        NULL
                                                          Literal
                                                          Typed
      NULL_AR
                       Y                  Literals        NULL
      RAY
                                                          Literal
                                                          Typed
      NULL_CO
                       Y                  Literals        NULL
      DEBLOCK
                                                          Literal
                                                          Typed
      NULL_DA
                       Y                  Literals        NULL
      TE
                                                          Literal
                                                          Typed
      NULL_OB
                       Y                  Literals        NULL
      JECT
                                                          Literal
                                                          Typed
      NULL_PSZ         Y                  Literals        NULL
                                                          Literal
                                                          Typed
      NULL_PT
                       Y                  Literals        NULL
      R
                                                          Literal
                                                          Typed
      NULL_ST
                       Y                  Literals        NULL
      RING
                                                          Literal
                                                          Typed
      NULL_SY
                       Y                  Literals        NULL
      MBOL
                                                          Literal
                                          Native          Native
      OBJECT           Y
                                          Types           Type
                                          Pragma
                                                          #Pragma
      OFF                  Y              Statement
                                                          command
                                          s
                                                           Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                           on
                                               Pragma
                                                           #Pragma
           ON                 Y         Y      Statement
                                                           command
                                               s
           OPERAT                                          Class
                              Y         Y      Entities
           OR                                              Member
                                               Pragma
                                                           #Pragma
           OPTIONS            Y                Statement
                                                           command
                                               s
                                                           ORDERB
                                                           Y Class in
           ORDERB                              LINQ
                                   Y    Y                  LINQ
           Y                                   Queries
                                                           Expressio
                                                           n
                                                           Default
                                                           block for
                                                           DO CASE
           OTHERWI                             Statement
                         Y                                 and
           SE                                  s
                                                           SWITCH
                                                           statement
                                                           s
                                                           Class
           OVERRID
                                   Y    Y      Modifiers   Member
           E
                                                           modifier
                                                         Part of
                                                         parameter
                                               Parameter
           OUT                          Y                type
                                               s
                                                         specificati
                                                         on
                                                           dBase
           PARAMET                             Statement   style
                         Y
           ERS                                 s           parameter
                                                           declaration
                                                         Part of
                                                         parameter
                                               Parameter
           PARAMS                  Y    Y                type
                                               s
                                                         specificati
                                                         on
                                                           Class
           PARTIAL            Y         Y      Modifiers
                                                           modifier
                                               Calling     Calling
           PASCAL        Y              Y      Conventio   Conventio
                                               ns          n
                                                         Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                         on
                                                         Call
                                                         function
                                                         through
                                                         Pointer
                                          Pseudo
      PCALL            Y                                 (untyped)
                                          Functions
                                                         with
                                                         pascal
                                                         calling
                                                         convention
                                                         Call
                                                         function
                                                         through
                                                         Pointer
      PCALLNA                             Pseudo
                           Y                             (untyped)
      TIVE                                Functions
                                                         with
                                                         pascal
                                                         calling
                                                         convention
                                                         # of
                                                         Arguments
                                                         received
                                                         by
                                                         method /
                                          Pseudo
      PCOUNT           Y                                 function
                                          Functions
                                                         with
                                                         Clipper
                                                         Calling
                                                         Conventio
                                                         n
                                          Pragma
                                                         #pragma
      POP                  Y              Statement
                                                         Command
                                          s
                                                     Class or
                                                     Member
                                          Modifiers  modifier,
      PRIVATE          Y                  ,Statement dBase
                                          s          Style
                                                     Variable
                                                     declararion
                                                         Procedure
      PROC             Y             Y    Entities
                                                         declaration
      PROCED                                             Procedure
                       Y                  Entities
      URE                                                declaration
      PROPER                                             Class
                           Y         Y    Entities
      TY                                                 Member
                                                            Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                            on
                                                            Class and
           PROTECT
                         Y                     Modifiers    Member
           ED
                                                            modifier
                                               XBase        XBase
           PSZ           Y                     Specific     Specific
                                               Types        Type
                                                            Native
                                               Native
           PTR           Y                                  Type
                                               Types
                                                            (unsafe)
                                                            Class or
                                                            Member
                                               Modifiers,   modifier,
           PUBLIC        Y                     Statement    dBase
                                               s            Style
                                                            Variable
                                                            declararion
                                               Pragma
                                                            #pragma
           PUSH               Y                Statement
                                                            Command
                                               s
                                               Native       Native
           REAL4         Y
                                               Types        Type
                                               Native       Native
           REAL8         Y
                                               Types        Type
                                                            BEGIN
           RECOVE                              Statement    SEQUEN
                         Y
           R                                   s            CE ...
                                                            Statement
                                                         Part of
                                               Parameter parameter
           REF           Y
                                               s         specificati
                                                         on
                                                            REMOVE
           REMOVE                  Y    Y      Operators    Part of an
                                                            Event
                                               Statement    REPEAT
           REPEAT             Y
                                               s            Statement
                                               Statement    RETURN
           RETURN        Y
                                               s            statement
                                                            BEGIN
                                               Statement
           SCOPE              Y         Y                   SCOPE
                                               s
                                                            statement
                                                          Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                          on
                                                          Type
      SEALED               Y         Y    Modifiers
                                                          modifier
                                                          SELECT
                                          LINQ            clause of
      SELECT                    Y    Y
                                          Queries         LINQ
                                                          Query
                                                    Reference
                                                    to SELF
                                                    object,
                                                    Also part
                                          Literals, of
      SELF             Y                  Parameter Parameter
                                          s         s
                                                    declaration
                                                    for
                                                    Extension
                                                    Methods
                                                          BEGIN
      SEQUEN                              Statement       SEQUEN
                       Y             Y
      CE                                  s               CE ...
                                                          Statement
                                                          SET Part
      SET                  Y         Y    Entities        of a
                                                          Property
                                          Native          Native
      SHORT            Y
                                          Types           Type
      SHORTIN                             Native          Native
                       Y
      T                                   Types           Type
                                                          Calculate
                                          Pseudo
      SIZEOF               Y                              the size of
                                          Functions
                                                          a type
                                                          Class,
                                          Modifiers,
                                                          Member of
      STATIC           Y                  Statement
                                                          Variable
                                          s
                                                          Modifier
                                                          FOR ..
                                          Statement
      STEP             Y             Y                    NEXT
                                          s
                                                          statement
                                          Calling         Calling
      STRICT           Y             Y    Conventio       Conventio
                                          ns              n
                                          Native          Native
      STRING           Y
                                          Types           Type
                                                            Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                            on
                                                            User
                                                            Defined
           STRUCT        Y                     Entities
                                                            Value
                                                            Type
                                                            User
           STRUCTU                                          Defined
                              Y         Y      Entities
           RE                                               Value
                                                            Type
                                                            Reference
           SUPER         Y                     Literals     to SUPER
                                                            class
                                               Statement    SWITCH
           SWITCH                  Y    Y
                                               s            Statement
                                               XBase
                                                            xBase
           SYMBOL        Y                     Specific
                                                            Type
                                               Types
                                               Calling      Calling
           THISCALL      Y              Y      Conventio    convention
                                               ns           (obsolete)
                                                            FOR
                                               Statement
           TO            Y                                  NEXT
                                               s
                                                            statement
                                               Statement    Throw an
           THROW              Y
                                               s            Exception
                                                            Logic
           TRUE          Y                     Literals
                                                            Literal
                                                            TRY ...
                                               Statement
           TRY                Y         Y                   CATCH
                                               s
                                                            statement
                                               Pseudo       Same as
           TYPEOF             Y
                                               Functions    _TypeOf()
                                               Native       Native
           UINT64             Y
                                               Types        Type
                                                            Member
                                                            modifier
                                               Modifiers,   and BEGIN
           UNCHECK
                                   Y    Y      Statement    ..
           ED
                                               s            UNCHECK
                                                            ED
                                                            statement
                                                         Descripti
      Keyword      VO      VN   X#   Id   Topic
                                                         on
                                                         Character
                                                         Encoding
                                          _DLL
      UNICODE              Y         Y                   flag for
                                          Functions
                                                         _DLL
                                                         declaration
                                                         User
                                                         Defined
      UNION            Y             Y    Entities
                                                         Value
                                                         Type
                                                         Member
                                          Modifiers,     modifier
      UNSAFE                    Y    Y    Statement      and BEGIN
                                          s              .. UNSAFE
                                                         statement
                                          Statement      REPEAT
      UNTIL                Y         Y
                                          s              Statement
                                                         FOR
                                          Statement
      UPTO             Y             Y                   NEXT
                                          s
                                                         statement
                                                         BEGIN ..
                                                         USING
                                          Entities,
                                                         statement
      USING            Y             Y    Statement
                                                         and USING
                                          s
                                                         <NameSp
                                                         ace>
                                          XBase          XBase
      USUAL            Y                  Specific       Specific
                                          Types          Type
                                                         Value
                                                         place
                                                         holder
      VALUE                Y         Y    Entities       inside
                                                         PROPER
                                                         TY SET
                                                         methods
                                                         Variable
                                                         declaration
                                          Statement
      VAR                       Y    Y                   with
                                          s
                                                         implied
                                                         type
                                                         Member
      VIRTUAL              Y         Y    Modifiers
                                                         Modifier
                                                           Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                           on
                                               Native      Native
           VOID          Y
                                               Types       Type
                                                           Field and
           VOLATILE                Y    Y      Modifiers   Variable
                                                           modifier
                                                           User
                                                           Defined
           VOSTRUC                                         Value Type
                              Y         Y      Entities
           T                                               with VO
                                                           semantics
                                                           (AS/IS)
                                               Pragma
           WARNING                                         #Pragma
                              Y                Statement
           S                                               command
                                               s
                                                           Calling
                                               Calling
                                                           Conventio
           _WINCALL      Y              Y      Conventio
                                                           n
                                               ns
                                                           (obsolete)
                                                           WHERE
                                                           Clause in
                                               LINQ
           WHERE                   Y    Y                  LINQ
                                               Queries
                                                           Expressio
                                                           ns
                                                           DO
                                               Statement
           WHILE         Y                                 WHILE ..
                                               s
                                                           Statement
                                               Native      Native
           WORD          Y
                                               Types       Type
                                                           YIELD ..
                                                           EXIT and
                                               Statement   YIELD ..
           YIELD                   Y    Y
                                               s           RETURN
                                                           statement
                                                           s
                                                           Varargs
                                                           local
                                                           variable for
           __ARGLIS
                                   Y           Operators   functions
           T
                                                           with ...
                                                           (Ellipses)
                                                           parameter
                                                           Logical
           _AND          Y                     Operators
                                                           Operator
                                                          Descripti
      Keyword       VO      VN   X#   Id   Topic
                                                          on
                                                          Cast
      _CAST             Y                  Operators
                                                          operator
                                           XBase
      _CODEBL                                             xBase
                        Y                  Specific
      OCK                                                 Type
                                           Types
                                                          _DLL
      _DLL              Y                  Entities
                                                          Function
                                           Statement      Field prefix
      _FIELD            Y
                                           s              to
                                                          Gets
                                                          Parameter
                                                          in
      _GETFPA                              Pseudo         method/fu
      RAM                                  Functions      nction with
                                                          Clipper
                                                          calling
                                                          convention
                                                          Gets
                                                          Parameter
                                                          in
      _GETMPA                              Pseudo         method/fu
      RAM                                  Functions      nction with
                                                          Clipper
                                                          calling
                                                          convention
      _INIT1,
                                                          Procedure
      _INIT2,           Y                  Entities
                                                          statement
      _INIT3
                                                          Logical
      _NOT              Y                  Operators
                                                          Operator
                                                          Logical
      _OR               Y                  Operators
                                                          Operator
                                                          Calculate
                                           Pseudo
      _SIZEOF           Y                                 size of
                                           Functions
                                                          type
                                                          Calculate
                                           Pseudo
      _TYPEOF           Y                                 type of
                                           Functions
                                                          variable
                                                          Logical
      _XOR              Y                  Operators
                                                          Operator
                                                          Logical
      .AND.             Y                  Operators
                                                          Operator
                                                            Descripti
           Keyword       VO   VN   X#   Id     Topic
                                                            on
                                                            Logic
           .F.           Y                     Literals
                                                            Literal
                                                            Logical
           .NOT.         Y                     Operators
                                                            Operator
                                                            Logical
           .OR.          Y                     Operators
                                                            Operator
                                                            Logic
           .T.           Y                     Literals
                                                            Literal
                                                            Logical
           .XOR.         Y                     Operators
                                                            Operator
                                                         Ellipses
                                               Parameter
           ...           Y                               (varargs)
                                               s
                                                         parameter
                                               Preproces
           #comman                                          Preproces
                              Y                sor
           d                                                sor
                                               Directives
                                               Preproces
                                                            Preproces
           #define            Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #else              Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #endif             Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #endregion         Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #ifdef             Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #ifndef            Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #include           Y                sor
                                                            sor
                                               Directives
                                               Preproces
                                                            Preproces
           #line              Y                sor
                                                            sor
                                               Directives
                                                                                   Descripti
            Keyword        VO           VN          X#         Id   Topic
                                                                                   on
                                                                    Pragma
                                                                                   Preproces
            #pragma                      Y                          Statement
                                                                                   sor
                                                                    s
                                                                    Preproces
                                                                                   Preproces
            #region                      Y                          sor
                                                                                   sor
                                                                    Directives
                                                                    Preproces
                                                                                   Preproces
            #translate                   Y                          sor
                                                                                   sor
                                                                    Directives
                                                                    Preproces
                                                                                   Preproces
            #undef                       Y                          sor
                                                                                   sor
                                                                    Directives
                                                                             Obsolete:
                                                                    Namespac
            #using                       Y                                   use USING
                                                                    e
                                                                             in stead
                                                                    Preproces
                                                                                   Preproces
            #warning                     Y                          sor
                                                                                   sor
                                                                    Directives
                                                                    Preproces
            #xcomma                                                                Preproces
                                         Y                          sor
            nd                                                                     sor
                                                                    Directives
                                                                    Preproces
                                                                                   Preproces
            #xtranslate                  Y                          sor
                                                                                   sor
                                                                    Directives
1.7.1.1.1 Types
            Type                                      Description
            Native Types
            xBase Specific Types
            User Defined Types
           By simple data types we mean data types that are not primarily used to hold other data,
           e.g. Objects, Structures, Arrays, etc., that we will see later.
           Most data types are identical across all .Net languages. This contributes to the ease with
           which one can use assemblies written in different .Net languages within one application,
           one of the main The simple data types come in various categories; some include several
           types. The following table just groups data types by category:
           The BYTE keyword denotes an integral type that stores unsigned 8-bit values with values
           that range from 0 to 255.
      The CHAR keyword denotes an type to represent a Unicode character. The Unicode
      Standard identifies each Unicode character with a unique 21-bit scalar number called a
      code point, and defines the UTF-16 encoding form that specifies how a code point is
      encoded into a sequence of one or more 16-bit values. Each 16-bit value ranges from
      hexadecimal 0x0000 through 0xFFFF and is stored in a Char structure. The value of a
      Char object is its 16-bit numeric (ordinal) value.
      The DWORD keyword denotes an integral type that stores unsigned 32-bit values with
      values ranging from 0 to 4,294,967,295.
      The dynamic type enables the operations in which it occurs to bypass compile-time type
      checking. Instead, these operations are resolved at run time. The dynamic type simplifies
      access to COM APIs such as the Office Automation APIs, and also to dynamic APIs such
      as IronPython libraries, and to the HTML Document Object Model (DOM).
      Type dynamic behaves like type object in most circumstances. However, operations that
      contain expressions of type dynamic are not resolved or type checked by the compiler.
      The compiler packages together information about the operation, and that information is
      later used to evaluate the operation at run time. As part of the process, variables of type
      dynamic are compiled into variables of type object. Therefore, type dynamic exists only at
      compile time, not at run time.
      Please not that to use the DYNAMIC type in your app you have to include the
      Microsoft.CSharp DLL at this moment, and the property names and method names are
      case sensitive at this moment.
      The INT or LONG keyword denotes an integral type that stores signed 32-bit values with
      values that range from negative 2,147,483,648 (which is represented by the
      Int32.MinValue constant) through positive 2,147,483,647 (which is represented by the
      Int32.MaxValue constant) The .NET Framework also includes an unsigned 32-bit integer
      value type, UInt32 or DWORD, which represents values that range from 0 to
      4,294,967,295.
      The INT64 keyword denotes an integral type that stores signed 64-bit values with values
      that range from negative 9,223,372,036,854,775,808 through positive
      9,223,372,036,854,775,807
          The LOGIC keyword represents the .Net Boolean type. This type can have either of two
          values: true, or false.
The OBJECT keyword is a generic type from which all objects in .Net automatically inherit.
          X# does not require a class to declare inheritance from Object because the inheritance is
          implicit.
          Because all classes in the .NET Framework are derived from Object, every method
          defined in the Object class is available in all objects in the system. Derived classes can
          and do override some of these methods, including:
          The PTR keyword denotes an integral type that stores a pointer to a memory location. It is
          usually compiled to the System.IntPtr .Net Type.
          Please note that the size of the PTR depends on the underlying operating system and it
          will also be different when your application runs in x86 or x64 mode.
          In Visual Objects PTR is always 32 bits. Many people have written code that CAST INT
          values to PTR and back. This works because both values are 32 bit in VO.
          Safe code in .Net cannot do this, since the size of PTR is not fixed.
          The REAL4 keyword denotes a single precision 32 bit number with values ranging from
          negative 3.402823e38 to positive 3.402823e38, as well as positive or negative zero,
          PositiveInfinity, NegativeInfinity, and not a number ( NaN). It is intended to represent values
          that are extremely large (such as distances between planets or galaxies) or extremely
          small (such as the molecular mass of a substance in kilograms) and that often are
          imprecise (such as the distance from earth to another solar system). The REAL4 type
          complies with the IEC 60559:1989 (IEEE 754) standard for binary floating-point arithmetic.
          The REAL8 keyword denotes an double precision 64-bit number with values ranging from
          negative 1.79769313486232e308 to positive 1.79769313486232e308, as well as positive
          or negative zero, PositiveInfinity, NegativeInfinity, and not a number ( NaN). It is intended to
          represent values that are extremely large (such as distances between planets or galaxies)
          or extremely small (the molecular mass of a substance in kilograms) and that often are
          imprecise (such as the distance from earth to another solar system), The Double type
          complies with the IEC 60559:1989 (IEEE 754) standard for binary floating-point arithmetic.
           The SBYTE keyword denotes an integral type that stores signed 8-bit values with values
           ranging from negative 128 to positive 127.
           The SHORT keyword denotes an integral type that stores signed 16-bit values with values
           ranging from negative 32768 through positive 32767.
           Please note that you cannot CAST strings to PSZ like you can in Visual Objects. The PSZ
           type consists of 8 bits per character where the STRING type has 16 bits per character.
           The UINT64 keyword denotes an integral type that stores unsigned 64-bit values with
           values ranging from 0 to 18,446,744,073,709,551,615.
           VOID specifies a return value type for a function or method that does not return a value.
           Procedures implicitly define a return type of VOID
           The WORD keyword denotes an integral type that stores unsigned 16-bit values with
           values ranging from 0 to 65535.
            Type                                          Description
            ARRAY
            CODEBLOCK
            DATE
            FLOAT
            PSZ
            SYMBOL
            USUAL
           The ARRAY type is a dynamic array of USUAL values. Each element of the array may
           contain another array, so arrays can be multidimensional.
          The codeblock type was introduced in the XBase language in the Clipper days.
          They can be seen like unnamed functions. They can have 0 or more parameters and
          return a value.
          The most simple codeblock that returns a string literal looks like this
RETURN
          As you can see in the example, we can both use numeric parameters here or string
          parameters. Both work. That is because the parameters to a codeblock are of the so
          called USUAL type. They can contain any value. Of course the following will fail because
          the USUAL type does not support multiplying strings:
         WAIT
         RETURN
      Please note
      ·                   The first statement should start on a new line after the parameter list
      ·                   There should be NO semi colon after the parameter list.
      ·                   The statement list should end with a RETURN statement.
      The FLOAT type is a type that stores a 64-bit floating point value, along with formatting
      information. The precision and range of a FLOAT are the same as that from a REAL8,
      since the value of the float is stored in a REAL8.
      The PSZ type is a pointer type that points to a null terminated sequence of zero or more
      bytes, typically representing a printable character string. This type is for backward
      compatibility only. Don't use this type in new code unless you have to.
The SYMBOL type is a 32-bit integer that represents an index into an array of strings.
      Since a SYMBOL represents a string, there is a built-in implicit conversion from SYMBOL
      to STRING, and from STRING to SYMBOL.
      Since the underlying value of a SYMBOL is an integer, there is a built-in explicit conversion
      from SYMBOL to DWORD and from DWORD to SYMBOL. A cast is necessary in order
      to perform explicit conversions.
      Unlike with Visual Objects, the number of symbols is not limited by available memory or
      symbols that are declared in another library.
      Literal symbols consist of the '#' character followed by one or more alphanumeric
      character. The first character must be a letter or an underscore.
           #XSharp
           #XSHARP
           Note that although literal symbols can be specified with lower or upper case letters, the
           strings they represent are converted to uppercase at compile time, for compatibility with
           Visual Objects. It is not possible to specify a literal symbol that contains lower case
           letters, the StringToAtom() function must be used.
           The compiler-defined constant NULL_SYMBOL can be used to express a null symbol, i.e.
           a symbol that has no associated string value.
           The USUAL type is datatype that can contain any data type. It consists internally of a type
           flag and a value. This type can store any value.
           The compiler treats this type in a special way. The compiler will not warn you when you
           assign a value of type USUAL to another type, but will automatically generate the
           necessary conversion operation/
           USUAL is provided primarily for compatibility with untyped code. It is not recommended for
           use in new code because the compiler cannot perform any type checking on expressions
           where one or more operands are USUAL. Any data type errors will only be discovered at
           runtime.
           Locals, parameters and fields declared as USUAL also incur considerably more runtime
           overhead than strongly typed variables.
           The literal value NIL may be assigned into any storage location typed as USUAL. The
           value NIL indicates the absence of any other data type or value, and is conceptually
           equivalent to storing NULL into a reference type. NIL is the default value for a local USUAL
           variable that has not been initialized.
           When the left operand of the ':' operator is a USUAL, the compiler will generate a late
           bound call to the method, field or property specified as the right operand. This call may fail
           if the value contained in the USUAL at runtime does not have such a member, the
           member type is incorrect or inaccessible, or if the name evaluates to a method and the
           number of parameters or their types is incorrect. The /lb compiler option must be enabled
           in order to use a USUAL as the left operand of the ':' operator, otherwise a compile-time
           error will be raised.
            Type                                           Description
            CLASS
            DELEGATE
            ENUM
            Generic Types
            INTERFACE
      Type                                            Description
      STRUCTURE
      UNION
      VOSTRUCT
      Purpose
      Declare a variable or array that is available to the entire application or module.
          Syntax
          [STATIC] GLOBAL <idVar> [:= <uValue>] [AS | IS <idType>]
          [STATIC] GLOBAL DIM <ArraySpec> AS | IS <idType>
          Arguments
          STATIC          Restricts the visibility of the global variable to the module in which it is
                          declared. If omitted, the variable has application-wide visibility.
          <idVar>         A valid identifier name for the variable. A global variable is an entity
                          and, as such, shares the same name space as other entities. This
                          means that it is not possible to have a global variable and a function,
                          for example, with the same name.
          <uValue>        A constant value that is assigned to <idVar>. This value can be a literal
                          representation of one of the data types listed below or a simple
                          expression involving only operators, literals, and DEFINE constants;
                          however, more complicated expressions (including class instantiation)
                          are not allowed.
                          If <uValue> is not specified, the initial value of the variable depends on
                          the data type you declare (e.g., NIL if you do not use strong typing, 0
                          for AS INT, etc.)
          DIM <ArraySpec> The specification for a dimensioned array to declare.
          <ArraySpec>     The specification for a dynamic array to declare.
                          In both cases, <ArraySpec> is one of the following:
                          <idArray>[<nElements>, <nElements>, <nElements>]
                          <idArray>[<nElements>][<nElements>][<nElements>]
                          All dimensions except the first are optional.
                          <idArray> is a valid identifier name for the array to declare. For
                          dynamic arrays, array elements are initialized to NIL. For dimensioned
                          arrays, the initial value of the elements depends on the data type as
                          explained above for <uValue>.
                          <nElements> defines the number of elements in a particular
                          dimension of an array. The number of dimensions is determined by
                          how many <nElements> arguments you specify.
                          <nElements> can be a literal numeric representation or a simple
                          numeric expression involving only operators, literals, and DEFINE
                          constants; however, more complicated expressions (such as function
                          calls) are not allowed.
          AS <idType>     Specifies the data type associated with the instance variables (called
                          strong typing). If omitted, the instance variables will be polymorphic
                          and will have an initial value of NIL.
                             The valid values for <idType> and the initial values associated with
                             each are listed in the table below:
                          SYMBOL                     NULL_SYMBOL
                          All numerics               0
                          USUAL                      NIL
                          PSZ                        NULL_PSZ
                          PTR                        NULL_PTR
      .
      IS <idType>        Specifies a VOSTRUCT or UNION data type in which the memory
                         needed to hold the structure is allocated on the stack (<idStructure> is
                         the only <idType> allowed with the IS keyword.) See the VOSTRUCT
                         entry in this guide for more information on data structure memory
                         allocation.
      Notes
      Search order for variables: You can hide a global variable name from a routine by
      declaring another variable with the same name (with LOCAL, MEMVAR, or FIELD).
      The search order for a variable name is as follows:
      1.      LOCALs, local parameters, MEMVARs, and FIELDs
      2.      SELF instance variables (i.e., without <idObject>: prefix in class methods)
      3.      GLOBALs and DEFINEs
      Examples
      The following example illustrates using the GLOBAL statement to create a global variable,
      a global dimensioned array, and a global dynamic array. The dynamic array, since it is
      declared with STATIC GLOBAL, is visible only in the current module:
      See Also
      DEFINE, LOCAL
              union               : (votypeModifiers)?
                                       UNION (nameDot)? identifier eos
                                       (vounionmember)+
              vostruct            : (votypeModifiers)?
                                       VOSTRUCT (nameDot)? identifier (ALIGN INT_CONST)? eos
                                       (vostructmember)+
Generic types can be recognized by type parameters and type parameter constraints
         classmember       :   method
                           |   declare
                           |   constructor
                           |   destructor
                           |   classvars
                           |   property
                           |   operator
                           |   event
                           |   structure           // from here are nested types
                           |   class
                           |   delegate
                           |   enum
                           |   interface
                           |   function            // synonym to method
      Constructors are the equivalent of Init() methods in Visual Objects. They are called when
      an object is initialized
         constructor                :        (attributes)?
                                             (constructorModifiers)?
                                             CONSTRUCTOR (parameterList)? (AS VOID)? // As
         Void is allowed but ignored
                                             (callingconvention)?
                                             (CLASS (nameDot)? identifier)? eos
                                             ((SELF | SUPER)( (LPAREN RPAREN)| (LPAREN
         argumentList RPAREN)) eos)?
                                             statementBlock
          Destructors are automatically called by the .Net runtime when an object is disposed. They
          are similar to Axit methods in Visual Objects, with a few differences:
          · You do not need to call RegisterAxit(). The destructor will always be called
          · You cannot not call destructors from your own code.
          If you want to be able to control the destruction of objects and call cleanup code from your
          own code, then you can either implement a mechanism similar to the Axit() and Destroy()
          methods from the VO GUI classes or you implement the Dispose pattern that many .Net
          classes use.
          Destructors do not have:
          · Parameters
          · A Return type
              destructor          :      (attributes)?
                                         (destructorModifiers)?
                                         DESTRUCTOR (LPAREN RPAREN)?
                                         (CLASS (nameDot)? identifier)? eos
                                         statementBlock
          Events can be used to allow external code to respond to state changes in an object. There
          are roughly 3 types of event declarations:
          · Auto events, where the compiler sets up the mechanism behind the event
          · Single line declarations, with a simple ADD expression(list) and REMOVE
            expression(list).
          · Multi line declarations with a separate ADD block and/or REMOVE block
      METHOD declarations can appear inside a class block, or outside a class block. Inside a
      class block the CLASS <Id> clause is ignored.
      Outside of a CLASS block the CLASS <Id> clause is mandatory
         /*
             From the C# syntax guide:
             overloadable-unary-operator: one of
             +   -   ! ~    ++   --   true   false
             overloadable-binary-operator:
             + - * / % & | ^ << right-shift == != > < >= <=
             // note in C# ^ is binary operator XOR and ~ is bitwise negation (Ones
         complement)
             // in VO ~is XOR AND bitwise negation. ^is EXP and should not be used
         for overloaded ops
             // VO uses ^ for Exponent
*/
          Properties can be used to assign and access values of a type. The property syntax allows
          to define read only properties and to assign actions to the assignment of a property.
          There are roughly 3 types of properties
          · Auto properties, where the compiler declares the field backing the property
          · Single line declarations, with a simple GET expression and SET expression(list).
          · Multi line declarations with a separate GET block and/or SET block
              propertyParameterList
                                  : [ (parameter (, parameter)*)? ]
                                  | ( (parameter (, parameter)*)? )             // Allow
              Parentheses as well
Instance Variables are also known as fields in .NET. They define the values of a type.
1.7.1.1.2 Entities
            The X# language knows the following entity types. Some of these are also listed as User
            Defined Types and Class Members
              Keyword                      VO              VN               X#           Description
              _DLL                          Y
              Class                         Y
              Constructor                Y (Init)           Y
              Define                        Y
              Delegate                                      Y
              Destructor                 Y (Axit)           Y
              Enum                                          Y
              Event                                         Y
              Function                      Y
              Global                        Y
              Interface                                     Y
              Method                        Y
              Namespace                                     Y
              Operator                                      Y
              Procedure                     Y
              Property                                      Y
             Keyword               VO               VN               X#        Description
             Structure                               Y
             Union                  Y
             Using                                   Y
             VoStruct               Y
1.7.1.1.2.1 Namespace
1.7.1.1.2.2 Function
1.7.1.1.2.3 Procedure
1.7.1.1.2.4 Using
1.7.1.1.2.5 Define
           Purpose
           Declare a constant name and its value to the compiler.
           Syntax
           [STATIC] DEFINE <idConstant> := <expression> [ AS <Type>]
           Arguments
           STATIC              Restricts the visibility of the constant to the module in which it is
                               declared. If omitted, the constant has application-wide visibility.
           <idConstant>        A valid identifier name for the constant. A constant is an entity and, as
                               such, shares the same name space as other entities. This means that
                               it is not possible to have a constant and a global variable, for example,
                               with the same name.
           <expression>        A constant value that is assigned to <idConstant>. This value can be a
                               literal representation of one of the data types listed below or a simple
                               expression involving only operators, literals, and other DEFINE
                               constants; however, more complicated expressions (including class
                               instantiation) are not allowed.
           <Type>              You can optionally specify a type for a DEFINE. When the type is
                               omitted then the compiler will calculate the type from <expression>.
           Description
           Once the constant name and value is declared and initialized with the DEFINE statement,
           you can not change the value of <idConstant> without provoking a compiler error. The
           constant value <uValue> will be used whenever the <idConstant> identifier name is
           encountered in your application.
           You can hide a constant name from a routine by declaring a variable with the same name
           (with LOCAL, MEMVAR, or FIELD). The search order for a variable name is as follows:
           1.     LOCALs, local parameters, MEMVARs, and FIELDs
           2.     SELF instance variables (i.e., without <idObject>: prefix in class methods)
           3.     GLOBALs and DEFINEs
           Note: you can't use DEFINES for #ifdef constructs. You need to use #defines for that.
           DEFINEs are like GLOBALs but their value is a constant.
           Examples
           The following example assigns an application name to the constant cAppName. This
           value is then displayed at the beginning and end of the application run:
           See Also
           #define , GLOBAL
1.7.1.1.2.6 _DLL
                vodll             :    (attributes)?
                                       (funcprocModifiers)? _DLL
                                       ( FUNCTION identifier parameterList (AS datatype)?
                                       | PROCEDURE identifier parameterList )
                                       (dllcallconv)? :
                                       identifierString (. identifierString)?
                                       (      REAL_CONST
                                       |      . identifierString @? INT_CONST? (#
                INT_CONST)?
                                       )
                                       (AUTO | ANSI | UNICODE) ?
                                              eos
1.7.1.1.3.1 Parameters
1.7.1.1.3.2 Attributes
            Attributes are used in DotNet to assign meta information to types, members, parameters
            etc.
attributes : ( attributeBlock )+
                 attributeTarget          : identifier :
                                          | keyword :
1.7.1.1.3.3 Modifiers
            Modifiers are language elements that are used to change the visibility or scope of types,
            members etc. They can often be combined.
destructorModifiers : ( EXTERN )+
1.7.1.1.3.4 Arguments
           Argument lists are used when calling methods or functions that expect parameters.
           There are 2 syntaxes. One that allows named arguments (for the Core dialect when
           calling functions and methods) and one that does not allow named arguments (used for
           Properties). The syntax for these argument lists is:
unnamedArgument : expression?
1.7.1.1.4 Statements
Iteration Statements
             Keyword               VO                VN               X#          Description
             DO WHILE ...           Y
             FOR ... NEXT           Y
             FOREACH ...
                                                      Y
             NEXT
             REPEAT ...
                                                      Y
             UNTIL
Conditional statements
             Keyword               VO                VN               X#          Description
             IF .. ELSE ..
                                    Y
             ENDIF
             DO CASE                Y
           Keyword           VO   VN   X#       Description
           SWITCH                      Y
           Keyword           VO   VN   X#       Description
           Expression
                             Y
           statement
           Qout (?,??)       Y
           NOP                         Y
Block statements
           Keyword           VO   VN   X#       Description
           BEGIN
                                       Y
           CHECKED
           BEGIN FIXED                 Y
           BEGIN LOCK             Y
           BEGIN SCOPE            Y
           BEGIN
                                       Y
           UNCHECKED
           BEGIN
                                       Y
           UNSAFE
           BEGIN USING                 Y
Jump statements
           Keyword           VO   VN   X#       Description
           ASYNC ...
                                       Y
           AWAIT
           EXIT              Y
           LOOP              Y
      Keyword          VO      VN   X#    Description
      RETURN           Y
      YIELD EXIT                    Y
      YIELD
                                    Y
      RETURN
Declaration Statements
      Keyword          VO      VN   X#    Description
      FIELD            Y
      GLOBAL           Y
      LOCAL            Y
      LOCAL
                               Y
      IMPLIED
      MEMVAR           Y
      PARAMETERS       Y
      PRIVATE          Y
      PUBLIC           Y
      VAR                           Y
      STATIC
                       Y
      (LOCAL)
Exception Handling
      Keyword          VO      VN   X#    Description
      BEGIN
                       Y
      SEQUENCE
      BREAK            Y
      TRY ... CATCH
                               Y
      .. FINALLY
      THROW                    Y
1.7.1.1.4.1 ?, ??
            AWAIT is used before an expression to indicate that an operation may take a while to
            process.
            The compiler will (behind the scenes) construct a complicated mechanism in which the
            body of the method is split into a part before and after the await. When the expression
            returns then the code jumps to the point where it has to continue. As such this belongs to
            the JUMP statements.
1.7.1.1.4.10 BREAK
1.7.1.1.4.11 DO CASE
          Purpose
          Conditionally execute a block of statements.
          Syntax
          DO CASE
          CASE <lCondition>
          <Statements>...
          [CASE <lCondition>]
          <Statements>...
          [OTHERWISE]
          <Statements>...
          END[CASE]
          Arguments
          <lCondition>       If this expression evaluates to TRUE, the statements following it up
                             until the next CASE, OTHERWISE, or ENDCASE are executed.
                             Afterwards, control branches to the statement following the next
                             ENDCASE statement.
          OTHERWISE          If all preceding CASE conditions evaluate to FALSE, the statements
                             following the OTHERWISE up until the next ENDCASE are executed.
                             Afterwards, control branches to the statement following the next
                             ENDCASE statement.
          Description
          DO CASE works by branching to the statement following the first CASE <lCondition> that
          evaluates to TRUE. If all CASE conditions evaluate to FALSE, it branches to the statement
          following the OTHERWISE statement (if specified).
          Execution proceeds until the next CASE, OTHERWISE, or ENDCASE is encountered,
          and control then branches to the first statement following the next ENDCASE statement.
          Control structures can be nested to any depth. The only requirement is that each control
          structure be properly nested.
          Note: DO CASE...ENDCASE is identical to IF...ELSEIF...ENDIF, with neither syntax
          having a performance advantage over the other.
          Examples
          This example uses DO CASE in a menu structure to branch control based on user
          selection:
          See Also
          BEGIN SEQUENCE, DO WHILE, FOR, FOREACH IF SWITCH
1.7.1.1.4.12 DO WHILE
1.7.1.1.4.13 EXIT
           The Exit statement unconditionally jumps out of the current DO WHILE, FOR NEXT,
           FOREACH NEXT or REPEAT UNTIL block
           Expression Statements are stand alone expressions on a single line. The most common
           expression statement types are:
1.7.1.1.4.15 FIELD
           Purpose
           Declare one or more database field names to be used by the current routine.
           Syntax
           FIELD <idFieldList> [IN <idAlias>]
           Arguments
           <idFieldList>            A list of names to declare as fields to the compiler.
           IN <idAlias>             An alias to assume when there are unaliased references to the names
                                    specified in the <idFieldList>.
           Description
           When you use the FIELD statement to declare fields, unaliased references to variables in
           <idFieldList> are treated as if they were preceded by the special field alias (_FIELD->) or
           <idAlias>-> if the IN clause is specified.
           Like other variable declaration statements (i.e., LOCAL and MEMVAR), you must place
           FIELD statements before any executable statements (including PRIVATE, PUBLIC, and
           PARAMETERS) in the routine you are defining. The FIELD statement has no effect on the
           macro operator, which always assumes memory variables.
           The FIELD statement neither opens a database file nor verifies the existence of the
           specified fields. It is useful primarily to ensure correct references to fields that are known
           to exist at runtime. Attempting to access the fields when the associated database is not in
           use will raise a runtime error.
           Examples
           This function includes statements to declare database field names in both the current and
           Employee work areas:
                FUNCTION DisplayRecord()
                FIELD CustNo, OrderNo, Orders
                FIELD EmpName, EmpCode IN Employee
                USE employee NEW
                USE orders NEW
                ? CustNo // Refers to Orders->CustNo
                ? EmpName // Refers to Employee->EmpName
                CLOSE orders
                CLOSE employee
           See Also
           LOCAL, MEMVAR, STATIC
                forstmt:        FOR
                                 ( expression
                                 | (LOCAL? IMPLIED | VAR) identifier := expression
                                 | LOCAL identifier := expression (AS datatype)?
                                 )
                                 (TO | UPTO | DOWNTO) expression
                                 (STEP expression)? eos
                                      StmtBlk=statementBlock
                                   NEXT garbage? eos
                foreachstmt       : FOREACH
                                    (IMPLIED identifier
                                     | VAR identifier
                                     | identifier AS datatype )
                                    IN expression eos
                                          statementBlock
1.7.1.1.4.19 LOCAL
            Local declarations can appear anywhere in your code, and do not have to be the first lines
            in a statement block.
            Locals declared within a block are only visible inside that block.
            The VAR keyword has been added for ease of use, and because sometimes the type is
            difficult to specify, like in the area if LINQ or when anonymous types are used.
            Purpose
            Declare and initialize local variables and arrays.
            Syntax
            [STATIC] LOCAL <idVar> [:= <expression>] [,...] [AS | IS <idType>] [, ...]
            [STATIC] LOCAL DIM <ArraySpec> [, ...] AS | IS <idType> [, ...]
            VAR <idVar> := <expression>
            LOCAL IMPLIED <idVar> := <expression>
            Note: The LOCAL statement is shown using several syntax diagrams for convenience.
            You can declare variables, dynamic arrays, and dimensioned arrays using a single
            LOCAL statement if each definition is separated by a comma.
            Arguments
            STATIC                   Causes the local variable to retain its value across invocations of the
                                     declaring entity but does not affect its visibility.
          VAR               The compiler will calculate the type based on the expression in
                            <uValue>
          LOCAL IMPLIED     The compiler will calculate the type based on the expression in
                            <uValue>
          AS <idType>       Specifies the data type associated with the instance variables (called
                            strong typing). If omitted, the instance variables will be polymorphic
                            and will have an initial value of NIL.
                            The valid values for <idType> and the initial values associated with
                            each are listed in the table below:
allocation.
      Description
      LOCAL is a declaration statement that declares one or more variables or arrays as local
      to the current routine (i.e., function, method, or procedure). Like other variable declaration
      statements (such as FIELD and MEMVAR), you must place LOCAL statements before
      any executable statements (including PRIVATE, PUBLIC, and PARAMETERS) in the
      routine you are defining.
      Local variable declarations hide all inherited private variables, visible public variables,
      instance variables, global variables, and constants with the same name.
      The search order for a variable name is as follows:
      1.        LOCALs, local parameters, MEMVARs, and FIELDs
      2.        SELF instance variables (i.e., without <idObject>: prefix in class methods)
      3.        GLOBALs and DEFINEs
      A LOCAL statement that declares a variable name which is already declared within the
      same routine (with FIELD, LOCAL, or MEMVAR) causes a compiler error.
      Local variables are visible only within the current routine, and unlike private variables, are
      not visible within invoked routines. If a routine is invoked recursively, each recursive
      activation creates a new set of local variables.
      Unless you specify the STATIC keyword, local variables are created automatically each
      time the routine in which they were declared begins executing. They continue to exist and
      retain their values until the declaring routine returns control to the routine that invoked it.
      The STATIC keyword serves as a lifetime modifier for a local variable, preventing the
      variable from being released from memory when the creating entity returns to its calling
      routine.
      Important! When an application containing static variable declarations is invoked, the
      variables are created and initialized before the beginning of program execution. Thus,
      initial values are assigned only once per application run, not each time the creator is
      called.
      For more information on variable declarations and scoping, refer to the "Variables,
      Constants, and Declarations" chapter in the Programmer's Guide.
      Notes
      Local parameters: The FUNCTION, METHOD, and PROCEDURE statements allow you
      to declare a list of local parameters enclosed in parentheses following the entity name.
      For example:
FUNCTION <idFunction>(<idParamList>)
      Exporting locals through code blocks: When you create a code block, you can access
      local variables defined in the creating entity within the code block definition without passing
      them as parameters (because local variables are visible to the code block). This, along
      with the fact that you can pass a code block as a parameter, allows you to export local
      variables. For example:
              FUNCTION NextFunc(cbAddEmUp)
              RETURN EVAL(cbAddEmUp, 200)
          When the code block is evaluated in NextFunc(), nVar, which is local to function One(),
          becomes visible even though it is not passed directly as a parameter.
          Macro expressions: You cannot refer to local variables within macro variables and
          expressions. If you refer to a local variable within a macro variable, a private or public
          variable with the same name will be referenced instead. If no such variable exists, a
          runtime error will be raised.
          Type of a local variable: Since Type() uses the macro operator (&) to evaluate its
          argument, you cannot use it to determine the type of a local variable or an expression
          containing a local variable reference. You can, however, use ValType() which evaluates its
          argument and returns the type of the return value.
          Memory files: You cannot SAVE or RESTORE local variables.
          Examples
          The following example declares two local arrays and two local variables:
          This example declares two local variables with initializers. The first is initialized to a date
          value and the second to an array:
          In this example, the variable x and the dimensioned array z are typed as INT, while the
          variables cName and cAddr are typed as STRING:
The next example declares static variables both with and without initializers:
          Here a static variable is manipulated within a function. In this example, a count variable
          increments itself each time the function is called:
              FUNCTION MyCounter(nNewValue)
              // Initial value assigned once
              STATIC LOCAL nCounter := 0
              IF nNewValue != NIL
                 // New value for nCounter
                  nCounter := nNewValue
               ELSE
                  // Increment nCounter
                  ++nCounter
               ENDIF
               RETURN nCounter
          The following code initializes a local with a Generic List and lets the compiler detect the
          type of the local variable
          See Also
          FIELD, FUNCTION, DEFINE, GLOBAL, MEMVAR, METHOD, PROCEDURE, STATIC
1.7.1.1.4.20 LOOP
          The Loop statement jumps back to the beginning of the current DO WHILE, FOR NEXT,
          FOREACH NEXT or REPEAT UNTIL block
1.7.1.1.4.21 MEMVAR
          The MEMVAR statement is NOT available in the Core and Vulcan dialects and will only
          be enabled if the -memvar commandline option is specified.
          Purpose
          Declare one or more memory variable names to be used by the current routine.
          Syntax
          MEMVAR <idMemvarList>
          Arguments
          <idMemvarList>      A list of public and private variable names to declare to the compiler.
          Description
          When you use the MEMVAR statement to declare variables, unaliased references to
          variables in <idMemvarList> are treated as if they were preceded by the special memory
          variable alias
          (_MEMVAR->).
          Like other variable declaration statements (such as LOCAL and FIELD), you must place
          MEMVAR statements before any executable statements (including PRIVATE, PUBLIC,
          and PARAMETERS) in the routine you are defining. The MEMVAR statement has no effect
          on the macro operator, which always assumes memory variables.
          The MEMVAR statement neither creates the variables nor verifies their existence. Its
          primary purpose is to ensure correct references to variables that are known to exist at
          runtime. Attempting to access variables before they are created will raise a runtime error.
          Examples
          This example demonstrates the relationship between a private and field variable with the
          same name. The private variable is declared with the MEMVAR statement:
               FUNCTION Example()
               MEMVAR Amount, Address
               PRIVATE Amount := 100
               USE customer NEW
               ? Amount // Refers to Amount private variable
               ? Customer->Amount
               // Refers to Amount field variable
          See Also
          FIELD, LOCAL, PARAMETERS, PRIVATE, PUBLIC, STATIC
1.7.1.1.4.22 NOP
1.7.1.1.4.23 PARAMETERS
          The PARAMETERS statement is NOT available in the Core and Vulcan dialects and will
          only be enabled if the -memvar commandline option is specified.
          Purpose
          Create private variables to receive passed values or references.
          Syntax
          PARAMETERS <idPrivateList>
          Arguments
          <idPrivateList>     One or more parameter variables separated by commas. These
                              variables are used to receive arguments that you pass when you call
                              the routine.
          Description
          When a PARAMETERS statement executes, all variables in the parameter list are created
          as private variables and all public or private variables with the same names are hidden
          until the current procedure or function terminates. A PARAMETERS statement is an
          executable statement and can, therefore, occur anywhere in a procedure or function.
          Examples
          This function receives values passed into private parameters with a PARAMETERS
          statement:
               FUNCTION MyFunc()
               PARAMETERS cOne, cTwo, cThree
               ? cOne, cTwo, cThree
          The next example is similar, but receives values passed into local variables, by declaring
          the parameter variables within the FUNCTION declaration:
1.7.1.1.4.24 PRIVATE
          The PRIVATE statement is NOT available in the Core and Vulcan dialects and will only be
          enabled if the -memvar commandline option is specified.
          Purpose
          Create variables and arrays visible within current and invoked routines.
          Syntax
          PRIVATE <idVar> [:= <uValue>][, ...]
          Arguments
          <idVar>             A valid identifier name for the private variable to create.
          <uValue>            The initial value to assign to the variable. If not specified, the variable is
                              initialized to NIL.
          Description
          When you create a private variable or array, existing and visible private and public
          variables of the same name are hidden until the current routine terminates or the private
          variable is explicitly released.
          Attempting to specify a private variable that conflicts with a visible local variable is
          recognized by the compiler as an error. Private variables with the same name as a
          GLOBAL or DEFINE will not be recognized by the compiler.
          In class methods, if the private variable conflicts with an instance variables, you should
          use the _MEMVAR-> prefix to access the private variable and the SELF: prefix to access
          the instance variable to make sure that the right variable is used within a method if there is
          a name conflict.
          In addition to the PRIVATE statement, you can create private variables by:
          · Assigning to a variable that does not exist or is not visible will create a private variable
            (only possible if you compile with the -undeclared command line option)
          · Receiving parameters using the PARAMETERS statement
          Private variables are dynamically scoped. They exist until the creating routine returns to its
          caller or until explicitly released with CLEAR ALL, or CLEAR MEMORY.
          Notes
          Compatibility: The ALL, LIKE, and EXCEPT clauses of the PRIVATE statement supported
          by other Xbase dialects are not supported.
          Examples
          The following example creates two PRIVATE arrays and three other PRIVATE variables:
          The next example creates a multi-dimensional private array using each element
          addressing convention:
This example uses PRIVATE statements to create and initialize arrays and variables:
              PRIVATE aArray := { 1, 2, 3, 4 }, ;
              aArray2 := ArrayNew(12, 24)
              PRIVATE cChar := Space(10), cColor := SetColor()
          See Also
          LOCAL, MEMVAR, PARAMETERS, PUBLIC
1.7.1.1.4.25 PUBLIC
           The PUBLIC statement is NOT available in the Core and Vulcan dialects and will only be
           enabled if the -memvar commandline option is specified.
           Purpose
           Creates variables and arrays visible to all routines in an application.
           Syntax
           PUBLIC <idVar> [:= <uValue>] [, ...]
           Arguments
           <idVar>             A valid identifier name for the public variable to create.
           <uValue>            The initial value to assign to the variable. This can be any valid
                               expression. If <uValue> is not specified, the variable is initialized to
                               FALSE
           Description
           Any declared variables, such as LOCALs, with the same names as existing public or
           private variables temporarily hide the public or private variables until the overriding
           variables are released or are no longer visible.
           An attempt to create a public variable with the same name as an existing and visible
           private variable is simply ignored; however the assignment portion of the PUBLIC
           statement is not ignored. For example, the following lines of code change the value of the
           variable x but do not change its scope from private to public:
               PRIVATE x := 1000
               ...
               PUBLIC x := "New value for x"
               ? x // Result: "New value for x"
           The explanation for this behavior is that, internally, the PUBLIC statement and the
           assignment are treated as separate statements. Thus, this code would be treated as
           follows:
               PRIVATE x := 1000
               ...
               PUBLIC x
               x := "New value for x"
               ? x // Result: "New value for x"
           The PUBLIC statement is ignored, but the assignment statement is executed, changing
           the value of the private variable x.
           This behavior has an interesting repercussion when you declare a public array using a
           variable name that already exists as private. For example:
               PRIVATE x := 1000
               ...
              PUBLIC x[10]
              ? x[1] // Result: NIL
In this case, the PUBLIC statement is also treated as two separate statements:
              PRIVATE x := 1000
              ...
              PUBLIC x
              x := ArrayNew(10)
              ? x[1] // Result: NIL
          Again, the PUBLIC statement is ignored, and the assignment changes x from a private
          numeric variable to a private reference to a ten element array.
          Attempting to specify a public variable that conflicts with a visible declared variable (for
          example, LOCAL, GLOBAL, or DEFINE) of the same name is not recognized by the
          compiler as an error because PUBLIC is not a compiler declaration statement. Instead,
          the declared variable will hide the public variable at runtime. This means that you will not
          be able to access the public variable at all until the declared variable is released.
          In class methods, instance variables (with the exception of access/assign variables) are
          always more visible than public variables of the same name. Use the _MEMVAR-> alias to
          access a public variable within a method if there is a name conflict. For access/assign
          variables, use the SELF: prefix to override a name conflict with a public variable.
          Public variables are dynamically scoped. They exist for the duration of the application or
          until explicitly released with CLEAR ALL or CLEAR MEMORY.
          Notes
          PUBLIC Clipper: To be compatible with Visual Objects the special public variable, Clipper,
          is initialized to TRUE when created with PUBLIC.
          Examples
          This example creates two PUBLIC arrays and one PUBLIC variable:
The following PUBLIC statements create variables and initialize them with values:
          See Also
          GLOBAL, MEMVAR, PARAMETERS, PRIVATE
1.7.1.1.4.27 RETURN
           Purpose
           Terminate a routine by returning control to the calling routine or operating system if
           executed from the Start() routine.
           Syntax
           RETURN [<uValue>]
           Arguments
           <uValue>              May be specified in a function or method definition to designate its
                                 return value. Procedure definitions do not allow <uValue> as part of the
                                 RETURN statement. See the FUNCTION and METHOD entries in this
                                 guide for information about default return values if <uValue> is not
                                 specified.
           Description
           All private variables created and local variables declared in the current routine are
           released from memory when control returns.
           Examples
           These examples illustrate the general form of the RETURN statement in a procedure and
           in a function:
                PROCEDURE <idProcedure>()
                   <Statements>...
                   RETURN
                FUNCTION <idFunction>()
                   <Statements>...
                   RETURN <uValue>
                FUNCTION PassArrayBack()
                   LOCAL aArray[10][10] AS ARRAY
                   aArray[1][1] = "myString"
                   RETURN aArray
           See Also
           BEGIN SEQUENCE, FUNCTION, LOCAL, PRIVATE, PROCEDURE, PUBLIC, QUIT
           A statement block is a list of zero or more statements that can appear on many places in
           the language
1.7.1.1.4.29 SWITCH
1.7.1.1.4.30 THROW
1.7.1.1.4.34 STATIC
            Purpose
            Declare and initialize static variables and arrays.
            Syntax
            STATIC [LOCAL] <idVar> [:= <uValue>] [, ...] [AS | IS <idType>] [, ...]
            STATIC [LOCAL] DIM <ArraySpec> [, ...] AS | IS <idType> [, ...]
            STATIC [LOCAL] <ArraySpec> [, ...] [AS ARRAY] [, ...]
            Note: The STATIC statement is shown using several syntax diagrams for convenience
            only. You can declare variables, dynamic arrays, and dimensioned arrays using a single
            STATIC statement if each definition is separated by a comma.
            Description
            The STATIC keyword serves as a lifetime modifier for variables declared with the LOCAL
            statement, preventing them from being released from memory when the creating entity
            returns to its calling routine. It is listed here as a separate entry because, the LOCAL
            keyword being optional, STATIC can stand alone in a routine as a variable declaration
            statement. Refer to the LOCAL statement for a description and notes concerning static
            variable declarations.
            See Also
            LOCAL
1.7.1.1.5 Literals
             Keyword                                        Description
             Char Literals
             Date Literals
             Logic Literals
             Macros
             NULL Literals
             Numeric Literals
             String Literals
             Keyword                                         Description
             Symbol Literals
            There are different notations for a char literal depending on the dialect selected.
            In the many dialects the single quotes are string delimiters and therefore the 'c' prefix is
            needed for character literals.
            Only in the Core and Vulcan dialects single quotes are always reserved for character
            literals
            The <char> literals in the table that are marked with an asterisk (*) may contain a special
            escape code
             Character                                       Description
             Character that does NOT start with a            Normal character
             backslash
             \\                                              Backslash
             \"                                              Double quote
             \'                                              Single quote
             \0                                              0 character
             \a                                              Alert
             \b                                              Backspace
             \f                                              Form feed
             \n                                              Newline
             \r                                              Line feed
             \t                                              Tab
             \v                                              Vertical tab
             \x HEXDIGIT(1-4)                                Hex number of character. 1-4 hex digits
             \u HEXGDIGIT (4 or 8)                           Unicode number of character. 4 or 8 hex
                                                             digits
            There are a couple of different string types inside X#. For normal strings the notation can
            be different for different dialects:
            The <char> literals in the table that are marked with an asterisk (*) may contain a special
            escape code
             Character                                      Description
             Character that does NOT start with a           Normal character
             backslash
             \\                                             Backslash
             \"                                             Double quote
             \'                                             Single quote
             \0                                             0 character
             \a                                             Alert
             \b                                             Backspace
             \f                                             Form feed
             \n                                             Newline
             \r                                             Line feed
             \t                                             Tab
             \v                                             Vertical tab
             \x HEXDIGIT(1-4)                               Hex number of character. 1-4 hex digits
             \u HEXGDIGIT (4 or 8)                          Unicode number of character. 4 or 8 hex
                                                            digits
YYYY.MM.DD
             or alternatively
                       {^YYYY-MM-DD}
Examples:
                       2000.01.01
                       2012.02.29
                       2015.09.25
                       // foxpro date and datetime literals
                       {^2019.02.28}
                       {^2020.02.29 23:59:59}
             Date and DateTime literals are supported in all dialects. In the Core dialect both date and
             datetime literals will be translated to a DateTime value. In the other dialects the Date
             literals are translated to a Date value.
             Of course you can also use runtime functions to construct a literal, such as
             STOD("20150925") or ConDate(2019,9,25) but a literal is more efficient.
              Value                                         Description
              TRUE or .T. or .Y.                            Logical TRUE
              FALSE or .F. or .N.                           Logical FALSE
             X# uses the following NULL literals. They indicate the absense of a value.
             Some of these literals require the runtime.
             Keyword                                       Description
             Integer Literals
             Real Liteals
                 12345
                 0x1234ABCD
                 0b010010101
             Suffix
             L or l                                         Signed 32 bits integer
             U or u                                         Unsigned integer
Single or double precision literals may be used to store numeric values in your code.
                 123.456
                 123.0
                 0.123
                 .123
                 123.456e+7
                 123.456e-7
             Suffix
             S or s                                         Single precision (REAL4)
             D or d                                         Double precision (REAL8)
             M or m                                         Decimal
            Floating point literals without suffix are stored as REAL8, unless you have specified
            the /vo14 compiler option, in which case they are stored as FLOAT literals.
            Symbol literals consist of the '#' character followed by one of more alphanumeric
            characters
                 #XSharp
                 #AnExample
            Even though the examples above are written in mixed case, the compiler will treat them
            as all uppercase.
            Symbol literals are compiled only once by the X# compiler for performance reasons.
            Each .Net assembly created by the X# compiler will have a special, compiler generated,
            class that contains all the literal symbols found in that assembly.
            These literals are initialized at startup and stored in the symbol table in the runtime.
1.7.1.1.6 NameSpaces
1.7.1.1.6.1 USING
                  #USING <NamespaceName>
                  USING <NamespaceName>
                  USING STATIC <StaticClassname>
1.7.1.1.7 Identifiers
            New keywords that are introduced in Vulcan and X# (see the keyword table) can also be
            used as Identifier
            When an identifier must be used that has the same value as a keyword, then you can
            prefix the identifier with a double @@ sign, like in the following example.
            This is not recommended. But it can happen that code in an external DLL has properties
            or method names that are keywords in X#. In that case using the @@ prefix can work too.
                  ID                        : IDStartChar IDChar*
                                            ;
                                        |   '\u00C0'..'\u00D6'
                                        |   '\u00D8'..'\u00F6'
                                        |   '\u00F8'..'\u02FF'
                                        |   '\u0370'..'\u037D'
                                        |   '\u037F'..'\u1FFF'
                                        |   '\u200C'..'\u200D'
                                        ;
                CLIPPER
                STRICT
                PASCAL
                FASTCALL
                THISCALL
                ASPEN
                CALLBACK
                _WINCALL
1.7.1.1.9 Comments
           //
           &&
           /* */
           The following defines can be used in your code and will be replaced by the compiler with a
           literal value:
             Name                        Type                           Value
            __ARRAYBASE__                Integer                       0 or 1 depending on the /az
                                                                       compiler option
            __CLR2__                     String Literal                __CLR2__ (only for
                                                                       compatibility with Vulcan, x#
                                                                       does not implement the /clr
                                                                       compiler option). See
                                                                       comment below.
            __CLR4__                     String Literal                __CLR4__ (only for
                                                                       compatibility with Vulcan, x#
                                                                       does not implement the /clr
           Note
           The CLR2 and CLR4 version is determined by the X# compiler by looking at the version of
           either system.dll or mscorlib.dll
            Function                                      Description
            PCOUNT()                                      This pseudo function is only available in the
                                                          VO/Vulcan dialect and only in methods or
                                                          functions with a CLIPPER calling
                                                          convention.
1.7.1.1.12 Helpers
The grammar contains several helper tokens. These are listed below
           EOS            <END OF STATEMENT> CRLF token or ';' token that indicates end of
           statement
1.7.1.2    X# Expressions
           Expressions are an important element of the language. There are many types of
           expressions. The expression rule in the compiler is the biggest rule
           The table below lists the various expression types in the order they are recognized by the
           compiler. Some expression types are covered in a separate topic.
           As you can see most expression types are recursive. They contain one or more
           references to sub expressions
Expressions
           Bound expressions are expressions that access properties or members from objects or
           structures
Primary Expressions are the simplest building blocks in the expression rule in X#
1.7.1.2.3 Codeblocks
For example
{|a,b| a*b}
           X# has extended the Codeblock rule. We now not only accept a single expression, but
           also a statement list and an expressionlist:
                             ? a
                             ? b
                    }
queryBodyClause : fromClause
| WHERE expression
1.7.1.2.5 Initializers
             X# has added two types of initializers to the language: collection Initializers and Object
             Initializers. The syntax for these is:
                   initializer                        : objectinitializer
                                                      | collectioninitializer
                                                      ;
                   initializervalue                   : objectOrCollectioninitializer
                                                      | expression
                                                      ;
             Note:
             · The initializer which is also delimited by curly braces immediately follows the closing
               curly brace of the constructor call
             An example of an object initializer:
And combined:
1.7.1.3    X# Operators
           X# has many operators. These are
           · Binary operators
           · Assignment operators
           · Logical operators
           · Bitwise operators
           · Relational operators
           · Shift operators
           · Unary operators
           · Workarea operators
1.7.1.3.1 Binary
1.7.1.3.3 Logical
            X# uses the following Bitwise (binary) operators. There are simple character versions of
            these and also pseudo functions:
            The result of a bitwise operation is best understood via ‘truth tables’. If two numbers can,
            for instance, be defined by 4 bits (expressing numbers 0 up to 15 in decimal value) then,
            when ‘Anding’ them, use the AND truth table for each bit in turn. If the values in decimal
            are 5 and 1 then their bit representations are 0101 and 0001.
1.7.1.3.5 Relational
          String comparisons
          The '=' and '==' operators behave differently for strings, and the behavior of the single
          equals also depends on a runtime setting.
          If you call SetExact(FALSE) then ‘=’ equates the characters up to the length of the string
          on the right-hand side of the operator ignoring the remaining characters on the left. This is
          the default setting. If you call SetExact(TRUE) then = and == have the same meaning for
          strings.
          The <, <=, > and >= operators for strings have a behavior that depends on a compiler
          option and a runtime setting. The -vo13 compiler option 'compatible string comparions'
          tells the compiler that it needs to use a runtime function for string comparisons. The
          behavior of this runtime function depends on the setting of SetCollation(). There are 4
          possible values for SetCollation():
           Setting                                        Description
           Clipper                                       This setting will convert both strings to
                                                         OEM strings using the current DOS
                                                         codepage. After that the strings will be
                                                         compared using the string comparison /
                                                         weight tables that are defined with
                                                         SetNatDLL(). The default comparison uses
                                                         a wight based on the byte number. Other
                                                         comparisons available are for example
                                                         GERMAN, DUTCH, FRENCH, RUSSION,
                                                         SPANISH, SLOV852 etc.
                                                         This setting should be used if your
                                                         application needs to share files with
                                                         CLIPPER programs.
           Windows                                       This setting will convert both strings to
                                                         ANSI using the current ANSI codepage.
                                                         After that the strings will be compared
                                                         using the normal windows ANSI
                                                         CompareString() code. This setting should
                                                         be used when your application shares files
                                                         with VO programs
           Unicode                                       This setting will NOT convert strings and
                                                         will do a normal Unicode string comparison
                                                         using the String.Compare() method from
                                                         the .Net
           Ordinal                                       This setting will NOT convert strings and
                                                         will do a normal Ordinal string comparison
                                                         using the String.CompareOrdinal() method
                                                          from the .Net. This is the fastest.
            The >= and <= operators for strings also take into account the setting for SetExact(). The
            'equalness' of the 2 strings is determined by the same rules as the '=' operator.
1.7.1.3.6 Shift
Note that shift operators are only supported on integral numeric types
1.7.1.3.7 Unary
Note that shift operators are only supported on integral numeric types
1.7.1.3.8 Workarea
                                                                       variable or a dynamic
                                                                       memory variable
                                                                       "NAME" (public or private).
                                                                       However the compiler will be
                                                                       able to detect the local
                                                                       variable at compile time and
                                                                       when this is not found then it
                                                                       will access the dynamic
                                                                       memory variable.
          #command
          #define
          #else
          #endif
          #endregion
          #ifdef
          #ifndef
          #include
          #line
          #region
          #translate
          #undef
Syntax
           Arguments
          <matchPattern> is the pattern the input text should match.
          The => symbol between <matchPattern> and <resultPattern> is, along with#command or
          #translate, a literal part of the syntax that must be specified in a #command or #translate
          directive. The symbol consists of an equal sign followed by a greater than symbol with no
          intervening spaces. Do not confuse the symbol with the >= or the <= comparison
          operators in the xBase language.
          Description
          #command and #translate are translation directives that define commands and
          pseudofunctions. Each directive specifies a translation rule. The rule consists of two
          portions: a match pattern and a result pattern.
          The match pattern matches a command specified in the program (.prg) file and saves
          portions of the command text (usually command arguments) for the result pattern to use.
          The result pattern then defines what will be written to the result text and how it will be
          written using the saved portions of the matching input text.
          #command and #translate are similar, but differ in the circumstance under which their
          match patterns match input text. A #command directive matches only if the input text is a
          complete statement, while #translate matches input text that is not a complete statement.
           #command defines a complete command and #translate defines clauses and
          pseudofunctions that may not form a complete statement. In general, use #command for
          most definitions and #translate for special cases.
          #command and #translate are similar to but more powerful than the #define directive.
          #define, generally, defines identifiers that control conditional compilation and manifest
          constants for commonly used constant values such as SDK codes. Refer to any of the
          header files in the INCLUDE directory for examples of manifest constants defined using
          #define.
          #command and #translate directives have the same scope as the #define directive. The
          definition is valid only for the current program (.prg) file unless defined in Std.ch or the
          header specified with the /U option on the compiler command line. If defined elsewhere,
          the definition is valid from the line where it is specified to the end of the program file.
          Unlike #define, a #translate or #command definition cannot be explicitly undefined. The
          #undef directive has no effect on a #command or #translate definition.
          As the preprocessor encounters each source line preprocessor, it scans for definitions in
          the following order of precedence: #define, #translate, and #command. When there is a
          match, the substitution is made to the result text and the entire line is reprocessed until
          there are no matches for any of the three types of definitions. #command and #translate
          rules are processed in stack-order (i.e., last in-first out, with the most recently specified
          rule processed first).
          When defining a command, there are several prerequisites to properly specifying the
          command definition. Many preprocessor commands require more than one #command
          directive because mutually exclusive clauses contain a keyword or argument. For
          example, the @...GET command has mutually exclusive VALID and RANGE clauses and
          is defined with a different #command rule to implement each clause.
This also occurs when a result pattern contains different expressions, functions, or
      parameter structures for different clauses specified for the same command (e.g., the
      @...SAY command). In Std.ch, there is a #command rule for @...SAY specified with the
      PICTURE clause and another for @...SAY specified without the PICTURE clause. Each
      formulation of the command is translated into a different expression.
      Because directives are processed in stack order, when defining more than one rule for a
      command, place the most general case first, followed by the more specific ones. This
      ensures that the proper rule will match the command specified in the program (.prg) file.
      Match Pattern
      The <matchPattern> portion of a translation directive is the pattern the input text must
      match. A match pattern is made from one or more of the following components, which
      the preprocessor tries to match against input text in a specific way:
      · Literal values are actual characters that appear in the match pattern. These characters
        must appear in the input text, exactly as specified to activate the translation directive.
      · Words are keywords and valid identifiers that are compared according to the dBASE
        convention (case-insensitive, first four letters mandatory, etc.). The match pattern must
        start with a Word.
      · #xcommand and #xtranslate can recognize keywords of more than four significant
        letters.
      · Match markers are label and optional symbols delimited by angle brackets (<>) that
        provide a substitute (idMarker) to be used in the <resultPattern> and identify the clause
        for which it is a substitute. Marker names are identifiers and must, therefore, follow the
        xBase identifier naming conventions. In short, the name must start with an alphabetic or
        underscore character, which may be followed by alphanumeric or underscore
        characters.
      · Regular match marker: Matches the next legal expression in the input text. The regular
        match marker, a simple label, is the most general and, therefore, the most likely match
        marker to use for a command argument. Because of its generality, it is used with the
        regular result marker, all of the stringify result markers, and the blockify result marker.
            The list match marker defines command clauses that have lists as arguments.
            Typically these are FIELDS clauses or expression lists used by database commands.
            When there is a match for a list match marker, the list is usually written to the result text
            using either the normal or smart stringify result marker. Often, lists are written as literal
            arrays by enclosing the result marker in curly ({ }) braces.
          · Restricted match marker: Matches input text to one of the words in a comma-
            separated list. If the input text does not match at least one of the words, the match fails
            and the marker name contains nothing.
            A restricted match marker is generally used with the logify result marker to write a
            logical value into the result text. If there is a match for the restricted match marker, the
            corresponding logify result marker writes true (.T.) to the result text; otherwise, it writes
            false (.F.). This is particularly useful when defining optional clauses that consist of a
            command keyword with no accompanying argument. Std.ch implements the REST
            clause of database commands using this form.
          · Wild match marker: Matches any input text from the current position to the end of a
            statement. Wild match markers generally match input that may not be a legal
            expression, such as
            #command NOTE <*x*> in Clippers Std.ch, gather the input text to the end of
            thestatement, and write it to the result text using one of the stringify result markers.
          · Optional match clauses are portions of the match pattern enclosed in square brackets
            ([ ]). They specify a portion of the match pattern that may be absent from the input text.
             An optional clause may contain any of the components allowed within a
            <matchPattern>, including other optional clauses.
            Optional match clauses may appear anywhere and in any order in the match pattern
            and still match input text. Each match clause may appear only once in the input text.
            There are two types of optional match clauses: one is a keyword followed by match
            marker, and the other is a keyword by itself. These two types of optional match clauses
            can match all of the traditional command clauses typical ofthe xBase command set.
            Optional match clauses are defined with a regular or list match marker to match input
            text if the clause consists of an argument or a keyword followed by an argument (see
            the INDEX clause of the USE command in Std.ch). If the optional match clause
            consists of a keyword by itself, it is matched with a restricted match marker (see the
            EXCLUSIVE or SHARED clause of the USE command in Std.ch).
            In any match pattern, you may not specify adjacent optional match clauses consisting
            solely of match markers, without generating a compiler error. You may repeat an
            optional clause any number of times in the input text, as long as it is not adjacent to any
            other optional clause. To write a repeated match clause to the result text, use repeating
            result clauses in the <resultPattern> definition.
      Result Pattern
      The <resultPattern> portion of a translation directive is the text the preprocessor will
      produce if a piece of input text matches the <matchPattern>. <resultPattern> is made
      from one or more of the following components:
· Literal tokens are actual characters that are written directly to the result text.
· Words are xBase keywords and identifiers that are written directly to the result text.
      · Result markers: refer directly to a match marker name. Input text matched by the
        match marker is written to the result text via the result marker.
      · Regular result marker: Writes the matched input text to the result text, or nothing if no
        input text is matched. Use this, the most general result marker, unless you have special
        requirements. You can use it with any of the match markers, but it almost always is
        used with the regular match marker.
      · Dumb stringify result marker: Stringifies the matched input text and writes it to the
        result text. If no input text is matched, it writes a null string (""). If the matched input text
        is a list matched by a list match marker, this result marker stringifies the entire list and
        writes it to the result text.
        This result marker writes output to result text where a string is always required. This is
        generally the case for commands where a command or clause argument is specified
        as a literal value but the result text must always be written as a string even if the
        argument is not specified.
      · Normal stringify result marker: Stringifies the matched input text and writes it to the
        result text. If no input text is matched, it writes nothing to the result text. If the matched
        input text is a list matched by a list match marker, this result marker stringifies each
        element in the list and writes it to the result text.
        The normal stringify result marker is most often used with the blockify result marker to
        compile an expression while saving a text image of the expression (See the SET
        FILTER condition and the INDEX key expression in Std.ch).
          · Smart stringify result marker: Stringifies matched input text only if source text is
            enclosed in parentheses. If no input text matched, it writes nothing to the result text. If
            the matched input text is a list matched by a list match marker, this result marker
            stringifies each element in the list (using the same stringify rule) and writes it to the
            result text.
          · Blockify result marker: Writes matched input text as a code block without any
            arguments to the result text. For example, the input text x + 3 would be written to the
            result text as {|| x + 3}. If no input text is matched, it writes nothing to the result text. If
            the matched input text is a list matched by a list match marker, this result marker
            blockifies each element in the list.
            The blockify result marker used with the regular and list match markers matches
            various kinds of expressions and writes them as code blocks to the result text.
            Remember that a code block is a piece of compiled code to execute sometime later.
            This is important when defining commands that evaluate expressions more than once
            per invocation. When defining a command, you can use code blocks to pass an
            expression to a function and procedure as data rather than as the result of an
            evaluation. This allows the target routine to evaluate the expression whenever
            necessary.
            In Std.ch, the blockify result marker defines database commands where an expression
            is evaluated for each record. Commonly, these are field or expression lists, FOR and
            WHILE conditions, or key expressions for commands that perform actions based on key
            values.
          · Logify result marker: Writes true (.T.) to the result text if any input text is matched;
            otherwise, it writes false (.F.) to the result text. This result marker does not write the
            input text itself to the result text.
            The logify result marker is generally used with the restricted match marker to write true
            (.T.) to the result text if an optional clause is specified with no argument; otherwise, it
            writes false (.F.). In Std.ch, this formulation defines the EXCLUSIVE and SHARED
            clauses of the USE command.
                Repeating clauses are the result pattern part of the #command facility that create
                optional clauses which have arguments. You can match input text with any match
                marker other than the restricted match marker and write to the result text with any of the
                corresponding result markers. Typical examples of this facility are the definitions for the
                STORE and REPLACE commands in Std.ch.
            Notes
           · Less than operator: If you specify the less than operator (<) in the <resultPattern>
             expression, you must precede it with the escape character (\).
           · Multistatement lines: You can specify more than one statement as a part of the result
             pattern by separating each statement with a semicolon. If you specify adjacent
             statements on two separate lines, the first statement must be followed by two
             semicolons.
1.7.1.4.2 #define
or
           #define lets you define a symbol, such that, by using the symbol as the expression in a
           #ifdef directive, the expression will evaluate to true or in a or #ifndef directive the
           expression will evaluate to false.
           #define also allows you define a symbolic name for a token string, so you can use the
           symbolic name in your code and the preprocessor will replace all occurences of that
           name with the token string that you have specified.
           For example:
                 #define DEBUG
                 // ...
                 #if DEBUG
                     Console.WriteLine("Debug version");
                 #endif
or
           Notes
           Please note that defines are CASE SENSITIVE, so the following code will work:
           because the preprocessor will replace the name TEST in the FUNCTION line with the value
           123 which is not a valid identifier. After preprocessing the code becomes:
1.7.1.4.3 #else
           #else lets you create a compound conditional directive, so that, if the expression in the
           preceding #ifdef directive or #ifndef directive does not evaluate to true, the compiler will
           evaluate all code between #else and the subsequent #endif.
           For example, the following code will show the string "Debug Version" if the symbol
           DEBUG is defined on the command line, else it will show the text "Release Version"
1.7.1.4.4 #endif
            #endif specifies the end of a conditional directive, which began with the #ifdef or #ifndef
            directive. For example:
1.7.1.4.5 #ifdef
            Note
            The /vo8 compiler option will change this behavior:
            when /vo8 is active then any symbol defined with TRUE or a non-0 numeric value will be
            seen as "defined", symbols defined with FALSE or a 0 numeric value will be seen as
            "undefined".
1.7.1.4.6 #ifndef
                      Console.WriteLine("Release version");
                  #endif
            Note
            when /vo8 is active then any symbol defined with FALSE or a 0 numeric value will also be
            seen as "undefined".
1.7.1.4.7 #include
            Tells the preprocessor to treat the contents of a specified file as if they appear in the
            source program at the point where the directive appears.
#include "path-spec"
            You can preprocessor definitions into include files and then use #include directives to add
            them to any source file.
            The path-spec is a file name that may optionally be preceded by a directory specification.
            The file name must name an existing file.
            The preprocessor searches for include files in this order:
            1. In the same directory as the file that contains the #include statement.
            2. Along the path that's specified by each /I compiler option.
            3. In the Include folder inside the XSharp installation folder
            4. Along the paths that are specified by the INCLUDE environment variable. (Not
               supported yet)
1.7.1.4.8 #line
            #line sets the current line number for the compiler. It is usually inserted by the
            preprocessor after preprocessing an include file to synchronize the line numbers with the
            original source file.
            where:
            line number     the new line number to use by the compiler.
            FileName        An optional new filename to use by the compiler
1.7.1.4.9 #pragma
            The #pragma directive allow you to suppress certain compiler warnings for a piece of
            code. It is not supported yet.
           #region lets you specify a block of code that you can expand or collapse when using the
           outlining feature of the Visual Studio Code Editor. In longer code files, it is convenient to be
           able to collapse or hide one or more regions so that you can focus on the part of the file
           that you are currently working on. The following example shows how to define a region:
           Comments
           A #region block must be terminated with a #endregion directive.
           A #region block cannot overlap with a #ifdef block or an #ifndef block. However, a #region
           block can be nested in a #ifdef or #ifndef block, and a #ifdef or #ifndef block can be nested
           in a #region block.
           For now the compiler does not enforce this, but it will in the not too far future.
           A #region and #endregion block may have optional comments after the #region and
           #endregion keyword. The compiler will ignore everything after the keyword until the end of
           the line
Syntax
            Arguments
           <matchPattern> is the pattern the input text should match.
           The => symbol between <matchPattern> and <resultPattern> is, along with#command or
           #translate, a literal part of the syntax that must be specified in a #command or #translate
           directive. The symbol consists of an equal sign followed by a greater than symbol with no
           intervening spaces. Do not confuse the symbol with the >= or the <= comparison
           operators in the xBase language.
           Description
           #command and #translate are translation directives that define commands and
           pseudofunctions. Each directive specifies a translation rule. The rule consists of two
           portions: a match pattern and a result pattern.
          The match pattern matches a command specified in the program (.prg) file and saves
          portions of the command text (usually command arguments) for the result pattern to use.
          The result pattern then defines what will be written to the result text and how it will be
          written using the saved portions of the matching input text.
          #command and #translate are similar, but differ in the circumstance under which their
          match patterns match input text. A #command directive matches only if the input text is a
          complete statement, while #translate matches input text that is not a complete statement.
           #command defines a complete command and #translate defines clauses and
          pseudofunctions that may not form a complete statement. In general, use #command for
          most definitions and #translate for special cases.
          #command and #translate are similar to but more powerful than the #define directive.
          #define, generally, defines identifiers that control conditional compilation and manifest
          constants for commonly used constant values such as SDK codes. Refer to any of the
          header files in the INCLUDE directory for examples of manifest constants defined using
          #define.
          #command and #translate directives have the same scope as the #define directive. The
          definition is valid only for the current program (.prg) file unless defined in Std.ch or the
          header specified with the /U option on the compiler command line. If defined elsewhere,
          the definition is valid from the line where it is specified to the end of the program file.
          Unlike #define, a #translate or #command definition cannot be explicitly undefined. The
          #undef directive has no effect on a #command or #translate definition.
          As the preprocessor encounters each source line preprocessor, it scans for definitions in
          the following order of precedence: #define, #translate, and #command. When there is a
          match, the substitution is made to the result text and the entire line is reprocessed until
          there are no matches for any of the three types of definitions. #command and #translate
          rules are processed in stack-order (i.e., last in-first out, with the most recently specified
          rule processed first).
          When defining a command, there are several prerequisites to properly specifying the
          command definition. Many preprocessor commands require more than one #command
          directive because mutually exclusive clauses contain a keyword or argument. For
          example, the @...GET command has mutually exclusive VALID and RANGE clauses and
          is defined with a different #command rule to implement each clause.
          This also occurs when a result pattern contains different expressions, functions, or
          parameter structures for different clauses specified for the same command (e.g., the
          @...SAY command). In Std.ch, there is a #command rule for @...SAY specified with the
          PICTURE clause and another for @...SAY specified without the PICTURE clause. Each
          formulation of the command is translated into a different expression.
      Because directives are processed in stack order, when defining more than one rule for a
      command, place the most general case first, followed by the more specific ones. This
      ensures that the proper rule will match the command specified in the program (.prg) file.
      Match Pattern
      The <matchPattern> portion of a translation directive is the pattern the input text must
      match. A match pattern is made from one or more of the following components, which
      the preprocessor tries to match against input text in a specific way:
      · Literal values are actual characters that appear in the match pattern. These characters
        must appear in the input text, exactly as specified to activate the translation directive.
      · Words are keywords and valid identifiers that are compared according to the dBASE
        convention (case-insensitive, first four letters mandatory, etc.). The match pattern must
        start with a Word.
      · #xcommand and #xtranslate can recognize keywords of more than four significant
        letters.
      · Match markers are label and optional symbols delimited by angle brackets (<>) that
        provide a substitute (idMarker) to be used in the <resultPattern> and identify the clause
        for which it is a substitute. Marker names are identifiers and must, therefore, follow the
        xBase identifier naming conventions. In short, the name must start with an alphabetic or
        underscore character, which may be followed by alphanumeric or underscore
        characters.
      · Regular match marker: Matches the next legal expression in the input text. The regular
        match marker, a simple label, is the most general and, therefore, the most likely match
        marker to use for a command argument. Because of its generality, it is used with the
        regular result marker, all of the stringify result markers, and the blockify result marker.
        The list match marker defines command clauses that have lists as arguments.
        Typically these are FIELDS clauses or expression lists used by database commands.
        When there is a match for a list match marker, the list is usually written to the result text
            using either the normal or smart stringify result marker. Often, lists are written as literal
            arrays by enclosing the result marker in curly ({ }) braces.
          · Restricted match marker: Matches input text to one of the words in a comma-
            separated list. If the input text does not match at least one of the words, the match fails
            and the marker name contains nothing.
            A restricted match marker is generally used with the logify result marker to write a
            logical value into the result text. If there is a match for the restricted match marker, the
            corresponding logify result marker writes true (.T.) to the result text; otherwise, it writes
            false (.F.). This is particularly useful when defining optional clauses that consist of a
            command keyword with no accompanying argument. Std.ch implements the REST
            clause of database commands using this form.
          · Wild match marker: Matches any input text from the current position to the end of a
            statement. Wild match markers generally match input that may not be a legal
            expression, such as
            #command NOTE <*x*> in Clippers Std.ch, gather the input text to the end of
            thestatement, and write it to the result text using one of the stringify result markers.
          · Optional match clauses are portions of the match pattern enclosed in square brackets
            ([ ]). They specify a portion of the match pattern that may be absent from the input text.
             An optional clause may contain any of the components allowed within a
            <matchPattern>, including other optional clauses.
            Optional match clauses may appear anywhere and in any order in the match pattern
            and still match input text. Each match clause may appear only once in the input text.
            There are two types of optional match clauses: one is a keyword followed by match
            marker, and the other is a keyword by itself. These two types of optional match clauses
            can match all of the traditional command clauses typical ofthe xBase command set.
            Optional match clauses are defined with a regular or list match marker to match input
            text if the clause consists of an argument or a keyword followed by an argument (see
            the INDEX clause of the USE command in Std.ch). If the optional match clause
            consists of a keyword by itself, it is matched with a restricted match marker (see the
            EXCLUSIVE or SHARED clause of the USE command in Std.ch).
            In any match pattern, you may not specify adjacent optional match clauses consisting
            solely of match markers, without generating a compiler error. You may repeat an
            optional clause any number of times in the input text, as long as it is not adjacent to any
            other optional clause. To write a repeated match clause to the result text, use repeating
            result clauses in the <resultPattern> definition.
          Result Pattern
          The <resultPattern> portion of a translation directive is the text the preprocessor will
          produce if a piece of input text matches the <matchPattern>. <resultPattern> is made
          from one or more of the following components:
· Literal tokens are actual characters that are written directly to the result text.
· Words are xBase keywords and identifiers that are written directly to the result text.
      · Result markers: refer directly to a match marker name. Input text matched by the
        match marker is written to the result text via the result marker.
      · Regular result marker: Writes the matched input text to the result text, or nothing if no
        input text is matched. Use this, the most general result marker, unless you have special
        requirements. You can use it with any of the match markers, but it almost always is
        used with the regular match marker.
      · Dumb stringify result marker: Stringifies the matched input text and writes it to the
        result text. If no input text is matched, it writes a null string (""). If the matched input text
        is a list matched by a list match marker, this result marker stringifies the entire list and
        writes it to the result text.
        This result marker writes output to result text where a string is always required. This is
        generally the case for commands where a command or clause argument is specified
        as a literal value but the result text must always be written as a string even if the
        argument is not specified.
      · Normal stringify result marker: Stringifies the matched input text and writes it to the
        result text. If no input text is matched, it writes nothing to the result text. If the matched
        input text is a list matched by a list match marker, this result marker stringifies each
        element in the list and writes it to the result text.
        The normal stringify result marker is most often used with the blockify result marker to
        compile an expression while saving a text image of the expression (See the SET
        FILTER condition and the INDEX key expression in Std.ch).
      · Smart stringify result marker: Stringifies matched input text only if source text is
        enclosed in parentheses. If no input text matched, it writes nothing to the result text. If
        the matched input text is a list matched by a list match marker, this result marker
        stringifies each element in the list (using the same stringify rule) and writes it to the
        result text.
          · Blockify result marker: Writes matched input text as a code block without any
            arguments to the result text. For example, the input text x + 3 would be written to the
            result text as {|| x + 3}. If no input text is matched, it writes nothing to the result text. If
            the matched input text is a list matched by a list match marker, this result marker
            blockifies each element in the list.
            The blockify result marker used with the regular and list match markers matches
            various kinds of expressions and writes them as code blocks to the result text.
            Remember that a code block is a piece of compiled code to execute sometime later.
            This is important when defining commands that evaluate expressions more than once
            per invocation. When defining a command, you can use code blocks to pass an
            expression to a function and procedure as data rather than as the result of an
            evaluation. This allows the target routine to evaluate the expression whenever
            necessary.
            In Std.ch, the blockify result marker defines database commands where an expression
            is evaluated for each record. Commonly, these are field or expression lists, FOR and
            WHILE conditions, or key expressions for commands that perform actions based on key
            values.
          · Logify result marker: Writes true (.T.) to the result text if any input text is matched;
            otherwise, it writes false (.F.) to the result text. This result marker does not write the
            input text itself to the result text.
            The logify result marker is generally used with the restricted match marker to write true
            (.T.) to the result text if an optional clause is specified with no argument; otherwise, it
            writes false (.F.). In Std.ch, this formulation defines the EXCLUSIVE and SHARED
            clauses of the USE command.
            Repeating clauses are the result pattern part of the #command facility that create
            optional clauses which have arguments. You can match input text with any match
            marker other than the restricted match marker and write to the result text with any of the
            corresponding result markers. Typical examples of this facility are the definitions for the
            STORE and REPLACE commands in Std.ch.
            Notes
           · Less than operator: If you specify the less than operator (<) in the <resultPattern>
             expression, you must precede it with the escape character (\).
           · Multistatement lines: You can specify more than one statement as a part of the result
             pattern by separating each statement with a semicolon. If you specify adjacent
             statements on two separate lines, the first statement must be followed by two
             semicolons.
1.7.1.4.12 #undef
#undef identifier
           #undef lets you undefine a symbol, such that, by using the symbol as the expression in a
           #ifdef directive, the expression will evaluate to false or in a or #ifndef directive the
           expression will evaluate to true.
1.7.1.5    X# Walkthroughs
           Enter topic text here.
           If you use a standard Command Prompt window, you must adjust your path before you
           can invoke xsc.exe from any subdirectory on your computer.
           You can also use MSBuild to build X# programs programmatically. For more information,
           see the MSBuild documentation on MSDN.
           The xsc.exe executable file usually is located in the {Program Files}\XSharp\Bin folder
           under the Windows directory.
           When you build programs with the Visual Studio IDE then Visual Studio will locate the X#
           compiler automatically for you and the build output from the compiler will be shown in the
           Output Windows of Visual Studio.
           You can set the verbosity level of the compiler output from the Tools/Options, Projects
           and Solutions, Build and Run page.
           xsc -define:DEBUG -optimize -out:File.exe *.prg        Compiles all the X# files in the current
                                                                  directory, with optimizations on and defines
                                                                  the DEBUG symbol. The output is File2.exe
           xsc /target:library /out:File2.dll /warn:0 /nologo /   Compiles all the X# files in the current
           debug *.prg                                            directory producing a debug version of
                                                                  File2.dll. No logo and no warnings are
                                                                  displayed
           xsc /target:library /out:MyBase.rdd *.prg              Compiles all the X# files in the current
                                                                  directory to MyBase.rdd (a DLL):
Dialect support
          Option                         Purpose
          -dialect                       Specifies the dialect to use when compiling. The following
                                         values are supported: Core, VO, Vulcan, dBase, FoxPro,
                                         xBase++ and Harbour. Work on the VO and Vulcan
                                         dialects has started.
XBase Compatibility
          Option                         Purpose
          -az                            Specifies that arrays are zero-based rather than one-
                                         based
          -cs                            Specifies that the compiler should use case-sensitive type
                                         names
          -d                             Instruct the compiler to emit debugging information. (short
                                         for /debug)
          -fovf                          Specifies that exceptions will be raised on invalid floating
                                         point operations
          -i                             Specifies a directory to add to the #include file search
                                         path
          -ins                           Use implicit namespace lookup mechanism
          -lb                            Specifies that the compiler should generate late bound
                                         calls when necessary
          -memvar                        Enables support for memory variables
          -namedargs                     Specifies whether to allow named arguments in the parser
                                         or not.
          -nostddefs                     Suppresses preprocessor definitions in XSharpDefs.xh
          -ns                            Specify the default namespace for the output assembly
          -ovf                           Specifies that exceptions will be raised on integer
                                         overflows
          -ppo                           Writes preprocessor output to file
           Option          Purpose
           -showincludes   Lists #include files in compiler output
           -snk            Signs assembly with strong name key pair
           -undeclared     Enables support for undeclared variables
           -vo1            Use Init and Axit methods in stead of Constructors and
                           Destructors
           -vo2            Initialize STRING variables, fields and DIM arrays to empty
                           strings
           -vo3            Treats All Methods As VIRTUAL
           -vo4            Allows implicit signed/unsigned integer conversions
           -vo5            Implicit CLIPPER Calling Convention for Zero-Argument
                           Functions
           -vo6            Resolves typed function pointers to PTR
           -vo7            Allows compatible implicit casts and conversions
           -vo8            Enables compatible preprocessor behavior
           -vo9            Allows missing RETURN statements
           -vo10           Enables compatible IIF behavior
           -vo11           Enables Visual Objects compatible arithmetic
                           conversions
           -vo12           Enables Clipper compatible integer divisions
           -vo13           Enables Visual Objects compatible string comparisons
           -vo14           Insert floating point literals as FLOAT
           -vo15           Allow untyped Locals and return types
           -vo16           Automatically generate Clipper calling convention
                             constructors for classes without constructor
           -w              This option is not supported. use -NoWarn in stead
           -wx             Treats all warnings as errors (alias for -warnaserror)
Optimization
           Option          Purpose
           -filealign      Specifies the size of sections in the output file.
           -optimize       Enables/disables optimizations.
Output files
      Option              Purpose
      -doc                Specifies an XML file where processed documentation
                          comments are to be written.
      -modulename         Specify the name of the source module
      -out                Specifies the output file.
      -pathmap            Specify a mapping for source path names output by the
                          compiler.
      -pdb                Specifies the file name and location of the .pdb file.
      -platform           Specify the output platform.
      -preferreduilang    Specify a language for compiler output.
      -target             Specifies the format of the output file using one of five
                          options: /target:appcontainerexe, /target:exe, /target:library,
                          /target:module, /target:winexe, or /target:winmdobj.
      -touchedfiles       Specify filename that will be updated with list of files read
                          and written by the compiler
.NET Assemblies
      Option              Purpose
      -analyzer           Run the analyzers from this assembly (Short form: /a)
      -additionalfile     Names additional files that don't directly affect code
                          generation but may be used by analyzers for producing
                          errors or warnings.
      -addmodule          Specifies one or more modules to be part of this
                          assembly.
      -delaysign          Instructs the compiler to add the public key but to leave the
                          assembly unsigned.
      -keycontainer       Specifies the name of the cryptographic key container.
      -keyfile            Specifies the filename containing the cryptographic key.
      -lib                Specifies the location of assemblies referenced by means
                          of /reference.
      -nostdlib           Instructs the compiler not to import the standard library
                          (mscorlib.dll).
      -reference          Imports metadata from a file that contains an assembly.
           Option              Purpose
           -checked            Specifies whether integer arithmetic that overflows the
                               bounds of the data type will cause an exception at run
                               time.
           -debug              Instruct the compiler to emit debugging information.
           -errorendlocation   Output line and column of the end location of each error
           -errorreport        Sets error reporting behavior.
           -fullpaths          Specifies the absolute path to the file in compiler output.
           -nowarn             Suppresses the compiler's generation of specified
                               warnings.
           -ruleset            Specify a ruleset file that disables specific diagnostics.
           -warn               Sets the warning level.
           -warnaserror        Promotes warnings to errors.
           -wx                 This is an alias for the -warnaserror option
Preprocessor
           Option              Purpose
           -define             Defines preprocessor symbols.
           -i                  Specifies a directory to add to the #include file search
                               path
           -ppo                Writes preprocessor output to file
           -nostddef           Suppresses preprocessor definitions in XSharpDefs.xh
           -showdefs           Show the defines that are added from the header files and
                               their usage
           -showincludes       Lists #include files in compiler output
Resources
           Option              Purpose
           -link               Makes COM type information in specified assemblies
                               available to the project.
           -linkresource       Creates a link to a managed resource.
           -resource           Embeds a .NET Framework resource into the output file.
           -win32icon          Specifies an .ico file to insert into the output file.
      Option               Purpose
      -win32res            Specifies a Win32 resource to insert into the output file.
Miscellaneous
      Option               Purpose
      @                    Specifies a response file.
      -?                   Lists compiler options to stdout.
      -appconfig           Specify an application configuration file containing
                           assembly binding settings
      -baseaddress         Specifies the preferred base address at which to load a
                           DLL.
      -checksumalgorithm   Specify the algorithm for calculating the source file
                           checksum stored in PDB. Supported values are: SHA1
                           (default) or SHA256.
      -codepage            Specifies the code page to use for all source code files in
                           the compilation.
      -help                Lists compiler options to stdout.
      -highentropyva       Specifies that the executable file supports address space
                           layout randomization (ASLR).
      -langversion         Specify language version mode: core, VO, Vulcan,
                           Harbour, FoxPro, dBase
      -main                Specifies the location of the Main method.
      -noconfig            Instructs the compiler not to compile with xsc.rsp.
      -nologo              Suppresses compiler banner information.
      -parallel            Specifies whether to use concurrent build (+).
      -recurse             Searches subdirectories for source files to compile.
      -s                   Syntax check only
      -subsystemversion    Specifies the minimum version of the subsystem that the
                           executable file can use.
      -unsafe              Enables compilation of code that uses the unsafe
                           keyword.
      -utf8output          Displays compiler output using UTF-8 encoding.
      -win32manifest       Specify a user-defined Win32 application manifest file to
                           be embedded into a executable file.
           Option                        Purpose
           @                             Specifies a response file.
           -?                            Lists compiler options to stdout.
           -additionalfile               Names additional files that don't directly affect code
                                         generation but may be used by analyzers for producing
                                         errors or warnings.
           -addmodule                    Specifies one or more modules to be part of this
                                         assembly.
           -analyzer                     Run the analyzers from this assembly (Short form: /a)
           -appconfig                    Specify an application configuration file containing
                                         assembly binding settings
           -az                           Specifies that arrays are zero-based rather than one-
                                         based
           -baseaddress                  Specifies the preferred base address at which to load a
                                         DLL.
           -checked                      Specifies whether integer arithmetic that overflows the
                                         bounds of the data type will cause an exception at run
                                         time.
           -checksumalgorithm            Specify the algorithm for calculating the source file
                                         checksum stored in PDB. Supported values are: SHA1
                                         (default) or SHA256.
           -codepage                     Specifies the code page to use for all source code files in
                                         the compilation.
           -cs                           Specifies that the compiler should use case-sensitive type
                                         names
           -debug -d                     Instruct the compiler to emit debugging information.
           -define                       Defines preprocessor symbols.
           -dialect                      Specifies the dialect to use when compiling. The following
                                         values are supported: Core, VO, Vulcan, dBase, FoxPro,
                                         xBase++ and Harbour. Work on the VO and Vulcan
                                         dialects has started.
           -delaysign                    Instructs the compiler to add the public key but to leave the
                                         assembly unsigned.
           -doc                          Specifies an XML file where processed documentation
                                         comments are to be written.
           -errorendlocation             Output line and column of the end location of each error
      Option               Purpose
      -errorreport         Sets error reporting behavior.
      -filealign           Specifies the size of sections in the output file.
      -fovf                Specifies that exceptions will be raised on invalid floating
                           point operations
      -fullpaths           Specifies the absolute path to the file in compiler output.
      -help                Lists compiler options to stdout.
      -highentropyva       Specifies that the executable file supports address space
                           layout randomization (ASLR).
      -i                   Specifies a directory to add to the #include file search
                           path
      -ins                 Use implicit namespace lookup mechanism
      -keycontainer        Specifies the name of the cryptographic key container.
      -keyfile             Specifies the filename containing the cryptographic key.
      -lb                  Specifies that the compiler should generate late bound
                           calls when necessary
      -langversion         Specify language version mode: core, VO, Vulcan,
                           Harbour, FoxPro, dBase
      -lib                 Specifies the location of assemblies referenced by means
                           of /reference.
      -link                Makes COM type information in specified assemblies
                           available to the project.
      -linkresource        Creates a link to a managed resource.
      -main                Specifies the location of the Main method.
      -memvar              Enable support for memory variables
      -modulename          Specify the name of the source module
      -namedargs           Specifies whether to allow named arguments in the parser
                           or not.
      -nostddefs           Suppresses preprocessor definitions in XSharpDefs.xh
      -ns                  Specify the default namespace for the output assembly
      -noconfig            Instructs the compiler not to compile with xsc.rsp.
      -nologo              Suppresses compiler banner information.
      -nostdlib            Instructs the compiler not to import the standard library
                           (mscorlib.dll).
      -nowarn              Suppresses the compiler's generation of specified
                           warnings.
           Option              Purpose
           -optimize           Enables/disables optimizations.
           -ovf                Specifies that exceptions will be raised on integer
                               overflows
           -out                Specifies the output file.
           -parallel           Specifies whether to use concurrent build (+).
           -pathmap            Specify a mapping for source path names output by the
                               compiler.
           -pdb                Specifies the file name and location of the .pdb file.
           -platform           Specify the output platform.
           -ppo                Writes preprocessor output to file
           -preferreduilang    Specify a language for compiler output.
           -recurse            Searches subdirectories for source files to compile.
           -reference          Imports metadata from a file that contains an assembly.
           -resource           Embeds a .NET Framework resource into the output file.
           -ruleset            Specify a ruleset file that disables specific diagnostics.
           -s                  Syntax check only
           -showdefs           Show the defines that are added from the header files and
                               their usage
           -showincludes       Lists #include files in compiler output
           -snk                Signs assembly with strong name key pair
           -subsystemversion   Specifies the minimum version of the subsystem that the
                               executable file can use.
           -target             Specifies the format of the output file using one of five
                               options: /target:appcontainerexe, /target:exe, /target:library,
                               /target:module, /target:winexe, or /target:winmdobj.
           -touchedfiles       Specify filename that will be updated with list of files read
                               and written by the compiler
           -undeclared         Enables the support for undeclared memory variables
           -unsafe             Enables compilation of code that uses the unsafe
                               keyword.
           -utf8output         Displays compiler output using UTF-8 encoding.
           -vo1                Use Init and Axit methods in stead of Constructors and
                               Destructors
           -vo2                Initialize STRING variables, fields and DIM arrays to empty
                               strings
              Option                     Purpose
              -vo3                       Treats All Methods As VIRTUAL
              -vo4                       Allows implicit signed/unsigned integer conversions
              -vo5                       Implicit CLIPPER Calling Convention for Zero-Argument
                                         Functions
              -vo6                       Resolves typed function pointers to PTR
              -vo7                       Allows compatible implicit casts and conversions
              -vo8                       Enables compatible preprocessor behavior
              -vo9                       Allows missing RETURN statements
              -vo10                      Enables compatible IIF behavior
              -vo11                      Enables Visual Objects compatible arithmetic
                                         conversions
              -vo12                      Enables Clipper compatible integer divisions
              -vo13                      Enables Visual Objects compatible string comparisons
              -vo14                      Insert floating point literals as FLOAT
              -vo15                      Allow untyped Locals and return types
              -vo16                      Automatically generate Clipper calling convention
                                           constructors for classes without constructor
              -w                         This option is not supported. use -NoWarn in stead
              -warn                      Sets the warning level.
              -warnaserror               Promotes warnings to errors.
              -win32icon                 Specifies an .ico file to insert into the output file.
              -win32manifest             Specify a user-defined Win32 application manifest file to
                                         be embedded into a executable file.
              -win32res                  Specifies a Win32 resource to insert into the output file.
              -wx                        Treats all warnings as errors (alias for -warnaserror)
1.7.2.3.1 @
          The @ option lets you specify a file that contains compiler options and source code files to
          compile.
Syntax
@response_file
          Arguments
          response_file       A file that lists compiler options or source code files to compile.
          Remarks
          The compiler options and source code files will be processed by the compiler just as if
          they had been specified on the command line.
          To specify more than one response file in a compilation, specify multiple response file
          options. For example:
@file1.rsp @file2.rsp
          In a response file, multiple compiler options and source code files can appear on one line.
          A single compiler option specification must appear on one line (cannot span multiple
          lines). Response files can have comments that begin with the # symbol.
          Specifying compiler options from within a response file is just like issuing those
          commands on the command line. See Building from the Command Line for more
          information.
          The compiler processes the command options as they are encountered. Therefore,
          command line arguments can override previously listed options in response files.
          Conversely, options in a response file will override options listed previously on the
          command line or in other response files.
          X# provides the xsc.rsp file, which is located in the same directory as the xsc.exe file. See
          -noconfig for more information on xsc.rsp.
          This compiler option cannot be set in the Visual Studio development environment, nor can
          it be changed programmatically.
          Example
          The following are a few lines from a sample response file:
1.7.2.3.2 -additionalfile
             The -additionalfile commandline option allows you to include extra files in the assembly.
             To support this scenario the X# compiler can accept additional, non-source text files as
             inputs.
             Syntax
-additionalfile:file
             For example, an analyzer may enforce that a set of banned terms is not used within a
             project, or that every source file has a certain copyright header. The terms or copyright
             header could be passed to the analyzer as an additional file, rather than being hard-coded
             in the analyzer itself.
             Example
             On the command line, additional files can be passed using The -additionalfile option. For
             example:
1.7.2.3.3 -addmodule
             This option adds a module that was created with the target:module switch to the current
             compilation.
Syntax
-addmodule:file[;file2]
             Arguments
             file, file2         An output file that contains metadata. The file cannot contain an
                                 assembly manifest. To import more than one file, separate file names
                                 with either a comma or a semicolon.
             Remarks
             All modules added with -addmodule must be in the same directory as the output file at run
             time. That is, you can specify a module in any directory at compile time but the module
            must be in the application directory at run time. If the module is not in the application
            directory at run time, you will get a TypeLoadException.
            file cannot contain an assembly. For example, if the output file was created with -
            target:module, its metadata can be imported with -addmodule.
            If the output file was created with a -target option other than -target:module, its metadata
            cannot be imported with -addmodule but can be imported with -reference.
            This compiler option is unavailable in Visual Studio; a project cannot reference a module.
            In addition, this compiler option cannot be changed programmatically.
            Example
            Compile source file input.prg and add metadata from metad1.netmodule and
            metad2.netmodule to produce out.exe:
1.7.2.3.4 -analyzer, -a
1.7.2.3.5 -appconfig
Syntax
-appconfig:file
            Arguments
            file                Required. The application configuration file that contains assembly
                                binding settings.
            Remarks
            One use of -appconfig is advanced scenarios in which an assembly has to reference both
            the .NET Framework version and the .NET Framework for Silverlight version of a
            particular reference assembly at the same time. For example, a XAML designer written in
      Windows Presentation Foundation (WPF) might have to reference both the WPF
      Desktop, for the designer's user interface, and the subset of WPF that is included with
      Silverlight. The same designer assembly has to access both assemblies. By default, the
      separate references cause a compiler error, because assembly binding sees the two
      assemblies as equivalent.
      The -appconfig compiler option enables you to specify the location of an app.config file
      that disables the default behavior by using a <supportPortability> tag, as shown in the
      following example.
      The compiler passes the location of the file to the CLR's assembly-binding logic.
       
      Note
      If you are using the Microsoft Build Engine (MSBuild) to build your application, you can set
      The -appconfig compiler option by adding a property tag to the .xsproj file. To use the
      app.config file that is already set in the project, add property tag
      <UseAppConfigForCompiler> to the .xsproj file and set its value to true. To specify a
      different app.config file, add property tag <AppConfigForCompiler> and set its value to the
      location of the file.
      Example
      The following example shows an app.config file that enables an application to have
      references to both the .NET Framework implementation and the .NET Framework for
      Silverlight implementation of any .NET Framework assembly that exists in both
      implementations. The -appconfig compiler option specifies the location of this app.config
      file.
         <configuration>
               <runtime>
                 <assemblyBinding>
                     <supportPortability PKT="7cec85d7bea7798e" enable="false"/>
                     <supportPortability PKT="31bf3856ad364e35" enable="false"/>
               </assemblyBinding>
               </runtime>
         </configuration>
1.7.2.3.6 -az
The -az option specifies that array elements begin with 0, rather than with 1 (the default).
Syntax
-az[+|-]
           Arguments
           + |-                  Specifying +, or just -az, directs the compiler to use 0-based array
                                 indexing rather than 1-based indexing.
           Remarks
           This option is off by default, since it would break existing Visual Objects source code. If
           you prefer to use 0-based arrays with existing code written for Visual Objects, you will
           need to examine every place in your source code that uses arrays and manually make the
           appropriate adjustments.
           Note: This option does not affect how the assembly being compiled is used from other
           applications. When The -az option is not used, the compiler generates code to subtract 1
           from the array index in order to provide 1-based array indexing semantics at the language
           level. When The -az option is used, the compiler does not adjust array indexes. Either
           way, the resulting arrays are always 0-based at the IL level, which allows compatibility with
           all other .NET languages.
Example
1.7.2.3.7 -baseaddress
           The -baseaddress option lets you specify the preferred base address at which to load a
           DLL.
Syntax
-baseaddress:address
           Arguments
           address             The base address for the DLL. This address can be specified as a
                               decimal, hexadecimal, or octal number.
           Remarks
           The default base address for a DLL is set by the .NET Framework common language
           runtime.
           Be aware that the lower-order word in this address will be rounded. For example, if you
           specify 0x11110001, it will be rounded to 0x11110000.
To complete the signing process for a DLL, use SN.EXE with the -R option.
1.7.2.3.8 -checked
           The -checked option specifies whether an integer arithmetic statement that results in a
           value that is outside the range of the data type, and that is not in the scope of a checked or
           unchecked keyword, causes a run-time exception.
Syntax
-checked[+ | -]
           Remarks
           An integer arithmetic statement that is in the scope of a checked or unchecked keyword is
           not subject to the effect of The -checked option.
           The default value for this option is -checked-. One scenario for using -checked- is in
           building large applications. Sometimes automated tools are used to build such
           applications, and such a tool might automatically set -checked to +. You can override the
           tool's global default by specifying -checked-.
The VO Compatibility compiler options -ovf and -fovf both set this option
           Example
           The following command compiles t2.prg. The use of -checked in the command specifies
           that any integer arithmetic statement in the file that is not in the scope of a checked or
           unchecked keyword, and that results in a value that is outside the range of the data type,
           causes an exception at run time.
1.7.2.3.9 -checksumalgorithm
           Specify the algorithm for calculating the source file checksum stored in PDB. Supported
           values are: SHA1 (default) or SHA256.
Syntax
-checksumalgorithm:<alg>
Arguments
1.7.2.3.10 -codepage
           This option specifies which codepage to use during compilation if the required page is not
           the current default codepage for the system.
Syntax
-codepage:id
           Arguments
           id                    The id of the code page to use for all source code files in the
                                 compilation.
           Remarks
           If you compile one or more source code files that were not created to use the default code
           page on your computer, you can use The -codepage option to specify which code page
           should be used. -codepage applies to all source code files in your compilation.
           If the source code files were created with the same codepage that is in effect on your
           computer or if the source code files were created with UNICODE or UTF-8, you need not
           use -codepage.
           See GetCPInfo for information on how to find which code pages are supported on your
           system.
1.7.2.3.11 -cs
           The -cs option directs the compiler to treat all identifiers and type names as case-
           sensitive.
This option is not supported yet in the current version of the compiler
Syntax
-cs[+|-]
           Arguments
           +|-                 Specifying +, or just -cs, directs the compiler to treat all type names as
                               case-sensitive.
           Remarks
           This option is for those users who prefer a case-sensitive language.
           This option does not affect preprocessor symbols. The -vo8 compiler option controls
           case-sensitivitiy in the preprocessor.
This option also does not affect keywords. Keywords in X# are always case-insensitive.
1.7.2.3.12 -debug
           The -debug option causes the compiler to generate debugging information and place it in
           the output file or files.
Syntax
                 -debug[+ | -]
                 -debug:{full | pdbonly}
           Arguments
           + |-                Specifying +, or just -debug, causes the compiler to generate
                               debugging information and place it in a program database (.pdb file).
                               Specifying -, which is in effect if you do not specify -debug, causes no
                               debug information to be created.
      full | pdbonly      Specifies the type of debugging information generated by the compiler.
                          The full argument, which is in effect if you do not specify -
                          debug:pdbonly, enables attaching a debugger to the running program.
                          Specifying pdbonly allows source code debugging when the program
                          is started in the debugger but will only display assembler when the
                          running program is attached to the debugger.
      Remarks
      Use this option to create debug builds. If -debug, -debug+, or -debug:full is not specified,
      you will not be able to debug the output file of your program.
      If you use -debug:full, be aware that there is some impact on the speed and size of JIT
      optimized code and a small impact on code quality with -debug:full. We recommend -
      debug:pdbonly or no PDB for generating release code.
       Note
      One difference between -debug:pdbonly and -debug:full is that with -debug:full the
      compiler emits a DebuggableAttribute, which is used to tell the JIT compiler that debug
      information is available. Therefore, you will get an error if your code contains the
      DebuggableAttribute set to false if you use -debug:full.
      For more information on how to configure the debug performance of an application, see
      Making an Image Easier to Debug.
For information on how to set this compiler option programmatically, see DebugSymbols.
      Example
      Place debugging information in output file app.pdb:
1.7.2.3.13 -define
           The -define compiler option defines name as a symbol in all source code files your
           program.
Syntax
-define:name[;name2]
           Arguments
           name, name2         The name of one or more symbols that you want to define.
           Remarks
           The -define option has the same effect as using a #define preprocessor directive except
           that the compiler option is in effect for all files in the project. A symbol remains defined in a
           source file until an #undef directive in the source file removes the definition. When you use
           The -define option, an #undef directive in one file has no effect on other source code files
           in the project.
           You can use symbols created by this option with #if, #else, #elif, and #endif to compile
           source files conditionally.
           You can define multiple symbols with -define by using a semicolon or comma to separate
           symbol names. For example:
-define:DEBUG;TUESDAY
           The X# compiler defines a couple of symbols automatically. See the Macros topic
           elsewhere in this documentation.
Example
                -/ preprocessor_define.prg
                -/ compile with: -define:xx
                -/ or uncomment the next line
                -/ #define xx
                using System;
                public class Test
                {
                    public static void Main()
                    {
                        #if (xx)
                            Console.WriteLine("xx defined");
                        #else
                            Console.WriteLine("xx not defined");
                        #endif
                    }
                }
1.7.2.3.14 -delaysign
           This compiler option causes the compiler to reserve space in the output file so that a
           digital signature can be added later.
Syntax
-delaysign[ + | - ]
           Arguments
           + | -               Use -delaysign- if you want a fully signed assembly. Use -delaysign+ if
                               you only want to place the public key in the assembly. The default is -
                               delaysign-.
           Remarks
           The -delaysign option has no effect unless used with -keyfile or -keycontainer.
           When you request a fully signed assembly, the compiler hashes the file that contains the
           manifest (assembly metadata) and signs that hash with the private key. The resulting
           digital signature is stored in the file that contains the manifest. When an assembly is delay
           signed, the compiler does not compute and store the signature, but reserves space in the
           file so the signature can be added later.
            For example, using -delaysign+ allows a tester to put the assembly in the global cache.
            After testing, you can fully sign the assembly by placing the private key in the assembly
            using the Assembly Linker utility.
            For more information, see Creating and Using Strong-Named Assemblies and Delay
            Signing an Assembly.
For information on how to set this compiler option programmatically, see DelaySign.
1.7.2.3.15 -dialect
            The -dialect compiler option selects the dialect that the compiler should follow. Valid
            options are: Core, VO, Vulcan, dBase, FoxPro, xBase++ and Harbour.
Syntax
            Arguments
            Core              Use the Core dialect. This is like C# with an xBase syntax.
            VO                This activates the VO dialect.
            Vulcan            This activates the Vulcan dialect.
            Harbour           This activates the Harbour dialect.
            XBasePP           This activates the Harbour dialect.
1.7.2.3.16 -doc
The -doc compiler option allows you to place documentation comments in an XML file.
Syntax
-doc:file
Arguments
           file                 The output file for XML, which is populated with the comments in the
                                source code files of the compilation.
           Remarks
           In source code files, documentation comments that precede the following can be
           processed and added to the XML file:
The source code file that contains Main is output first into the XML.
           To use the generated .xml file for use with the IntelliSense feature, let the file name of the
           .xml file be the same as the assembly you want to support and then make sure the .xml
           file is in the same directory as the assembly. Thus, when the assembly is referenced in
           the Visual Studio project, the .xml file is found as well. See Supplying Code Comments
           and for more information.
           Unless you compile with -target:module, file will contain <assembly></assembly> tags
           specifying the name of the file containing the assembly manifest for the output file of the
           compilation.
            
           Note
           The -doc option applies to all input files; or, if set in the Project Settings, all files in the
           project. To disable warnings related to documentation comments for a specific file or
           section of code, use #pragma warning.
1.7.2.3.17 -errorendlocation
           The -errorendlocation tells the compiler to Output the line and column of the end location
           of each error in addition to the start location of the error/
Syntax
-errorendlocation
            Remarks
            This compiler option is unavailable in Visual Studio and cannot be changed
            programmatically. It is enabled by default when compiling inside Visual Studio.
1.7.2.3.18 -errorreport
This compiler option provides a convenient way to report a X# internal compiler error
             Note
            On Windows Vista and Windows Server 2008, the error reporting settings that you make
            for Visual Studio do not override the settings made through Windows Error Reporting
            (WER). WER settings always take precedence over Visual Studio error reporting settings.
Syntax
            Arguments
            none     Reports about internal compiler errors will not be collected or sent to Microsoft.
            prompt               Prompts you to send a report when you receive an internal compiler
                                 error. prompt is the default when you compile an application in the
                                 development environment.
            queue                Queues the error report. When you log on with administrative
                                 credentials, you can report any failures since the last time that you
                                 were logged on. You will not be prompted to send reports for failures
                                 more than once every three days. queue is the default when you
                                 compile an application at the command line.
Remarks
            An internal compiler error (ICE) results when the compiler cannot process a source code
            file. When an ICE occurs, the compiler does not produce an output file or any useful
            diagnostic that you can use to fix your code.
A user's ability to send reports depends on computer and user policy permissions.
            For more information about error debugger, see Description of the Dr. Watson for
            Windows (Drwtsn32.exe) Tool.
1.7.2.3.19 -filealign
The -filealign compiler option lets you specify the size of sections in your output file.
Syntax
-filealign:number
            Arguments
            number               A value that specifies the size of sections in the output file. Valid values
                                 are 512, 1024, 2048, 4096, and 8192. These values are in bytes.
            Remarks
            Each section will be aligned on a boundary that is a multiple of The -filealign value. There
            is no fixed default. If -filealign is not specified, the common language runtime picks a
            default at compile time.
            By specifying the section size, you affect the size of the output file. Modifying section size
            may be useful for programs that will run on smaller devices.
1.7.2.3.20 -fovf
            The -fovf compiler option is an alias for the -checked command line option for compatibility
            with Vulcan.
1.7.2.3.21 -fullpaths
            The -fullpaths option causes the compiler to specify the full path to the file when listing
            compilation errors and warnings.
Syntax
-fullpaths
            Remarks
            By default, errors and warnings that result from compilation specify the name of the file in
            which an error was found. The -fullpaths option causes the compiler to specify the full
            path to the file.
1.7.2.3.22 -help, /?
            This option sends a listing of compiler options, and a brief description of each option, to
            stdout.
Syntax
                   -help
                   -?
            Remarks
            If this option is included in a compilation, no output file will be created and no compilation
            will take place.
1.7.2.3.23 -highentropyva
            The -highentropyva compiler option tells the Windows kernel whether a particular
            executable supports high entropy Address Space Layout Randomization (ASLR).
Syntax
-highentropyva[+ | -]
            Arguments
            + | -               This option specifies that a 64-bit executable or an executable that is
                                marked by The -platform:anycpu compiler option supports a high
                                entropy virtual address space. The option is disabled by default. Use -
                                highentropyva+ or -highentropyva to enable it.
            Remarks
            The -highentropyva option enables compatible versions of the Windows kernel to use
            higher degrees of entropy when randomizing the address space layout of a process as
            part of ASLR. Using higher degrees of entropy means that a larger number of addresses
            can be allocated to memory regions such as stacks and heaps. As a result, it is more
            difficult to guess the location of a particular memory region.
            When The -highentropyva compiler option is specified, the target executable and any
            modules that it depends on must be able to handle pointer values that are larger than 4
            gigabytes (GB) when they are running as a 64-bit process.
1.7.2.3.24 -i
            The -i option adds a directory to the list of directories the compiler searches for include
            files.
Syntax
-i:dir
            Arguments
            dir                  A directory to add to list list of directories the compiler searches for
                                 include files.
            Remarks
            The compiler searches for files included with #include in the following order:
1.7.2.3.25 -ins
            The -ins option specifies whether the compiler should automatically include namespaces
            from Vulcan Assemblies or X# assemblies compiled in VO/Vulcan dialect marked with
            the VulcanImplicitNameSpaceAttribute (Vulcan runtime) or ImplicitNameSpaceAttribute
            (X# runtime).
Syntax
-ins[+|-]
            Arguments
            + | -                Specifying +, or just -ins, directs the compiler to automatically include
                                 namespaces from assemblies marked with the
                                 VulcanImplicitNameSpaceAttribute.
Remarks
           This attribute tells the compiler that classes that are placed inside that namespace should
           be automatically included when searching for classes, as if there was a #using
           SomeNameSpace statement in the source code.
           Example
           The following example will compile when The -ins switch is used and the
           VulcanVOGUIClasses assembly is included. Without -ins, errors will be raised.
Note that the App class and ShellWindow class are located in the Vulcan.VO namespace
If The -ins option is enabled, then the above example will be compiled as if it was written:
1.7.2.3.26 -keycontainer
Syntax
-keycontainer:string
            Arguments
            string               The name of the strong name key container.
            Remarks
            When The -keycontainer option is used, the compiler creates a sharable component by
            inserting a public key from the specified container into the assembly manifest and signing
            the final assembly with the private key. To generate a key file, type sn -k file at the
            command line. sn -i installs the key pair into a container.
            If you compile with -target:module, the name of the key file is held in the module and
            incorporated into the assembly when you compile this module into an assembly with -
            addmodule.
            You can also pass your encryption information to the compiler with -keyfile. Use -delaysign
            if you want the public key added to the assembly manifest but want to delay signing the
            assembly until it has been tested.
            For more information, see Creating and Using Strong-Named Assemblies and Delay
            Signing an Assembly.
1. This compiler option is not available in the Visual Studio development environment.
1.7.2.3.27 -keyfile
Syntax
-keyfile:file
            Arguments
            file                 The name of the file containing the strong name key.
Remarks
            When this option is used, the compiler inserts the public key from the specified file into the
            assembly manifest and then signs the final assembly with the private key. To generate a
            key file, type sn -k file at the command line.
            If you compile with -target:module, the name of the key file is held in the module and
            incorporated into the assembly that is created when you compile an assembly with -
            addmodule.
            You can also pass your encryption information to the compiler with -keycontainer. Use -
            delaysign if you want a partially signed assembly.
            In case both -keyfile and -keycontainer are specified (either by command line option or by
            custom attribute) in the same compilation, the compiler will first try the key container. If
            that succeeds, then the assembly is signed with the information in the key container. If the
            compiler does not find the key container, it will try the file specified with -keyfile. If that
            succeeds, the assembly is signed with the information in the key file and the key
            information will be installed in the key container (similar to sn -i) so that on the next
            compilation, the key container will be valid.
Note that a key file might contain only the public key.
            For more information, see Creating and Using Strong-Named Assemblies and Delay
            Signing an Assembly.
1.7.2.3.28 -langversion
            this compiler option is ignored. When compared to the C# compiler, X# always compiles
            in the languageversion Latest.
1.7.2.3.29 -lb
            The -lb option specifies if the compiler should allow code that uses the Late Binding
            mechnism to call methods and or get/set properties
Syntax
-lb[+|-]
            Arguments
            + | -                Specifying +, or just -lb, directs the compiler to generate a late-bound
                                 call to an instance variable or method when compiler cannot generate
                                 code for an early bound call.
          Remarks
          The X# compiler always attempts to generate early bound calls to all class methods,
          properties and fields. This is true even for methods referred to as "untyped" in Visual
          Objects. Strictly speaking, nothing is "untyped". If an early bound call cannot be generated,
          a compile-time error is raised.
The -lb option is the exact opposite of the Visual Objects Only Early option.
          Late binding incurs considerably more runtime overhead than early binding, and prevents
          compile-time parameter and return value checking. Any late-bound call has the potential to
          fail at runtime if the object does not support the field or property that is being accessed,
          the member being invoked or incorrect parameter types or count. Only use early binding
          for existing code or when there is no viable alternative.
          Example
          The following example will compile when The -lb switch is used. Without -lb, errors will be
          raised.
          Note that using late-bound calls can affect the performance of an application and raises
          the possibility of runtime errors that would otherwise be caught by the compiler if early
          binding was used. Late binding should only be used for compatibility with existing VO
          code.
If The -lb option is enabled, then the above example will be compiled as if it was written:
            Note that while this particular example will compile and execute correctly, if the definition
            of CLASS foo was changed and INSTANCE i was removed or changed to a method, the
            example would fail at runtime. Similarly, if METHOD bar was changed or removed, the
            example may also fail at runtime. For this reason, late-bound programming is strongly
            discouraged. Consider using subclassing and inheritance instead.
1.7.2.3.30 -lib
            The -lib option specifies the location of assemblies referenced by means of the -reference
            option.
Syntax
-lib:dir1[,dir2]
            Arguments
            dir1                  A directory for the compiler to look in if a referenced assembly is not
                                  found in the current working directory (the directory from which you are
                                  invoking the compiler) or in the common language runtime's system
                                  directory.
            dir2                  One or more additional directories to search in for assembly
                                  references. Separate additional directory names with a comma, and
                                  without white space between them.
            Remarks
            The compiler searches for assembly references that are not fully qualified in the following
            order:
              1. Current working directory. This is the directory from which the compiler is invoked.
              2. The common language runtime system directory.
              3. Directories specified by -lib.
              4. Directories specified by the LIB environment variable.
-lib is additive; specifying it more than once appends to any prior values.
            An alternative to using -lib is to copy into the working directory any required assemblies;
            this will allow you to simply pass the assembly name to -reference. You can then delete
            the assemblies from the working directory. Since the path to the dependent assembly is
            not specified in the assembly manifest, the application can be started on the target
            computer and will find and use the assembly in the global assembly cache.
            Because the compiler can reference the assembly does not imply the common language
            runtime will be able to find and load the assembly at runtime. See How the Runtime
            Locates Assemblies for details on how the runtime searches for referenced assemblies.
For information on how to set this compiler option programmatically, see ReferencePath.
            Example
            Compile t2.prg to create an .exe file. The compiler will look in the working directory and in
            the root directory of the C drive for assembly references.
1.7.2.3.31 -link
            Causes the compiler to make COM type information in the specified assemblies available
            to the project that you are currently compiling.
Syntax
                   -link:fileList
                   -/ -or-
                   -l:fileList
            Arguments
            fileList                Required. Comma-delimited list of assembly file names. If the file
                                    name contains a space, enclose the name in quotation marks.
            Remarks
            The -link option enables you to deploy an application that has embedded type
            information. The application can then use types in a runtime assembly that implement the
            embedded type information without requiring a reference to the runtime assembly. If
            various versions of the runtime assembly are published, the application that contains the
            embedded type information can work with the various versions without having to be
            recompiled. For an example, see Walkthrough: Embedding Types from Managed
            Assemblies.
      Using The -link option is especially useful when you are working with COM interop. You
      can embed COM types so that your application no longer requires a primary interop
      assembly (PIA) on the target computer. The -link option instructs the compiler to embed
      the COM type information from the referenced interop assembly into the resulting
      compiled code. The COM type is identified by the CLSID (GUID) value. As a result, your
      application can run on a target computer that has installed the same COM types with the
      same CLSID values. Applications that automate Microsoft Office are a good example.
      Because applications like Office usually keep the same CLSID value across different
      versions, your application can use the referenced COM types as long as .NET Framework
      4 or later is installed on the target computer and your application uses methods,
      properties, or events that are included in the referenced COM types.
      The -link option embeds only interfaces, structures, and delegates. Embedding COM
      classes is not supported.
      Note
      When you create an instance of an embedded COM type in your code, you must create
      the instance by using the appropriate interface. Attempting to create an instance of an
      embedded COM type by using the CoClass causes an error.
      To set the -link option in Visual Studio, add an assembly reference and set the Embed
      Interop Types property to true. The default for the Embed Interop Types property is false.
      If you link to a COM assembly (Assembly A) which itself references another COM
      assembly (Assembly B), you also have to link to Assembly B if either of the following is
      true:
         · A type from Assembly A inherits from a type or implements an interface from
           Assembly B.
         · A field, property, event, or method that has a return type or parameter type from
           Assembly B is invoked.
      Like The -reference compiler option, the -link compiler option uses the xsc.rsp response
      file, which references frequently used .NET Framework assemblies. Use The -noconfig
      compiler option if you do not want the compiler to use the xsc.rsp file.
      Generic Interfaces
      Generic interfaces that are embedded from an interop assembly cannot be used.
           that has a parameter whose type is the Range interface, that method must return a
           generic interface, as shown in the following code example.
           Example
           The following code compiles source file OfficeApp.prg and reference assemblies from
           COMData1.dll and COMData2.dll to produce OfficeApp.exe.
1.7.2.3.32 -linkresource
           Creates a link to a .NET Framework resource in the output file. The resource file is not
           added to the output file. This differs from The -resource option which does embed a
           resource file in the output file.
Syntax
-linkresource:filename[,identifier[,accessibility-modifier]]
           Arguments
           filename              The .NET Framework resource file to which you want to link from the
                                 assembly.
           identifier (optional) The logical name for the resource; the name that is used to load the
                                 resource. The default is the name of the file.
           accessibility-modifier
           (optional)            The accessibility of the resource: public or private. The default is
                                 public.
           Remarks
           By default, linked resources are public in the assembly when they are created with the X#
           compiler. To make the resources private, specify private as the accessibility modifier. No
           other modifier other than public or private is allowed.
           The file specified in filename can be any format. For example, you may want to make a
           native DLL part of the assembly, so that it can be installed into the global assembly cache
      and accessed from managed code in the assembly. The second of the following
      examples shows how to do this. You can do the same thing in the Assembly Linker. The
      third of the following examples shows how to do this. For more information, see Al.exe
      (Assembly Linker) and Working with Assemblies and the Global Assembly Cache
      .
      -linkres is the short form of -linkresource.
      Example
      Compile in.prg and link to resource file rf.resource:
      Example
      Compile A.prg into a DLL, link to a native DLL N.dll, and put the output in the Global
      Assembly Cache (GAC). In this example, both A.dll and N.dll will reside in the GAC.
      Example
      This example does the same thing as the previous one, but by using Assembly Linker
      options.
1.7.2.3.33 -main
           This option specifies the class that contains the entry point to the program, if more than
           one class contains a Main method.
Syntax
-main:class
           Arguments
           class                 The type that contains the Main method.
           Remarks
           If your compilation includes more than one type with a Main method, you can specify
           which type contains the Main method that you want to use as the entry point into the
           program.
Example
Compile t2.prg and t3.prg, specifying that the Main method will be found in Test2:
1.7.2.3.34 -memvar
The -memvar option tells the compiler to enable the support for 'memory variables'
Syntax
-memvar [+ | -]
          Arguments
          + |-                   Specifying +, or just -memvar, directs the compiler to enable support
                                 for memory variables.
          Remarks
          This will NOT work with the Core and Vulcan dialects.
          Enabling this option will enable the following commands in the compiler:
          MEMVAR <MemvarName,...>
          PUBLIC <MemVarName,...>
          PRIVATE <MemVarName,...>
          PARAMETERS <ParameterName,,...>
1.7.2.3.35 -moduleassemblyname
Syntax
-moduleassemblyname:assembly_name
          Arguments
          assembly_name          The name of the assembly whose non-public types the .netmodule
                                 can access.
          Remarks
          -moduleassemblyname should be used when building a .netmodule, and where the
          following conditions are true:
          This option is not available from within the development environment; it is only available
          when compiling from the command line.
          Example
          This sample builds an assembly with a private type, and that gives friend assembly
          access to an assembly called csman_an_assembly.
              -/ moduleassemblyname_1.prg
              -/ compile with: -target:library
              using System;
              using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo ("csman_an_assembly")]
class An_Internal_Class
              {
                   public void Test()
                   {
                         Console.WriteLine("An_Internal_Class.Test called");
                   }
              }
          Example
          This sample builds a .netmodule that accesses a non-public type in the assembly
          moduleassemblyname_1.dll. By knowing that this .netmodule will be built into an
          assembly called csman_an_assembly, we can specify -moduleassemblyname, allowing
          the .netmodule to access non-public types in an assembly that has granted friend
          assembly access to csman_an_assembly.
              -/ moduleassemblyname_2.prg
              -/ compile with: -moduleassemblyname:csman_an_assembly -target:module -
              reference:moduleassemblyname_1.dll
              class B {
                  public void Test() {
                      An_Internal_Class x = new An_Internal_Class();
                      x.Test();
                     }
               }
           Example
           This code sample builds the assembly csman_an_assembly, referencing the previously-
           built assembly and .netmodule.
               -/ csman_an_assembly.prg
               -/ compile with: -addmodule:moduleassemblyname_2.netmodule -
               reference:moduleassemblyname_1.dll
               class A {
                   public static void Main() {
                       B bb = new B();
                       bb.Test();
                   }
               }
1.7.2.3.36 -modulename:<string>
1.7.2.3.37 -namedargs
Syntax
-namedargs [+ | -]
           Arguments
           + |-                   Specifying +, or just -namedargs, directs the compiler to allow
                                  namedarguments. Specifying - directs the compiler to NOT use
                                  named arguments
           Remarks
           The default = + for the Core dialect and - for all other dialects. So -namedargs- only is
           useful in combination with the Core dialect.
           Note If you enable this option then quite often existing code such as the code below will
           produce compiler errors>
           That is why we have disabled named arguments for most dialects.
1.7.2.3.38 -noconfig
           The -noconfig option tells the compiler not to compile with the xsc.rsp file, which is located
           in and loaded from the same directory as the xsc.exe file.
Syntax
-noconfig
           Remarks
           The xsc.rsp file references all the assemblies shipped with the .NET Framework. The
           actual references that the Visual Studio .NET development environment includes depend
           on the project type.
           You can modify the xsc.rsp file and specify additional compiler options that should be
           included in every compilation from the command line with xsc.exe (except The -noconfig
           option).
           The compiler processes the options passed to the xsc command last. Therefore, any
           option on the command line overrides the setting of the same option in the xsc.rsp file.
           If you do not want the compiler to look for and use the settings in the xsc.rsp file, specify -
           noconfig.
1.7.2.3.39 -nologo
           The -nologo option suppresses display of the sign-on banner when the compiler starts up
           and display of informational messages during compiling.
Syntax
-nologo
            Remarks
            This option is not available from within the development environment; it is only available
            when compiling from the command line.
1.7.2.3.40 -nostddefs
            The -nostddefs option prevents the compiler from using the preprocessor directives in
            XSharpDefs.xh.
Syntax
-nostddefs[+|-]
            Arguments
            + |-                Specifying +, or just -nostddefs, prevents the compiler from using the
                                preprocessor directives in XSharpDefs.xh.
Remarks
1.7.2.3.41 -nostdlib
-nostdlib prevents the import of mscorlib.dll, which defines the entire System namespace.
Syntax
-nostdlib[+ | -]
           Remarks
           Use this option if you want to define or create your own System namespace and objects.
           If you do not specify -nostdlib, mscorlib.dll will be imported into your program (same as
           specifying -nostdlib-). Specifying -nostdlib is the same as specifying -nostdlib+.
           The -nowarn option lets you suppress the compiler from displaying one or more warnings.
           Separate multiple warning numbers with a comma.
Syntax
-nowarn:number1[,number2,...]
           Arguments
           number1, number2 Warning number(s) that you want the compiler to suppress.
           Remarks
           You should only specify the numeric part of the warning identifier. For example, if you want
           to suppress XS0028, you could specify -nowarn:28.
           Use The -nowin32manifest option to instruct the compiler not to embed any application
           manifest into the executable file.
Syntax
-nowin32manifest
           Remarks
           When this option is used, the application will be subject to virtualization on Windows Vista
           unless you provide an application manifest in a Win32 Resource file or during a later build
           step.
1.7.2.3.44 -ns
           The -ns option explicitly specifies the default namespace for all types that do not have an
           explicit namespace in their name.
Syntax
-ns[: ]namespaceName
           Arguments
           namespaceName           The name of the default namespace for all types declared in the
                                   application or class library.
           Remarks
           If The -ns option is not specified, then types that are not prefixed with a namespace and
           types that are not in a BEGIN NAMESPACE .. END NAMESPACE construct will be
           compiled as so-called global types.
                 ·   Classes
                 ·   Interfaces
                 ·   Structures
                 ·   Vostructs
                 ·   Delegates
           Namespace names must follow the same rules for program identifiers: they must begin
           with an uppercase or lowercase letter or an underscore, followed by zero or more
           uppercase or lowercase letters, numbers or underscores. All other characters are illegal,
           and will raise a compile-time error.
           The default namespace is used for any declared types that do not have an explicit
           namespace in their name.
          Example
          When the following code is compiled without -ns compiler option the following types will be
          produced:
            ·    Customer
            ·    Point
            ·    MyProject.Customer
            ·    MyProject.Data.Customer
                CLASS Customer
                .
                .
                END CLASS
                STRUCT Point
                .
                .
                END STRUCT
                ENUM CustomerType
                .
                END ENUM
                CLASS MyProject.Customer
                .
                .
                END CLASS
          If you compile the same code with a -ns:MyNameSpace option the following types will be
          produced:
              ·   MyNameSpace.Customer
              ·   MyNameSpace.Point
              ·   MyProject.Customer
              ·   MyProject.Data.Customer
1.7.2.3.45 -optimize
           The -optimize option enables or disables optimizations performed by the compiler to make
           your output file smaller, faster, and more efficient.
Syntax
-optimize[+ | -]
           Remarks
           -optimize also tells the common language runtime to optimize code at runtime.
           When building a module to be used by an assembly, use the same -optimize settings as
           those of the assembly.
           Example
           Compile t2.prg and enable compiler optimizations:
1.7.2.3.46 -out
Syntax
-out:filename
           Arguments
           filename               The name of the output file created by the compiler.
           Remarks
           On the command line, it is possible to specify multiple output files for your compilation.
           The compiler expects to find one or more source code files following The -out option.
           Then, all source code files will be compiled into the output file specified by that -out option.
Specify the full name and extension of the file you want to create.
              · An .exe will take its name from the source code file that contains the Main method.
              · A .dll or .netmodule will take its name from the first source code file.
           A source code file used to compile one output file cannot be used in the same compilation
           for the compilation of another output file.
           When producing multiple output files in a command-line compilation, keep in mind that
           only one of the output files can be an assembly and that only the first output file specified
           (implicitly or explicitly with -out) can be the assembly.
           Any modules produced as part of a compilation become files associated with any
           assembly also produced in the compilation. Use ildasm.exe to view the assembly
           manifest to see the associated files.
           The -out compiler option is required in order for an exe to be the target of a friend
           assembly.
            the assembly name. Modifying one or both of these properties will be necessary to set the
            output file name.
            Example
            Compile t.prg and create output file t.exe, as well as build t2.prg and create module
            output file mymodule.netmodule:
1.7.2.3.47 -ovf
            The -ovf compiler option is an alias for the -checked command line option for compatibility
            with Vulcan.
1.7.2.3.48 -parallel
1.7.2.3.49 -pathmap
Syntax
-pathmap:path1=sourcePath1,path2=sourcePath2
            Arguments
            path1                   The full path to the source files in the current environment
            sourcePath1           The source path substituted for path1 in any output files.
            Remarks
            The compiler writes the source path into its output for the following reasons:
            1. The source path is substituted for an argument when the CallerFilePathAttribute is
               applied to an optional parameter.
            2. The source path is embedded in a PDB file.
            3. The path of the PDB file is embedded into a PE (portable executable) file.
           This option maps each physical path on the machine where the compiler runs to a
           corresponding path that should be written in the output files.
1.7.2.3.50 -pdb
The -pdb compiler option specifies the name and location of the debug symbols file.
Syntax
-pdb:filename
           Arguments
           filename               The name and location of the debug symbols file.
           Remarks
           When you specify -debug , the compiler will create a .pdb file in the same directory where
           the compiler will create the output file (.exe or .dll) with a file name that is the same as the
           name of the output file.
-pdb allows you to specify a non-default file name and location for the .pdb file.
           This compiler option cannot be set in the Visual Studio development environment, nor can
           it be changed programmatically.
           Example
           Compile t.prg and create a .pdb file called tt.pdb:
1.7.2.3.51 -platform
Specifies which version of the common language runtime (CLR) can run the assembly.
Syntax
-platform:string
      Arguments
      string              anycpu (default), anycpu32bitpreferred, ARM, x64, x86, or Itanium.
      Remarks
        · anycpu (default) compiles your assembly to run on any platform. Your application runs
          as a 64-bit process whenever possible and falls back to 32-bit when only that mode is
          available.
        · anycpu32bitpreferred compiles your assembly to run on any platform. Your application
          runs in 32-bit mode on systems that support both 64-bit and 32-bit applications. You
          can specify this option only for projects that target the .NET Framework 4.5.
        · ARM compiles your assembly to run on a computer that has an Advanced RISC
          Machine (ARM) processor.
        · x64 compiles your assembly to be run by the 64-bit common language runtime on a
          computer that supports the AMD64 or EM64T instruction set.
        · x86 compiles your assembly to be run by the 32-bit, x86-compatible common
          language runtime.
        · Itanium compiles your assembly to be run by the 64-bit common language runtime on
          a computer with an Itanium processor.
        · Assemblies compiled with -platform:x86 execute on the 32-bit CLR running under
          WOW64.
        · A DLL compiled with The -platform:anycpu executes on the same CLR as the
          process into which it is loaded.
        · Executables that are compiled with The -platform:anycpu execute on the 64-bit CLR.
        · Executables compiled with -platform:anycpu32bitpreferred execute on the 32-bit CLR.
      The anycpu32bitpreferred setting is valid only for executable (.EXE) files, and it requires
      the .NET Framework 4.5.
      Example
      The following example shows how to use The -platform option to specify that the
      application should be run by the 64-bit CLR on a 64-bit Windows operating system.
1.7.2.3.52 -ppo
The -ppo option directs the compiler to write the output of the preprocessor to a file.
Syntax
-ppo [+ | -]
           Arguments
           + |-                  Specifying +, or just -ppo, directs the compiler to write the output of the
                                 preprocessor to a file.
                                 When ppo is not enabled then the compiler will delete any existing ppo
                                 files that match input file names
           Remarks
           Each source file will be written to a file with the same base name and an extension of
           .ppo, in the same directory as the source file. If a .ppo file already exists, it will be
           overwritten without warning.
            Tip:
           .ppo files can be viewed within Visual Studio. After enabling The -ppo option and rebuilding
           the project, select any node in the project in Solution Explorer, click the Show All Files
           button in the Solution Explorer toolbar, then double click the desired .ppo file node.
           To view a .prg and .ppo file side-by-side to compare them, right click the document tab in
           either the .prg or .ppo file and click New Vertical Tab Group.
           1. Open the project's Properties page (see How to: Set Build Properties).
           2. Click the Build tab.
           3. In the Preprocessor section, modify the "Generate preprocessor output"property.
1.7.2.3.53 -preferreduilang
           By using The -preferreduilang compiler option, you can specify the language in which the
           X# compiler displays output, such as error messages.
Syntax
-preferreduilang: language
           Arguments
           language               The language name of the language to use for compiler output.
           Remarks
           The preferreduilang compiler option is recognized but ignored. The X# compiler only
           works in the english language (for now ?)
1.7.2.3.54 -recurse
           The -recurse option enables you to compile source code files in all child directories of
           either the specified directory (dir) or of the project directory.
Syntax
-recurse:[dir\]file
           Arguments
           dir (optional)         The directory in which you want the search to begin. If this is not
                                  specified, the search begins in the project directory.
           file                   The file(s) to search for. Wildcard characters are allowed.
           Remarks
           The -recurse option lets you compile source code files in all child directories of either the
           specified directory (dir) or of the project directory.
           You can use wildcards in a file name to compile all matching files in the project directory
           without using -recurse.
           This compiler option is unavailable in Visual Studio and cannot be changed
           programmatically.
           Example
           Compiles all X# files in the current directory:
xsc *.prg
           Compiles all of the X# files in the dir1\dir2 directory and any directories below it and
           generates dir2.dll:
1.7.2.3.55 -reference
           The -reference option causes the compiler to import public type information in the
           specified file into the current project, thus enabling you to reference metadata from the
           specified assembly files.
Syntax
                -reference:[alias=]filename
                -reference:filename
           Arguments
           filename            The name of a file that contains an assembly manifest. To import
                               more than one file, include a separate -reference option for each file.
           alias               A valid X# identifier that will represent a root namespace that will
                               contain all namespaces in the assembly.
           Remarks
           To import from more than one file, include a -reference option for each file.
           The files you import must contain a manifest; the output file must have been compiled with
           one of The -target options other than -target:module.
           Use -addmodule to import metadata from an output file that does not contain an assembly
           manifest.
        · A type you use from Assembly A inherits from a type or implements an interface from
          Assembly B.
        · You invoke a field, property, event, or method that has a return type or parameter type
          from Assembly B.
      Use -lib to specify the directory in which one or more of your assembly references is
      located. The -lib topic also discusses the directories in which the compiler searches for
      assemblies.
      In order for the compiler to recognize a type in an assembly, and not in a module, it needs
      to be forced to resolve the type, which you can do by defining an instance of the type.
      There are other ways to resolve type names in an assembly for the compiler: for example,
      if you inherit from a type in an assembly, the type name will then be recognized by the
      compiler.
      The xsc response (.rsp) file, which references commonly used .NET Framework
      assemblies, is used by default. Use -noconfig if you do not want the compiler to use
      xsc.rsp.
      Note
      In Visual Studio, use the Add Reference dialog box.
      Example
      This example shows how to use the extern alias feature.
      You compile the source file and import metadata from grid.dll and grid20.dll,which
      have been compiled previously. The two DLLs contain separate versions of the same
      component, and you use two -reference with alias options to compile the source file. The
      options look like this:
      This sets up the external aliases "GridV1" and "GridV2," which you use in your program by
      means of an extern statement:
            Once this is done, you can refer to the grid control from grid.dll by prefixing the control
            name with GridV1, like this:
GridV1::Grid
            In addition, you can refer to the grid control from grid20.dll by prefixing the control name
            with GridV2 like this:
GridV2::Grid
1.7.2.3.56 -refonly
            The -refonly option indicates that a reference assembly should be output instead of an
            implementation assembly, as the primary output. The -refonly parameter silently disables
            outputting PDBs, as reference assemblies cannot be executed.
Syntax
-refonly
            Metadata-only assemblies have their method bodies replaced with a single throw null
            body, but include all members except anonymous types. The reason for using throw null
            bodies (as opposed to no bodies) is so that PEVerify could run and pass (thus validating
            the completeness of the metadata).
            Reference assemblies include an assembly-level ReferenceAssembly attribute. This
            attribute may be specified in source (then the compiler won't need to synthesize it).
            Because of this attribute, runtimes will refuse to load reference assemblies for execution
            (but they can still be loaded in reflection-only mode). Tools that reflect on assemblies need
            to ensure they load reference assemblies as reflection-only, otherwise they will receive a
            typeload error from the runtime.
            Reference assemblies further remove metadata (private members) from metadata-only
            assemblies:
            · A reference assembly only has references for what it needs in the API surface. The real
              assembly may have additional references related to specific implementations.
            · Private function-members (methods, properties, and events) are removed in cases
              where their removal doesn't observably impact compilation. If there are no
              InternalsVisibleTo attributes, do the same for internal function-members.
            · But all types (including private or nested types) are kept in reference assemblies. All
              attributes are kept (even internal ones).
            · All virtual methods are kept. Explicit interface implementations are kept. Explicitly
              implemented properties and events are kept, as their accessors are virtual (and are
              therefore kept).
           · All fields of a struct are kept. (This is a candidate for post-C#-7.1 refinement)
           The -refonly and -refout options are mutually exclusive.
1.7.2.3.57 -refout
           The -refout option specifies a file path where the reference assembly should be output.
           This translates to metadataPeStream in the Emit API.
Syntax
-refout:filepath
           Arguments
           filepath            The name and path of the output file created by the compiler.
           Remarks
           The filename should generally match that of the primary assembly. The recommended
           convention (used by MSBuild) is to place the reference assembly in a "ref/" sub-folder
           relative to the primary assembly.
           Metadata-only assemblies have their method bodies replaced with a single throw null
           body, but include all members except anonymous types. The reason for using throw null
           bodies (as opposed to no bodies) is so that PEVerify could run and pass (thus validating
           the completeness of the metadata).
           Reference assemblies include an assembly-level ReferenceAssembly attribute. This
           attribute may be specified in source (then the compiler won't need to synthesize it).
           Because of this attribute, runtimes will refuse to load reference assemblies for execution
           (but they can still be loaded in reflection-only mode). Tools that reflect on assemblies need
           to ensure they load reference assemblies as reflection-only, otherwise they will receive a
           typeload error from the runtime.
           Reference assemblies further remove metadata (private members) from metadata-only
           assemblies:
           · A reference assembly only has references for what it needs in the API surface. The real
             assembly may have additional references related to specific implementations.
           · Private function-members (methods, properties, and events) are removed in cases
             where their removal doesn't observably impact compilation. If there are no
             InternalsVisibleTo attributes, do the same for internal function-members.
           · But all types (including private or nested types) are kept in reference assemblies. All
             attributes are kept (even internal ones).
           · All virtual methods are kept. Explicit interface implementations are kept. Explicitly
             implemented properties and events are kept, as their accessors are virtual (and are
             therefore kept).
           · All fields of a struct are kept.
           The -refout and -refonly options are mutually exclusive.
1.7.2.3.58 -resource
Syntax
-resource:filename[,identifier[,accessibility-modifier]]
           Arguments
           filename             The .NET Framework resource file that you want to embed in the
                                output file.
           identifier (optional) The logical name for the resource; the name that is used to load the
                                resource. The default is the name of the file name.
           Remarks
           Use -linkresource to link a resource to an assembly and not add the resource file to the
           output file.
           By default, resources are public in the assembly when they are created by using the X#
           compiler. To make the resources private, specify private as the accessibility modifier. No
           other accessibility other than public or private is allowed.
           The order of the resources in the output file is determined from the order specified on the
           command line.
For information about how to set this compiler option programmatically, see BuildAction.
            Example
            Compile in.prg and attach resource file rf.resource:
1.7.2.3.59 -ruleset
Syntax
-ruleset:filename
1.7.2.3.60 -s
            Performs a syntax check on the input files only. Does not produce the output exe, dll or
            pdb
Syntax
-s[+|-]
            Arguments
            + | -               Specifying +, or just -s, tells the compiler to only parse the source
                                code and not to generate an output file. When combined with The -ppo
                                option then there will be .ppo files written.
            Remarks
            This command line option allows you to check the code without generating a binary.
Syntax
/showdefs[+|-]
           Arguments
           + | -                 Specifying +, or just /showdefs, causes the compiler to output the
                                 names of #defines as they are processed.
           Remarks
           This commandline option is useful to debug the defines that are included in the
           compilation
           The -showincludes option causes the compiler to output the names of #include files as
           they are processed.
Syntax
-showincludes[+|-]
           Arguments
           + | -                  Specifying +, or just -showincludes, causes the compiler to output the
                                  names of #include files as they are processed.
           Remarks
           This option is useful in order to determine the files the compiler is processing as a result
           of an #include directive. Nested include files are also displayed.
1.7.2.3.63 -snk
The -snk compiler option is an alias for the -keyfile option, for compatibility with Vulcan
1.7.2.3.64 -stddefs
Syntax
-stddefs:filepath
           Arguments
           filepath            The name and path of the header file to use in stead of XSharpDefs.Xh.
                               When no path is included then the compiler will use the Includepath
                               specified from the commandline (-i)
1.7.2.3.65 -subsystemversion
           Specifies the minimum version of the subsystem on which the generated executable file
           can run, thereby determining the versions of Windows on which the executable file can
           run. Most commonly, this option ensures that the executable file can leverage particular
           security features that aren’t available with older versions of Windows.
          Note
          To specify the subsystem itself, use The -target compiler option.
Syntax
-subsystemversion:major.minor
          Parameters
          major.minor         The minimum required version of the subsystem, as expressed in a
                              dot notation for major and minor versions. For example, you can
                              specify that an application can't run on an operating system that's
                              older than Windows 7 if you set the value of this option to 6.01, as the
                              table later in this topic describes. You must specify the values for
                              major and minor as integers.
          Leading zeroes in the minor version don't change the version, but trailing zeroes do. For
          example, 6.1 and 6.01 refer to the same version, but 6.10 refers to a different version. We
          recommend expressing the minor version as two digits to avoid confusion.
          Remarks
          The following table lists common subsystem versions of Windows.
           Windows version                               Subsystem version
           Windows 2000                                        5.00
           Windows XP                                          5.01
           Windows Server 2003                                 5.02
           Windows Vista                                       6.00
           Windows 7                                           6.01
           Windows Server 2008                                 6.01
           Windows 8                                           6.02
          Default values
          The default value of The -subsystemversion compiler option depends on the conditions in
          the following list:
            · The default value is 6.02 if any compiler option in the following list is set:
                o -target:appcontainerexe
                o -target:winmdobj
                o -platform:arm
              · The default value is 6.00 if you're using MSBuild, you're targeting .NET Framework
                4.5, and you haven't set any of the compiler options that were specified earlier in this
                list.
              · The default value is 4.00 if none of the previous conditions is true.
1.7.2.3.66 -target
            Unless you specify -target:module, -target causes a .NET Framework assembly manifest
            to be placed in an output file. For more information, see Assemblies in the Common
            Language Runtime and Common Attributes.
            The assembly manifest is placed in the first .exe output file in the compilation or in the first
            DLL, if there is no .exe output file. For example, in the following command line, the
            manifest will be placed in 1.exe:
            The compiler creates only one assembly manifest per compilation. Information about all
            files in a compilation is placed in the assembly manifest. All output files except those
            created with -target:module can contain an assembly manifest. When producing multiple
            output files at the command line, only one assembly manifest can be created and it must
            go into the first output file specified on the command line. No matter what the first output
            file is (/target:exe, -target:winexe, -target:library or -target:module), any other output files
            produced in the same compilation must be modules (/target:module).
            If you create an assembly, you can indicate that all or part of your code is CLS compliant
            with the CLSCompliantAttribute attribute.
                -/ target_clscompliant.prg
                [assembly:System.CLSCompliant(true)]       -/ specify assembly compliance
           For more information about setting this compiler option programmatically, see
           OutputType.Enter topic text here.
1.7.2.3.67 -touchedfiles
           The -touchedfiles compiler option allows you to declare a file in which the compiler will list
           which files have been touched during the compilation process.
Syntax
-touchedfiles:filename
           Remarks
           The compiler will produce 2 output files:
           filename.read          This lists all the files that were read by the compiler
           filename.write         This lists all the files that were written by the compiler. That
                               includes the exe, pdb, ppo etc.
The file names in both files are all capitalized and in alphabetical order
1.7.2.3.68 -undeclared
The -undeclared option tells the compiler to enable the support for 'undeclared variables'
Syntax
-undeclared [+ | -]
           Arguments
           + |-                Specifying +, or just -undeclared, directs the compiler to enable the
                               support for 'undeclared variables'
           Remarks
           When the compiler detects an 'unknown identifier' it will assume that this is either a field in
           the current workarea or a memory variable.
           The compiler option will only have effect when you also enabled -memvar
1.7.2.3.69 -unsafe
The -unsafe compiler option allows code that uses the unsafe keyword to compile.
Syntax
-unsafe
Remarks
For more information about unsafe code, see Unsafe Code and Pointers.
           Example
           Compile in.prg for unsafe mode:
1.7.2.3.70 -utf8output
Syntax
-utf8output
           Remarks
           In some international configurations, compiler output cannot correctly be displayed in the
           console. In these configurations, use -utf8output and redirect compiler output to a file.
1.7.2.3.71 -vo1
           The -vo1 compiler option directs the compiler to treat Init() methods as constructors and
           Axit methods as Destructor.
Syntax
-vo1[+ | -]
           Arguments
           + |-                 Specifying +, or just -vo2, directs the compiler to initialize all variables
                                and fields of type STRING and all elements of DIM ... AS STRING
                                arrays to an empty string (String.Empty).
1.7.2.3.72 -vo10
           The -vo10 option enables the IIF operator to behave in a manner compatible with Visual
           Objects
Syntax
-vo10[+|-]
           Arguments
           + | -                Specifying +, or just -vo10, causes the IIF operator to behave as it
                                does in Visual Objects.
           Remarks
           If the true and false expressions in an IIF operator are not the same, or one cannot be
           implicitly converted to the type of the other, the compiler will raise an error.
           Visual Objects allows this, and implicitly converts both expressions to USUAL, causing the
           IIF expression to also return USUAL. This is neither safe or efficient, but code originally
           written in Visual Objects may depend on this behavior, and if -vo10 is not used, errors
           may occur at runtime.
                LOCAL x as LOGIC
                x := TRUE
                ? IIF( x, 1, "Sunday")
When you use The -vo10 compiler option then the compiler will convert this to:
or
1.7.2.3.73 -vo11
This option is not supported yet in the current version of the compiler
Syntax
-vo11[+|-]
           Arguments
           + | -              Specifying +, or just -vo11, directs the compiler to emit code that
                              performs arithmetic conversions that are compatible with Visual
                              Objects.
Remarks
1.7.2.3.74 -vo12
Syntax
-vo12[+|-]
           Arguments
           + |-                Specifying +, or just -vo12, directs the compiler to emit code that
                               performs Clipper-compatible integer divisions.
           Remarks
           When The -vo12 option is enabled and both operands of The - (division) operator are
           integral values, both operands are converted to USUAL, and the return type is USUAL. The
           return value contained in the USUAL is:
           The -vo12 option is enabled in projects created by the Transporter if the Compiler-
           >Clipper Compatiblity->Integer Divisions option was enabled for the project in Visual
           Objects.
1.7.2.3.75 -vo13
Syntax
-vo13[+|-]
           Arguments
           + |-                Specifying +, or just -vo13, tells the compiler that string comparisons
                               are to be performed the same way as they are in VO, and in the
                               RDDs, where the comparison depends on the SetCollation() setting.
                               When - is specified, or -vo13 is not specified, string comparisons in
                               code use String.Compare()
          Remarks
          When this option is enabled string comparisions are compatible with VO and the RDDs,
          and depend on SetCollation() as follows:
          When collation = #CLIPPER, comparisons are performed byte by byte, using a weight
          table for each char. As in VO, a different table can be selected with the SetNatDll()
          function.
          In .Net we are using the runtime DLL for the weight tables. In the runtime the nation DLLs
          are not physically implemented as separate files; the weighting tables are embedded as
          resources inside XSharp.Core.dll.
          When collation = #Unicode then the comparisons will be done with the normal
          String.Compare() routine that uses the current culture.
          When collation = #Ordinal then the comparisons will be done with the normal
          String.Compare() routine using an ordinal comparison (this is the fastest)
          When -v013 is not enabled string comparisons are performed using String.Compare(),
          where the comparison makes use of culture-sensitive sort rules according to the current
          culture selected.
          The setting for -vo13 is registered with the runtime by the main application at startup. If
          you library is compiled with -vo13+ but the main app isn't, then the string comparisons
          called from the library will follow the same rules as the main app because the main app
          registers -vo13 setting with the runtime and the stringcomparison routines in the runtime
          now detect that the main app does not want to do VO compatible string comparisons.
          We therefore recommend that 3rd party products always enable -vo13.
          Compatibility Note:
          When using -vo13 string comparisons involve converting unicode strings to ansi for
          compatibility and consequently are slower than with String.Compare().
1.7.2.3.76 -vo14
The -vo14 option enables VO compatible handling of floating point literal numbers
Syntax
-vo14[+|-]
           Arguments
           + |-                Specifying +, or just -vo14, tells the compiler treat floating point literal
                               numbers (for example: 123.456) as FLOAT data type, instead of as
                               REAL8 (System.Double), which is the default.
           Remarks
           When this option is enabled, floating point literal numbers are treated by the compiler as
           FLOAT values, for compatibility with existing Visual Objects code. This option is enabled
           by default in transported projects.
           For new code, it is strongly recommended not to enable this compiler option, as it
           generates less efficient code. For example, for the following code:
           if -vo14 is enabled, the compiler treats the "1.0", "1.5" and "2.5" values as numbers of type
           FLOAT, causing the whole calculation to be made on FLOAT values and the result is at
           the end converted to REAL8, before it is finally stored to the local variable. FLOAT is a
           special data type defined in the Vulcan.NET runtime and is significantly slower than the
           REAL8 (System.Decimal) data type, which maps directly to a (mathematic) processor
           registry. Disabling -vo14 option, would cause the above code to execute faster by a large
           factor.
           Note that by using the "d" or "s" suffix, as in 123.456d and 123.456s, the REAL8 or REAL4
           data type is being enforced on a literal number, no matter if -vo14 is enabled or disabled.
           See Literals for more information.
1.7.2.3.77 -vo15
           This compiler option will allow you to control what the compiler will do with local variables,
           parameters and return types without type specification.
           The default is -vo15+ for the VO and Vulcan dialects. For the Core dialect the default is -
           vo15-
Syntax
-vo15[+|-]
           Arguments
           + |-                Specifying +, or just -vo14, tells the compiler treat floating point literal
                               numbers (for example: 123.456) as FLOAT data type, instead of as
                               REAL8 (System.Double), which is the default.
For example
           In VO/Vulcan mode this will (by default) generate a method with a USUAL return type. In
           Core mode this will not compile but produce a "Missing Type" error (XS1031)
When you compile with -vo15- this will also produce an error.
And
1.7.2.3.78 -vo16
Example:
               CLASS Event
                  EXPORT hWnd    AS PTR
                  EXPORT uMsg    AS DWORD
                  EXPORT wParam    AS DWORD
                  EXPORT lParam    AS LONG
                  EXPORT oWindow AS OBJECT
           In the code above the compiler would generate a constructor for the ControlEvent class.
           This constructor will pass all the parameters to the constructor of the Event class.
1.7.2.3.79 -vo2
           The -vo2 option directs the compiler to initialize all variables and fields of type STRING
           (System.String) and all elements of DIM ... AS STRING arrays to an empty string (/vo2[+|-]
Syntax
-vo2[+ | -]
           Arguments
           + |-                 Specifying +, or just -vo2, directs the compiler to initialize all variables
                                and fields of type STRING and all elements of DIM ... AS STRING
                                arrays to an empty string (String.Empty).
           Remarks
           This option is off by default, and all locals, globals, fields and array elements of type
           STRING have an initial value of NULL, which is the default initial value for any local, global,
           field or array element that contains a reference type.
           Generally you will initialize a string variable to a specific value before it is used, and
           initializing it to an empty string would incur unnecessary overhead. In addition, it is
           inconsistent with the behavior of all other reference types, which have an initial value of
           NULL. However, this may break existing Visual Objects code that relies on Visual Object's
           behavior of initializing string variables to a string with zero characters.
           When this option is not used, you may test for an empty string variable, field or array
           element by comparing it against NULL. When this option is enabled, you may test for an
           empty string variable, field or array element by comparing it against "" or String.Empty, or
           testing that its length equals zero. System.String.IsNullOrEmpty() may also be used to
           test whether a string variable contains NULL or a valid string with zero characters.
           Also note that the predefined constant NULL_STRING is normally equivalent to NULL, but
           when -vo2 is used, NULL_STRING is equivalent to "" (a zero-length string).
            Compatibility Note:
           -vo2 does not initialize STRING fields in structures. Since structures do not have default
           constructors, structure fields cannot have initializer expressions. Although this is not a
           compatiblity issue since you cannot create structures (value types) in Visual Objects, it is
           something to keep in mind if you use structures in an application that uses -vo2.
           Note that the use of the term "structure" here refers to STRUCTURE in X#, not
           STRUCTURE in Visual Objects, which has been renamed VOSTRUCT in X#. -vo2 has no
           effect on VOSTRUCT since you cannot declare fields that are reference types in a
           VOSTRUCT.
Example
1.7.2.3.80 -vo3
           The -vo3 option directs the compiler to treat all methods (including ACCESS and ASSIGN
           methods) as virtual.
Syntax
-vo3[+|-]
           Arguments
           + |-                   Specifying +, or just -vo3, directs the compiler to treat all methods
                                  (including ACCESS and ASSIGN methods) as virtual, regardless of
                                  whether the VIRTUAL modifier is used or not. This provides
                                  compatibility with the Visual Objects inheritance model.
           Remarks
           A class method may always be explicitly declared as a virtual method by using the
           VIRTUAL keyword, regardless of whether -vo3 is used or not.
           For performance reasons, this option is off by default. Virtual methods incur a slight
           performance penalty since the actual method implementation that is called cannot be
           determined until run-time, and depends on the run-time type of the instance on which the
           invocation takes place. In contrast, calls to non-virtual members can be fully resolved at
           compile time, and the call is always made to the compile-time type of the instance.
             3. In the Visual Objects Compatibility section, modify the "All instance methods virtual"
                property.
Example
           When The -vo3 switch is not used, the call to 'c:WhoAmI()' always resolves to the
           implementation in BaseClass, since the variable 'c' is typed as 'BaseClass' and
           'BaseClass.WhoAmI' is a non-virtual method.
           When The -vo3 switch is used, the call to 'c:WhoAmI()' resolves to the implementation in
           'DerivedClass'. Even though the variable 'c' is typed as 'BaseClass', the actual type of the
           instance stored in 'c' at runtime determines what implementation of 'WhoAmI' to invoke
           since 'BaseClass.WhoAmI' is a virtual method.
           This is preferable over using -vo3 since you have explicit control over which methods are
           and are not virtual, and no unnecessary overhead is incurred where virtual inheritance is
           not required. However, existing Visual Objects code may not work properly without -vo3,
           and it may not be practical to modify existing code and add the VIRTUAL keyword to those
           methods that really need it.
1.7.2.3.81 -vo4
           The -vo4 option directs the compiler to implicitly convert signed integer types to/from
           unsigned types, and larger integer types to smaller types.
Syntax
-vo4[+|-]
           Arguments
           + |-                 Specifying +, or just -vo4, directs the compiler to implicitly convert
                                signed integer values to/from unsigned values, and larger integer types
                                to smaller integer types. This provides compatibility with Visual
      Remarks
      For safety reasons, this option is off by default. Implicitly converting between signed and
      unsigned integer types or between larger to smaller integer types can cause numeric
      overflow errors at runtime or unintended values to be passed depending upon whether
      overflow checking is enabled or disabled. By default, you must explicitly cast a signed
      integer to its unsigned counterpart and from larger integer types to smaller integer types
      and by explicitly doing so, it is assumed that the conversion is known by the programmer
      to be safe.
      When this option is enabled, the compiler will implicitly convert the data types listed in the
      table below:
      From                                            To
      SByte                                           BYTE, WORD, Char, DWORD
      SHORT                                           BYTE, SByte, WORD, Char, DWORD
      INT                                             BYTE, SByte, WORD, SHORT, Char,
                                                      DWORD
      INT64                                           BYTE, SByte, WORD, SHORT, Char, INT,
                                                      DWORD, UINT64
      BYTE                                            SByte
      WORD                                            SByte, BYTE, SHORT, Char, INT
      DWORD                                           SByte, BYTE, WORD, SHORT, INT
      UINT64                                          SByte, BYTE, WORD, SHORT, Char, INT,
                                                      DWORD, INT64
      For each conversion, the compiler will raise an appropriate warning. You may disable the
      warning with The -wx switch, or insert an explicit cast in the source code to eliminate the
      warning.
       It is strongly recommended that you do not use this compiler option in new code. All of the
      conversions listed in the table above have the ability to lose data or return incorrect values,
      since the range of values in the source data type cannot be represented in the target data
      type.
Example
1.7.2.3.82 -vo5
           The -vo5 option directs the compiler to implicitly use the CLIPPER calling convention for
           functions declared with zero-arguments and no explicit calling convention.
Syntax
-vo5[+|-]
           Arguments
           + |-                Specifying +, or just -vo5, directs the compiler to implicitly use the
                               CLIPPER calling convention for functions, methods and constructors
                               that are declared with zero arguments and no explicit calling
                               convention.
           Remarks
           For compatibility with Clipper, Visual Objects uses the CLIPPER calling convention for all
           functions and methods that are declared with zero arguments and no explicit calling
           convention. The STRICT keyword may be used to override the default, and cause the
           function to use the STRICT calling convention.
           However, in the vast majority of cases, parameters are never passed to functions and
           methods declared with zero arguments, and using the CLIPPER calling convention by
           default incurs unnecessary overhead not only in the function itself, but at every call site. In
           addition, the CLIPPER calling convention allows any number and type of arguments to be
           passed, preventing compile time error checking.
           In X#, functions and methods declared with zero arguments are compiled with the
           STRICT calling convention by default, unless the CLIPPER keyword is explicitly specified.
           This behavior is the exact opposite of Visual Objects, but results in more efficient code as
           well as compile time error checking. Passing any arguments to a function declared to
           accept zero arguments will raise a compile-time error.
           However, this can cause compatibility issues in code originally written in Visual Objects.
           The -vo5 compiler option reverses the default behavior of X# with regard to zero argument
           functions, so that the behavior is identical to Visual Objects.
           Regardless of whether this option is enabled or not, the CLIPPER and STRICT keywords
           can always be used to explicitly specify the desired calling convention.
Example
           The above example will compile and run correctly if -vo5 is used, or if the CLIPPER
           keyword is added at the end of the FUNCTION foo() declaration. Otherwise, a compiler
           error will be generated on the call to foo(), as well as on the calls to pcount() and
           _getFParam() (which are illegal in a STRICT calling convention function).
1.7.2.3.83 -vo6
The -vo6 option directs the compiler to resolve typed function pointers to PTR.
Syntax
-vo6[+|-]
           Arguments
           + |-                   Specifying +, or just -vo6, directs the compiler to resolve pointers that
                                  would resolve to typed function pointers in Visual Objects to PTR.
          Remarks
          X# does not supported typed function pointers. Existing Visual Objects code that declares
          typed function pointers will not compile in X#, unless the type is changed to PTR or IntPtr.
          If this option is enabled and a pointer type cannot be resolved, the compiler will attempt to
          locate a function with the same name as the pointer type (without "PTR"). If found, the
          compiler will resolve the type to PTR. This allows existing Visual Objects code to be
          compiled without modification, at least as far as the variable declaration is concerned.
          Example
          The following code is valid in Visual Objects, but will not compile in X# unless -vo6 is
          used.
Using -vo6 has the same effect as if the GLOBAL declaration were rewritten as:
          Note that PTR does not have the same semantics as typed function pointers in Visual
          Objects. However, typed function pointers are primarily used as arguments to CALL(),
          CCALL() and PCALL() in Visual Objects, which are not supported in X#. They have been
          replaced with CCallNative(), PCallNative() and CallManaged(), which accept IntPtr
          arguments. The same end result (invoking a function indirectly through a pointer) is
          therefore possible in X# without typed function pointers.
1.7.2.3.84 -vo7
           The -vo7 option directs the compiler to allow implicit casts and conversions that are
           allowed in Visual Objects but which would normally be illegal or require an explicit cast in
           X#.
Syntax
-vo7[+|-]
           Arguments
           + |-                   Specifying +, or just -vo7, directs the compiler to allow certain implicit
                                  casts and conversions that are allowed in Visual Objects.
           Remarks
           Visual Objects allows implicit casts between types with different semantics, whereas X#
           normally requires explicit casts in such cases.
           For example, Visual Objects allows implicit conversions between integer types and pointer
           types. While pointers are integers, they have different semantics. Integers are numerical
           values and pointers are addresses representing memory locations. In addition to the
           difference in semantics, the size of a pointer is dependent upon the underlying platform
           whereas the size of an integer does not change from platform to platform (with the
           exception of System.IntPtr).
           While is it possible (and often necessary) to cast between types with different semantics,
           it should always be done via an explicit cast. This not only insures that the correct
           conversion code is generated (if necessary), it also self-documents the fact that you are
           casting one type to another type that has a different meaning.
           X# supports most of the casts that Visual Objects supports, but in cases where the types
           have different semantics, an explicit cast is usually required. However, this can cause a
           large number of compiler errors in existing Visual Objects code.
           Using -vo7 allows the following conversions to be performed implicitly, allowing existing
           Visual Objects code to compile:
            From          To                   Operation Performed
            PTR               strongly typed       None, the types are binary compatible. However, the
                              PTR (e.g. INT        code may fail at runtime if the data the pointer points
                              PTR)                 to is not the correct type.
            INT or            strongly typed       None, the types are binary compatible. However, the
            DWORD             PTR (e.g. INT        code may fail at runtime if the data the pointer points
                              PTR)                 to is not the correct type. Note that this conversion is
                                                   only allowed when the target platform is set to x86.
           INT64 or      strongly typed        None, the types are binary compatible. However, the
           UINT64        PTR (e.g. INT         code may fail at runtime if the data the pointer points
                         PTR)                  to is not the correct type. Note that this conversion is
                                               only allowed when the target platform is set to x64 or
                                               Itanium.
           OBJECT        any other             Compiler inserts an explicit cast to the target type,
                         reference type        which may fail at runtime.
           type PTR      REF type              The compiler converts the pointer into a reference.
                                               Note that even with -vo7, not all pointers can be
                                               converted to references or else it would compromise
                                               the integrity of the garbage collector.
          Example
          The following code is valid in Visual Objects, but will not compile in X# unless -vo7 is
          used, because CreateObject() returns OBJECT and there is no implicit conversion from
          OBJECT to a more derived type (such a conversion cannot be guaranteed to be safe, and
          implicit conversions are always safe).
Using -vo7 has the same effect as if the assignment into f were rewritten as:
          In either case, the resulting code is exactly the same, and the cast to foo may fail at
          runtime. However, the explicit cast self-documents that you expect the return from
          CreateObject() to contain an instance of foo.
          The following example is also valid in Visual Objects, but will not compile in X# unless -vo7
          is used, because the @ operator returns the address of its operand (a typed pointer) and
          pointers are not the same as references in X#:
          The -vo7 option will automatically convert @x, which resolves to type INT PTR, into REF
          INT which is compatible with the function parameter. However, it is recommended that
          you remove the @ operator rather than use -vo7 for this purpose.
1.7.2.3.85 -vo8
Syntax
-vo8[+|-]
           Arguments
           + | -                  Specifying +, or just -vo8, changes certain aspects of the
                                  preprocessor to behave like Visual Objects.
           Remarks
           Unlike Visual Objects, X# uses a file-based preprocessor which has characteristics of
           traditional preprocessors in languages such as C, C++ and Clipper. The -vo8 option
           controls the following behaviors:
· Case Sensitivity
           In a traditional preprocessor, #define foo 1 and #define FOO 2 declare two separate
           preprocessor symbols, because preprocessor symbols are case-sensitive.
           However, in Visual Objects, DEFINE foo := 1 and DEFINE FOO := 2 declare the same
           entity (and would cause a compiler error because of the duplicate entity declaration).
           When -vo8 is used, #define foo 1 and #define FOO 2 declare the same preprocessor
           symbol (and would cause a compiler warning because of the redefinition).
          but the following code will raise an unknown variable error on ? Foo because the X#
          preprocessor is case-sensitive by default:
          Using The -vo8 option will allow the above example to compile. An alternative to using -vo8
          is to modify the code so that the case of the text you want to replace matches the case
          used in #define.
· #ifdef
          In a traditional preprocessor, code within a #ifdef ... #endif (or #else) block is compiled if
          the symbol after #ifdef is defined. It does not matter what the symbol resolves to, if it
          resolves to anything at all.
          In Visual Objects, code within a #ifdef ... #endif (or #else) block is compiled only if the
          symbol after #ifdef is defined, and it resolves to an expression which resolves to a logical
          TRUE value. In the example below, The code will print "in #else":
          When -vo8 is used, the X# preprocessor examines the value of the preprocessor symbol
          to determine if the symbol resolves to a logical TRUE or FALSE value. However, the X#
          preprocessor does not evaluate preprocessor expressions, whereas Visual Objects does.
          Even with -vo8 enabled, the preprocessor symbol must resolve to a single expression
          containing TRUE or FALSE (case-insensitive) or a numerical value. Numerical values of 0
          resolve to FALSE and all non-zero numbers resolve to TRUE. Preprocessor symbols that
          resolve to expressions are not evaluated and effectively resolve to FALSE.
For example:
          Tip:
          The -ppo option is useful for debugging the output generated by the preprocessor.
1.7.2.3.86 -vo9
           The -vo9 option prevents the compiler from raising error XS0161 when a function or
           method does not have any RETURN statements
Syntax
-vo9[+|-]
           Arguments
           + |-                   Specifying +, or just -vo9, allows functions and methods that do not
                                  have any RETURN statement to compile without raising an error.
           Remarks
           Visual Objects allows functions and methods whose return type is not VOID to omit
           RETURN statements. The return value from any such functions or methods will always be
           the default value for the return type.
           This is illegal in X#: all functions and methods must explicitly return a value unless the
           return type is VOID. However, this may prevent code that was originally written in Visual
           Objects from compiling in X#.
           If -vo9 is enabled, any non-void functions or methods that do not have any RETURN
           statements will raise warning XS9025 instead of error XS0106. The warning may be
           disabled if desired, but it is strongly recommended that you fix the code in question. If the
           return value is never used, then type the function or method AS VOID. Otherwise, add a
           RETURN statement with an appropriate return value.
           This compiler option also checks for methods/functions that have a return statement
           without value. In that case a warning XS9026 is shown.
           The final check this compiler option does it for methods that have a return value but are
           not expected to return anything. If that is found then a warning XS9032 is shown.
                3. In the Visual Objects Compatibility section, modify the "Allow missing return
                   statements" property.
Example
           In the first example, the return type is not specified so it defaults to USUAL, and since
           there is no RETURN statement the function will always returns NIL (the default value for
           USUAL) in Visual Objects. In the second example, since there is no RETURN statement
           the method will always return zero (the default value for INT) in Visual Objects.
1.7.2.3.87 -w
           The -w compiler option is an alias for the -nowarn command line option for compatibility
           with Vulcan.
1.7.2.3.88 -w arn
The -warn option specifies the warning level for the compiler to display.
Syntax
-warn:option
           Arguments
           option                The warning level you want displayed for the compilation: Lower
                                 numbers show only high severity warnings; higher numbers show
                                 more warnings. Valid values are 0-4:
            Warning level           Meaning
            0                        Turns off emission of all warning messages.
            1                        Displays severe warning messages
            2                        Displays level 1 warnings plus certain, less-severe warnings,
                                     such as warnings about hiding class members.
            3                        Displays level 2 warnings plus certain, less-severe warnings,
                                     such as warnings about expressions that always evaluate to true
                                     or false.
            4 (the default)          Displays all level 3 warnings plus informational warnings.
           Remarks
           To get information about an error or warning, you can look up the error code in the Help
           Index. For other ways to get information about an error or warning, see X# Compiler
           Errors.
Use -warnaserror to treat all warnings as errors. Use -nowarn to disable certain warnings.
For information on how to set this compiler option programmatically, see WarningLevel.
           Example
           Compile in.prg and have the compiler only display level 1 warnings:
1.7.2.3.89 -w arnaserror
Syntax
-warnaserror[+|-][:warning-list]
           Remarks
           Any messages that would ordinarily be reported as warnings are instead reported as
           errors, and the build process is halted (no output files are built).
           By default, -warnaserror- is in effect, which causes warnings to not prevent the generation
           of an output file. -warnaserror, which is the same as -warnaserror+, causes warnings to
           be treated as errors.
           Optionally, if you want only a few specific warnings to be treated as errors, you may
           specify a comma-separated list of warning numbers to treat as errors.
           Use -warn to specify the level of warnings that you want the compiler to display. Use -
           nowarn to disable certain warnings.
           Example
           Compile in.prg and have the compiler display no warnings:
1.7.2.3.90 -w in32icon
           The -win32icon option inserts an .ico file in the output file, which gives the output file the
           desired appearance in the File Explorer.
Syntax
-win32icon:filename
           Arguments
           filename            The .ico file that you want to add to your output file.
           Remarks
           An .ico file can be created with the Resource Compiler. The Resource Compiler is
           invoked when you compile a Visual C++ program; an .ico file is created from the .rc file.
           See -linkresource (to reference) or -resource (to attach) a .NET Framework resource file.
           See -win32res to import a .res file.
           Example
           Compile in.prg and attach an .ico file rf.ico to produce in.exe:
1.7.2.3.91 -w in32manifest
           Use The -win32manifest option to specify a user-defined Win32 application manifest file to
           be embedded into a project's portable executable (PE) file.
Syntax
-win32manifest: filename
           Arguments
           filename            The name and location of the custom manifest file.
           Remarks
           By default, the X# compiler embeds an application manifest that specifies a requested
           execution level of "asInvoker." It creates the manifest in the same folder in which the
           executable is built, typically the bin\Debug or bin\Release folder when you use Visual
           Studio. If you want to supply a custom manifest, for example to specify a requested
           execution level of "highestAvailable" or "requireAdministrator," use this option to specify
           the name of the file.
           Note
           This option and the -win32res option are mutually exclusive. If you try to use both options
           in the same command line you will get a build error.
           An application that has no application manifest that specifies a requested execution level
           will be subject to file/registry virtualization under the User Account Control feature in
           Windows Vista.
           Your application will be subject to virtualization if either of these conditions is true:
              · You use the -nowin32manifest option and you do not provide a manifest in a later build
                step or as part of a Windows Resource (.res) file by using The -win32res option.
              · You provide a custom manifest that does not specify a requested execution level.
           Visual Studio creates a default .manifest file and stores it in the debug and release
           directories alongside the executable file. You can add a custom manifest by creating one
           in any text editor and then adding the file to the project. Alternatively, you can right-click the
           Project icon in Solution Explorer, click Add New Item, and then click Application Manifest
           File. After you have added your new or existing manifest file, it will appear in the Manifest
           drop down list.
           You can provide the application manifest as a custom post-build step or as part of a
           Win32 resource file by using the -nowin32manifest option. Use that same option if you
           want your application to be subject to file or registry virtualization on Windows Vista. This
           will prevent the compiler from creating and embedding a default manifest in the portable
           executable (PE) file.
           Example
           The following example shows the default manifest that the X# compiler inserts into a PE.
           Note
           The compiler inserts a standard application name " MyApplication.app " into the xml. This
           is a workaround to enable applications to run on Windows Server 2003 Service Pack 3.
1.7.2.3.92 -w in32res
Syntax
-win32res:filename
           Arguments
           filename               The resource file that you want to add to your output file.
           Remarks
           A Win32 resource file can be created with the Resource Compiler. The Resource
           Compiler is invoked when include native resources (.RC files) in your X# Visual studio
           solution
           A Win32 resource can contain version or bitmap (icon) information that would help identify
           your application in the File Explorer. If you do not specify -win32res, the compiler will
           generate version information based on the assembly version. You can also include Menu
           and Dialog definitions in a RC file.
See -linkresource (to reference) or -resource (to attach) a .NET Framework resource file.
           Example
           Compile in.prg and attach a Win32 resource file rf.res to produce in.exe:
1.7.2.3.93 -w x
           The -wx compiler option is an alias for the -warnaserror compiler option for Vulcan
           compatibility
1.7.2.3.94 -xpp1
All XPP classes inherit from the Abstract class (default = OFF)
1.8       X# Examples
          The following X# Examples will also be installed as an example solution on your machine
          in the Users\Public\XSharp\Examples folder.
              USING System.Windows.Forms
              FUNCTION Start() AS VOID
                 TestAnonymous()
                 RETURN
              USING System.Collections.Generic
              USING System.Linq
              USING STATIC System.Console
              CLASS Developer
                 PROPERTY Name        AS STRING GET FirstName + " " + LastName
                 PROPERTY FirstName     AS STRING AUTO
                 PROPERTY LastName     AS STRING AUTO
                 PROPERTY Country     AS STRING AUTO
              END CLASS
              CLASS Country
                 PROPERTY Name         AS STRING AUTO
                 PROPERTY Region      AS STRING AUTO
              END CLASS
              //
              // This example shows that you can call an async task and wait for it to
              finish
              // The result of the async task (in this case the size of the file that has
              been downloaded)
              // will be come available when the task has finished
              // The calling code (The Start()) function will not have to wait until the
              async task has
              // finished. That is why the line "2....." will be printed before the
              results from TestClass.DoTest()
              // The sample also shows an event and displays the thread id's. You can see
              that the DownloadFileTaskAsync() method
              // starts multiple threads to download the web document in multiple pieces.
              USING System
              USING System.Threading.Tasks
            CLASS TestClass
               STATIC PROTECT oLock AS OBJECT      // To make sure we synchronize the
            writing to the screen
               STATIC CONSTRUCTOR
                  oLock := OBJECT{}
END CLASS
              //
              // XSharp allows you to not only use the using statement to link to
              namespaces
              // You can also link to a static class and call the methods in this class as
              if they are functions.
              // The functions WriteLine and ReadKey() in the following code are actually
              resolved as System.Console.WriteLine()
              // and System.Console.ReadKey()
              // Finally there is also the BEGIN USING .. END USING construct which
              controls the lifetime of a variable
              // At the end of the block the Variable will be automatically disposed.
              USING System
              USING STATIC System.Console
END CLASS
                  d := UInt32.MaxValue
                  ? "Initial value of d:", d
                  BEGIN UNCHECKED
                     // arithmetic operations inside an UNCHECKED block will not produce
                     // overflow exceptions on arithmetic conversions and operations,
                     // no matter if overflow checking is enabled application-wide or not
                     n := (INT)d
                     ? "Value of n after conversion:", n
                d ++
                ? "Value of d after increasing it:", d
             END UNCHECKED
              d := UInt32.MaxValue
              BEGIN CHECKED
                 // arithmetic operations inside a CHECKED block always do
                 // overflow checking and throw exceptions if overflow is detected
                 TRY
                    n := (INT)d
                    d ++
                 CATCH e AS Exception
                    ? "Exception thrown in CHECKED operation:", e:Message
                 END TRY
              END CHECKED
              Console.ReadLine()
           RETURN
           USING System.Collections.Generic
           FUNCTION Start AS VOID
               LOCAL e AS EventsExample
               e := EventsExample{}
               e:Event1 += TestClass.DelegateMethod
               e:Event1 += TestClass.DelegateMethod
               e:Event1 -= TestClass.DelegateMethod    // added 2, removed 1, should be
           called once
               e:Event2 += TestClass.DelegateMethod
               e:Event2 += TestClass.DelegateMethod
               e:Event2 -= TestClass.DelegateMethod // added 2, removed 1, should be
           called once
               e:Event3 += TestClass.DelegateMethod
               e:RaiseEvent1("This is a test through a multi line event definition")
               e:RaiseEvent2("This is a test through a single line event definition")
               e:RaiseEvent3("This is a test through an old style event definition")
               Console.WriteLine("Press a Key")
               Console.ReadLine()
           CLASS TestClass
               STATIC METHOD DelegateMethod(s AS STRING ) AS VOID
                   Console.WriteLine( s)
           END CLASS
           CLASS EventsExample
               PRIVATE eventsTable AS Dictionary<STRING, System.Delegate>
               PRIVATE CONST sEvent1 := "Event1" AS STRING
               PRIVATE CONST sEvent2 := "Event2" AS STRING
               CONSTRUCTOR()
                   eventsTable := Dictionary<STRING, System.Delegate>{}
                         eventsTable:Add(sEvent1,NULL_OBJECT)
                         eventsTable:Add(sEvent2,NULL_OBJECT)
                  // Multiline definition
                  EVENT Event1 AS EventHandler
                      ADD
                          BEGIN LOCK eventsTable
                              eventsTable[sEvent1] := ((EventHandler)
              eventsTable[sEvent1]) + value
                          END LOCK
                          Console.WriteLine(__ENTITY__ + " "+value:ToString())
                      END
                      REMOVE
                          BEGIN LOCK eventsTable
                              eventsTable[sEvent1] := ((EventHandler)
              eventsTable[sEvent1]) - value
                          END LOCK
                          Console.WriteLine(__ENTITY__+ " "+value:ToString())
                      END
                  END EVENT
                  // Single Line defintion on multilpe lines with semi colons, for better
              reading !
                  EVENT Event2 AS EventHandler ;
                      ADD     eventsTable[sEvent2] := ((EventHandler)
              eventsTable[sEvent2]) + value ;
                      REMOVE eventsTable[sEvent2] := ((EventHandler)
              eventsTable[sEvent2]) - value
           //
           // This example shows various new expression formats
           //
           using System.Collections.Generic
           CLASS Person
              EXPORT FirstName   AS STRING
              EXPORT LastName      as STRING
              EXPORT Parent      as Person
              CONSTRUCTOR(First as STRING, Last as STRING)
                 FirstName   := First
                 LastName   := Last
END CLASS
          As you can see the BEGIN FIXED statement requires a local variable declaration. The
          contents of this local (in the example above a CHAR PTR) will be excluded from garbage
          collection inside the block.
          Please note:
          The FIXED keyword and the example above should be used with extreme care. Strings in
          .Net are immutable. You normally should not manipulate strings this way !
              /*
              Stack Example - Written by Robert van der Hulst
              This example shows that we can now create generic classes with X# !
              Note: Compile with the /AZ option
              */
              USING System.Collections.Generic
              USING STATIC System.Console
            FOR I := 1 TO 10
               oStack:Push(i)
            NEXT
            WriteLine("Popping the stack until it is empty")
         i := 0
         WHILE oStack:Size > 0
             i += 1
            WriteLine(oStack:Pop())
         END
         WriteLine("{0} Items popped from the stack",i)
         WriteLine("Press Enter")
         ReadLine()
         WriteLine("The next line pops from an empty stack and throws an
      exception")
         ReadLine()
         WriteLine(oStack:Pop())
         CATCH e AS Exception
            WriteLine("An exception was catched: {0}", e:Message)
         END TRY
         WriteLine("Press Enter to Exit")
         ReadLine()
         RETURN
         CONSTRUCTOR()
            SELF(100)
         CONSTRUCTOR(nCapacity AS INT)
            _Capacity := nCapacity
            _Items := T[]{nCapacity}
            _Size := 0
            RETURN
              Lamda Expressions are very much like CodeBlocks, but the difference is that
              it has optoinal typed parameters and return values.
              You can also specify the parameter type in the parameter list as the 3rd
              example shows
              USING System.Collections.Generic
              USING System.Linq
              USING STATIC System.Console
              CLASS Developer
                 PROPERTY Name         AS STRING GET FirstName + " " + LastName
                 PROPERTY FirstName      AS STRING AUTO
                 PROPERTY LastName      AS STRING AUTO
                 PROPERTY Country      AS STRING AUTO
              END CLASS
              CLASS Country
                 PROPERTY Name         AS STRING AUTO
                 PROPERTY Region      AS STRING AUTO
              END CLASS
              //
              // The SWITCH statement is a replacement for the DO CASE statement
              // The biggest difference is that the expression (in this case sDeveloper)
              is only evaluated once.
              // which will have a performance benefit over the DO CASE statement
              // Empty statement lists for a CASE are allowed. In that case the labels
              share the code (see CHRIS and NIKOS below)
              //
              // Please note that EXIT statements inside a switch are not allowed, however
              RETURN, LOOP and THROW are allowed.
              using System.Collections.Generic
           //
           // XSharp allows you to not only use the using statement to link to
           namespaces
           // You can also link to a static class and call the methods in this class as
           if they are functions.
           // The functions WriteLine and ReadKey() in the following code are actually
           resolved as System.Console.WriteLine()
           // and System.Console.ReadKey()
           // Finally there is also the BEGIN USING .. END USING construct which
           controls the lifetime of a variable
           // At the end of the block the Variable will be automatically disposed.
           USING System
           USING STATIC System.Console
                  WriteLine("------------------")
                  BEGIN USING VAR oTest := Test{}
                     oTest:DoSomething()
                  END USING
                  WriteLine("------------------")
                  WriteLine("After Using Block")
                  ReadKey()
END CLASS
              //
              // The VAR keyword has been added to the language because in many situations
              // the result of an expression will be directly assigned to a local, and the
              expression
              // will already describe the type of the variable
              // VAR is a synonym for LOCAL IMPLIED in Vulcan
              using System.Collections.Generic
Console.ReadLine()
RETURN
         aList:Add("ghi")
         return aList
         This "Bring Your Own Runtime" (BYOR) example shows how you can use Vulcan
         Datatypes
         and functions in X#.
         The example does NOT come with the Vulcan Runtime DLLs. You need to have
         these installed
         on your machine and you may need to update the references in the example and
         point them
         to the Vulcan Runtime DLLs on your machine.
            DateSamples()
            Conversion()
            Strings()
            Numeric()
            Wait()
            Arrays()
            Symbols()
            LateBinding()
            Wait()
            Workarea()
            Wait()
            Macros()
            Wait()
            CodeBlocks()
            Wait()
Console.ForegroundColor := startingColor
                  Console.ForegroundColor := c
                  Console.WriteLine(s)
                  Console.ForegroundColor := originalColor
                  LOCAL n AS DWORD
                  n := At("0",s)
                  Console.WriteLine(String.Format("At is {0}",n))
         LOCAL f AS FLOAT
         f := Sqrt(10)
         Console.WriteLine(String.Format("The root of 10 is {0}",f))
         RETURN
RETURN
RETURN
                  ENDDO
                  DbCloseArea()
                  ?
                  RETURN
using System.Collections.Generic
              // The Yield return statement allows you to create code that returns a
              // collection of values without having to create the collection in memory
              first.
              // The compiler will create code that "remembers" where you were inside the
              // loop and returns to that spot.
              FUNCTION Start AS VOID
                 FOREACH nYear AS INT IN GetAllLeapYears(1896, 2040)
                    ? "Year", nYear, "is a leap year."
                 NEXT
                 Console.ReadLine()
              RETURN
.XOR. 265
Index                    -/-
                         /     262
---                      /* */
                         //
                                  250
                                250
                         /=      264
-    262, 269
--    269
                         -:-
-!-                      :=    264
!    265
                         ---
-#-                      -?   314
#command
#define    277
                271
                         -@-
#else     278
#endif 279               @ compiler option   297
#endregion     281
#ifdef 279, 281
#ifndef 279
                         -^-
#include     280
#line    280             ^ 262
#LOAD       163          ^= 264
#pragma      280
#R
#region
       163
            281
                         -_-
#translate    281        __ARRAYBASE__        250
#undef 287               __CLR2__    250
#USING       249         __CLR4__    250
                         __CLRVERSION__       250
- %-                     __DATE__
                         __DATETIME__
                                      250
                                           250
%  262                   __DEBUG__      250
%=  264                  __DIALECT__     250
                         __DIALECT_CORE__       250
                         __DIALECT_HARBOUR__        250
-&-                      __DIALECT_VO__
                         __DIALECT_VULCAN__
                                             250
                                                  250
&  266                   __ENTITY__    250
&&  250, 265             __FILE__   250
&=  264                  __FUNCTION__      250
                         __LINE__   250
-*-                      __MODULE__
                         __SIG__   250
                                         250
                         __SRCLOC__      250
*  262                   __SYSDIR__     250
**  262                  __TIME__    250
*=  264                  __UTCTIME__     250
                         __VERSION__      250
-.-                      __VO1__
                         __VO10__
                                    250
                                     250
                         __VO11__    250
.AND.  265, 266          __VO12__    250
.NOT.  265               __VO13__    250
.OR.  265, 266           __VO14__    250
.PRGX 163                __VO15__    250
__VO2__      250
__VO3__
__VO4__
             250
             250             ->-
__VO5__      250
__VO6__      250             >    267
__VO7__      250
__VO8__
__VO9__
             250
             250
                             ---
__WINDIR__      250
                             ->    270
__WINDRIVE__       250
__XSHARP__       250
_ARGS
_DLL
           252
         220
                             ->-
_DLL FUNCTION       220      >=  267
_DLL PROCEDURE         220   >>  269
_FIELD     270               >>=  264
_GETFPARAM        252
_GetInst
_GETMPARAM
            252
                   252       -A-
_WINCALL      250
                             -a    300
-|-                          ABSTRACT 221
                             ACCESS         215
                             ADD      97, 214
|  266                       -additionalfile    299
|| 265                       -addmodule        299
|=  264                      ALIAS      270
                             alias operator      270
-~-                          ALTD
                             -analyzer
                                       252
                                            300
                             -appconfig      300
~  266
                             ARGCOUNT 252
~=  264
                             ARRAY        161, 205
                             ARRAY OF          159
-+-                          AS     230, 260
                             ASCENDING          260
+  262, 269                  ASSIGN        215
++  269                      assignment operator       264
+=  264                      ASYNC        221, 226
                             Attributes      220
<
<<
    267
     269                     -B-
<<=   264
<=   267                     -baseaddress      303
                             BEGIN      90, 91, 92, 226, 227, 249
                                                 ENDDO        229
-C-                                              ENDIF
                                                 Entities
                                                            231
                                                              181
                                                 ENUM       209, 333, 393
CASE      227, 242                               EQUALS        260
CATCH      242                                   -errorendlocation    311
CCALL      252                                   -errorreport    312
CCallNative     252                              EVENT 97, 214
Char    203, 244                                 EXIT 108, 229
CHECKED         90, 226                          EXPLICIT 215
-checked     303, 314, 337                       EXPORT 221
-checksumalgorithm       304                     Expression Statement     223
CLASS      209, 333                              EXTERN        221
Click here for the version history   9
Clipper
CODEBLOCK
           250, 267
                   161, 206                      -F-
-codepage      305
'compatible string comparions      267           FASTCALL        250
Compiler Options      287, 289, 294              FIELD      217, 229, 270
CONST 209                                        -filealign   313
CONSTRUCTOR           213                        FINALLY       227, 242
-cs    305                                       FIXED      91, 226
                                                 FLOAT 161, 207
-D-                                              FOR
                                                 FOREACH
                                                           230
                                                                 230
                                                 -fovf 314
-d    306                                        foxpro     310
Date      161, 207, 246                          FROM        260
dbase      310                                   -fullpaths    314
-debug      306                                  FUNCTION        218
DECLARE         213
DEFAULT 96, 242
DEFINE        219                                -G-
-define     308
-delaysign      309                              GAC     158
DELEGATE          209, 333                       Generic   95
DESCENDING          260                          GET 216
DESTRUCTOR           214                         GLOBAL      209
-dialect     310                                 GROUP      260
DIM      209
DO
DO CASE
        229
                227                              -H-
-doc     310
DOWNTO          230                              Harbour    310
DWORD         203                                -help    314
DYNAMIC         203                              HIDDEN      221
dynamic memory variable      270                 -highentropyva    315
-E-                                              -I-
ei"..."  102                                     -i     315
ELSE     231                                     i"..."    102
ELSEIF     231                                   ie"..."    102
END     209, 211, 226, 227, 229, 231, 242, 249   IF      231
END CASE       227                               IMPLEMENTS          209, 212
END FIXED      226                               IMPLICIT 215
END LOCK      226                                IMPLIED       230, 231
END SCOPE        227                             IN      229, 230, 260
END SEQUENCE         227                         INHERIT 209
END UNSAFE        227                            -ins     316
END USING       227                              Installation    158
ENDCASE       227                                INSTANCE         217
                                   -out    336
Lamda      390
                                   OVERRIDE       221
Lamda Expression      390
                                   -ovf 337
-langversion    319
-lb    319
LET 260
-lib   321
                                   -P-
-link   322                        -parallel    337
-linkresource    324               Parameters       181
LINQ     103                       PASCAL        250
LOCAL       230, 231               -pathmap       337
LOCK      226                      PCALL       252
Logic    161, 204, 246             PCallNative      252
logical operator   265             PCOUNT 252
LONG       203                     -pdb      338
LONGINT 203                        -platform     338
LOOP       235                     -ppo      340
                                   pragma       280
-M-                                -preferreduilang
                                   Preprocessor
                                                        340
                                                      271, 277, 278, 279, 280, 281,
-main   326                        287
MEMBER      209, 212               PRGX 163
MEMVAR      235                    PRIVATE        221, 237
METHOD      215                    PROCEDURE           218
-moduleassemblyname          327   project templates      169
-modulename     329                PROPERTY          216
                                   PROTECTED          221
                                   PSZ 162, 207
-N-                                PTR
                                   PUBLIC
                                             204
                                                221, 239
NAMESPACE         218, 249
NameSpaces
NEXT 230
                 249
                                   -R-
-noconfig    330
-nologo    330                     REAL4      204
NOP      105, 236                  REAL8      204
-nostddefs    331                  RECOVER        227
-nostdlib   331                    -recurse    341
-nowarn    332                     REF      222
-nowin32manifest     332           -reference   342
-ns    333                         -refonly   344
-S-                              VIRTUAL
                                 vo    310
                                               221
                                 -vo1    354
-s    347                        -vo10    355
SCOPE        227                 -vo11    356
scripting     163                -vo12    356
SEALED        221                -vo13    267, 357
SELECT 260                       -vo14    359
SELF      213                    -vo15    360
SEQUENCE          227            -vo2    362
SET 216                          -vo3    363
SetCollation     267             -vo4    364
shift operator    269            -vo5    366
SHORT 205                        -vo6    367
SHORTINT 205                     -vo7    369
-showdefs      348               -vo8    371
-showincludes       348          -vo9    373
SLen      252                    VOID      205
-snk    349                      VOSTRUCT 212, 333
STATIC      209, 221, 231, 249   vulcan     310
-stddefs     349
STEP
STRICT 250
           230
                                 -W-
STRING       102, 205
STRUCT 212                       -w    374
STRUCTURE          212, 333      -warn    374
-subsystemversion       349      -warnaserror    375, 379
SUPER        213                 warnings    280
SWITCH        106, 242           WHERE       260
SYMBOL         162, 205, 207     WHILE     229
                                 -win32icon    376
-T-                              -win32manifest
                                 -win32res    378
                                                   377
                                 Windows      267
-target    351                   WORD      205
templates     169, 171           workarea     270
THISCALL       250               -wx    379
THROW        242
TO      230
-touchedfiles    352             -X-
TRY      242
Typed Enums       393            xBase++    310
                                 -xpp1   379
-U-                              XS9082    10
                                 XSharp.__Array   161
                                 XSharp.__ArrayBase     159
unary operator   269             XSharp.__Date   161
UNCHECKED        91, 226         XSharp.__Float   161
Unicode    267                   XSharp.__Psz   162
UNION     212                    XSharp.__Symbol     162
UNIT64    205                    XSharp.__Usual    162
UNSAFE      92, 221, 227         XSharp.__WinBool     161
-unsafe   353                    XSharp._CodeBlock     161
XSharp.CodeBlock    161
XSharp.Core   154
XSharp.Macrocompiler    156
XSharp.Macrocompiler.Full.DLL   156
XSharp.RDD    157
XSharp.RT 154
XSharp.VFP    155
XSharp.VO    155
XSharp.XPP    155
XSharpScript   163
xsi.exe  163
-Y-
YIELD   108, 242
YIELD BREAK     242
YIELD EXIT 242
YIELD RETURN     243