Con-Text

Con-Text is an esoteric programming language created in 2004 created by User:Sphen lee. It is equivalent to C/C++ however it relies on context so much that it can be impossible to determine what a line does without looking at the entire program.
==Syntax==
Any line beginning with a single # is a declaration. Simple variables are terminated by a newline; arrays are followed by a list of dimensions separated by hashes; functions are followed by a list of parameters separated by hashes. All primitive variables are integers. The type of an array, function, or parameter defaults to integer, unless a class is specified (see below). Characters use C-style character literals (eg. 'a') and are stored in integers. Strings are C-style (eg. "abc") and are stored in integer arrays.
Con-Text	Equivalent C
 #var
 #array #2 #2
 #func #x #y #z	
 int var;
 int array[2][2];
 int func(int x, int y, int z);
Lines beginning without a hash are statements (usually).
Con-Text	Equivalent C
 var #array #1 #func #2 #3 #4
 array #1 #2 #var
 func #1 #2 #3	
 var = array[1][func(2, 3, 4)];
 array[1][2] = var;
 func(1, 2, 3);
After declaring a function you have to implement it. Lines beginning with double hash implement functions (except ##start which is the program entry point). Assigning a value to the name of a function from within that function returns that value from the function (sounds complicated but it's the same as QBasic). Calling a function from within that function however is a recursive call. Functions can be overloaded on the number and type of arguments.
 #func #param (declare the function) 
 ##func (implement the function)
 (body of function here)
 func #expression (returns a value)
 &#
An 'if' statement is created by placing an expression after an ampersand, if the condition is non-zero the body of the statement is executed (the body is terminated by "&#").
 & #condition
 (body of 'if' statement here)
 &#
A While statement is created similarly, except that it is terminated by "&" instead.
==Exception Handling==
An expression can be thrown by following it with &. A try block looks like an if statement with no condition. Following this is a series of catch blocks, which look like declarations of the type of the value to be caught. Each catch block ends with &#. The first non-declaration marks the end of the catch statements (this implies that you cannot declare a variable directly after a catch block).
 # (try)
 (block to try)
 12& (throw integer 12)
 &#
 #x (catch an integer, call it x)
 (body of catch)
 &#
 #Exception #e (catch an Exception object, call it e)
 (body of catch)
 &#
 func #param (non-declaration, end of catch blocks)
==Object Orientation==
To declare a class use #class-name # (newline). The body of the class follows consisting of variable and function declarations. Constructors are not supported (use factory functions instead). The class body ends with &#. To access members of an object use object #member. To declare an instance of a class use #class-name #object name at any place where an ordinary identifier could be used. For example
 #Vector2D#
 #x
 #y
 #normalise #dummy (dummy parameter to make a function)
 #getLength #dummy
 &# 
 #Vector2D #v (create a Vector2D called v)
 v #x #1 (v.x = 1)
 print #v #getLength #null ( print(v.getLength(null)) )
To implement a member function of a class (a method) used this syntax: ##class name #function name. For example:
 ##Vector2D #normalise (implements Vector2D's normalise method)
 x #div #x #getLength #null
 y #div #y #getLength #null
 &#
==Notes==
'null' is a built in variable used to fill the dummy parameters of functions (since all functions require at least one parameter).
Comments are enclosed by parentheses.
There are no operators; all operations are done using built in functions (like add, sub, mult and div).
==Sample Program==
Here is a sample program that calculates one root of a quadratic equation. (Comments are in parentheses)
 #root #a #b #c
 ##root
 #dis
 dis #sub #mult #b #b #mult #mult #4 #a #c
 & #gte #dis #0 (an 'if' statement)
 root #div #sub #neg #b #sqrt #dis #mult #2 #a
 &#
 dis & (throws the discriminant because it was negative)
 &#
 ##start
 #x
 x #root #1 #neg #2 #4 (root of x^2 - 2x + 4 == 0)
 &#
==Implementation==
Unfortunately no interpreter or compiler exists at the moment, as I am unable to create a parser to parse this horrendous language.
==Turing-completeness==
Assuming unbounded integers (and unbounded while loops), compilation into a Minsky machine is possible.
category:Languages Category:Unimplemented Category:Turing complete Category:2016