HELP (Preprocessor)

From Esolang
Jump to navigation Jump to search

HELP (Handy Esoteric Language Preprocessor) is a preprocessor created by User:AnotherTest intended to allow faster writing of programs in esoteric programming languages. Its macros are actually regular expressions, allowing the esolang's syntax to be extended. Macros are always applied globally, however the order in which they are defined resembles the order of their application.

Special Directives

Directive Description Toggles
skip whitespace Will remove all whitespace after preprocessing. Yes
reduce whitespace Will leave at most one space of whitespace between two non-whitespace characters after preprocessing. Yes
include Includes the file specified. N/A

Macros that substitute in macros

A macro can create a new macro. HELP will continue until it doesn't find any more directives in the source code.

HELP files

HELP files have the extension .help. Their name is then ext.help, where ext is the extension of the files to which this HELP file may be applied. A HELP file can contain only directives, all other lines will be ignored. They should be used to create a general syntax extension for a specific language.

Future features

Currently, HELP only supports regular-expression based replacements and a limited amount of special directives . The intention is that other features will be added, including:

  • Defining constants with a #define directive
  • Conditionals
  • User-defined initial directive character. '#' is already used in some languages (for example in comments).
  • The ability to undefine unwanted macros (useful in combination with HELP files).

Practical usage

HELP is the standard preprocessor for X.so, where it is used to add C-style and C++-style comments to the language. It also adds a new calling syntax, that is similar to a prefix notation.

Besides that, HELP can also be used to translate Burlesque programs to Underload programs. Similar automated translations may perhaps be another future use of HELP.

Examples

Function-like constructs for Burlesque

It is possible to add syntactic constructs to Burlesque using HELP:

# //[^\n]* := 
# /\*.*\*/ :=
// For while
# wh\s+(.*?)\s*:\s*(.*?)\s+hw := {\2} {\1} w!
// For functions
# fn\s+(.+)\s*:\s*(.*?)\s+nf := #\1\\s*\\((.*?)\\) := \\1\\s\2\\s\n
# reduce whitespace
fn test: // a function
    wh 10 .<:
        ^^
        \\/ // we must use a double back-slash because of a technical limitation
        1 .+
    hw
nf
test(5)

This program will be expanded to:

5 {^^ \/ 1 .+ } {10 .<} w!

Which will give the following output:

10
9
8
7
6
5

Repeat for Burlesque

It is also possible to define a repeat construct. This allows something like the following:

# rpt\s+(.*?)\s*:\s*(.*?)\s+tpr := 0 {\2 1 .+} {\1 .<} w!
# reduce whitespace
rpt 5:
    ^^
    2 .*
    \/
tpr
vv

Which becomes:

0 {^^ 2 .* \/ 1 .+} {5 .<} w! vv

The above will output the first 5 even numbers.

If for Burlesque

If and if-else statements can also be added (with a different syntax):

# ife\s+(.*?)\s*:\s*(.*?)\s+else\s*:\s*(.*?)\s+efi := {\2} {\3} \1 ie
# if\s+(.*?)\s*:\s*(.*?)\s+fi := {\2} \1 if
# reduce whitespace
ife 0:
    5
else:
    if 1:
        10
    fi
efi

Will become:

{5} {{10 } 1 if} 0 ie

Which outputs 10, as expected.

See also

External resources