Язык оперирует одним типом данных - вещественными числами, в которых заключена вся хитрость. Вещественные записываются в виде:
/
возможен "-"/цифры
.цифры
E/возможен "-"/цифры
Bцифры
Цифры до точки - целая часть числа, после точки (необязательно) - дробная часть (если отсутсвует, то принимается за 0). Эту часть будем называть множителем.
После Е (латинская Е большая) необязательная часть - степень основания текущей системы счисления. Эту часть будем называть показателем. Если отсутствет, то принимается за 0.
После B (латинская B большая) необязательная часть - основание системы счисления (от 2 до 10 включительно). Если отсутсвует, то принимается за 10.
Первые нули, если они присутствуют, - не являются значимыми.
Примеры записи чисел:
101 (=101)
101B2 (=5)
1.01E2B2 (=5)
5B6 (=5)
314 (=314)
314.159 (=314.159)
3.14159Е2 (=314.159)
3.14159Е2B10 (=314.159)
Ограничения на длину чисел - как множителя, так и показателя - сто тысяч значащих цифр. Число 3.141591256137462364012630941207823456782346734657634789653478969723465623478659834657834695623895347658934623
Е2346279469234689623489
- является корректным числом.
Некорректно заданное число, а также результат деления на ноль и т.п. некорректных операций являются особого рода числом - "нечислом". Примеры:
12Q12356 (="нечисло")
1.-1E12 (="нечисло")
5.3B2 (="нечисло")
1/0 (="нечисло")
Число значащих цифр (точность числа) есть сумма количества цифр дробной и целой части множителя (нули справа целой части - не считаются).
1.0 (две значащих цифры)
10 (две значащих цифры)
0.1 (одна значащая цифра)
1Е2 (одна значащая цифра)
0000000001 (одна значащая цифра)
1.1B3 (две значащих цифры)
111В2 (одна значащая цифра)
111.11В2 (пять значащих цифр)
Точность результатов вычислений определяется точностью задания чисел. Точность результатов вычислений может быть повышена в процессе вычислений согласно простому правилу: при сложении или вычитании берётся наибольшая точность операндов. При умножении или делении точность операндов складывается. Перед операцией числа приводятся к системе счисления числа с наибольшим базисом (при этом, после перевода число с меньшим базисом
сохраняет абсолютное количество значащих цифр (математически это неправильно, но здесь так есть

)). Например,
5.00 + 1Е1 = 15.00
5.0*3.0 = 15.00
1500 * 1Е-2 = 15.00
1/3 = 0.3
1.0/3.0 = 0.3333
1/1В2 = 0.25
1/1B3 = 0.33
111В2*1 = 8.000
Вроде бы, максимально понятно, не?

Существуют операции над числами:
code text
+ (сложение)
- (вычитание)
* (умножение)
/ (деление)
^ (степень)
> (если то, что слева больше того, что справа, то результат единица, иначе - ноль; числа с разной точностью - это РАЗНЫЕ числа)
< (если то, что слева меньше того, что справа, то результат единица, иначе - ноль; числа с разной точностью - это РАЗНЫЕ числа)
== (если правое и левое равны, то единица, иначе ноль)
Операторы <, >, == имеют наинизший приоритет.
Операторы * и / имеют приоритет над + и -,
Оператор ^ имеет приоритет над *, /, + и -.
Сначала исполняются операторы с наивысшим приоритетом.
Скобки ( и ) могут менять приоритет исполнения. Например, выражение (2+1)*2 даст 6
В остальном порядок исполнения определяется порядком в выражении.
Деление на ноль даёт нечисло.
Любая операция с нечислом даёт нечисло.
Исключение - оператор ==. Сравнивание нечисла с нечислом через этот оператор даёт 1, если же нечисло - лишь одно из операндов, то оператор даёт 0.
Язык case sensitive, имена могут состоять из букв латинского алфавита от a до z, цифр и символа подчёркивания "_", но не могут начинаться с цифры.
Операторы разделяются символом точки с запятой ;.
Пробелы и переводы строки игнорируются и могут стоять в любом месте и любом количестве.
Переменные заводятся в тот момент, когда они впервые встретились в контексте по ходу исполнения. После заведения они содержат "нечисло". Например,
B = 1 (после выполнения существует переменная B равная 1)
В = 1*А (А - впервые упомянута, после выполнения В - нечисло)
Везде, где может стоять переменная, может стоять число или выражение любой сложности.
Выражение [переменная] подставляет значение целой части переменной в текст программы. Например,
B[A] = 2 (при выполнениии A = 1.01Е2В2, программа должна выполнить "B101 = 2")
Встроенные операторы:
print(переменная) - выводит переменную в её системе счисления с её родной точностью (нечисло выводится как NaN)
if(переменная)оператор - выполняет оператор, если переменная не нечисло и не 0
goto(метка) - безусловный переход исполнения на метку (метка имеет вид :метка: (и является нормальным оператором, то есть, отделяется точкой с запятой). Например, :a:; - метка а)
while(переменная)оператор - выполняет оператор до тех пор, пока переменная является числом и не равна 0.
{} - все операторы, что внутри этих скобок считаются одним оператором (например, if(a=3){print(a);print(b);}
plot(переменная1, переменная2, переменная3, переменная4) - ставит в окне программы/на экране точку с координатами (х=переменная1, у=переменная2), цветом переменная3 и ключом переменная4.
Размеры окна/экрана вывода - на усмотрение программиста, внутренние "программные" координаты с каждым выводом точки пересчитываются так, чтобы все точки всегда находились внутри экрана, всё изображение всегда внутри окна/экрана. Максимальное значение использованого когда-либо цвета соответсвует белому, минимальное - чёрному, цвета всех точек пересчитываются при каждом выводе.
unplot(переменная) - удаляет с экрана все точки с ключом переменная.
Интерпретатор должен уметь читать программу из файла.
Выполнение начинается с первой строки файла.
Программа всегда состоит из одного оператора.
В случае ошибки, интерпретатор обязан выдать строку в интерпретируемом файле, назвать ошибку и ожидать какого-нить нажатия клавиши или что-то в этом роде.
В случае нормального завершения, программа должна завершить процесс (ничего не ждать, а то бенчмаркить запаримся

).
Реализация функциональности - на усмотрение программиста. Отсутсвие функциональности засчитывается как её нулевое быстродействие.
...А неубитые медведи делили чьи-то шкуры с шумом.
Боюсь, мы поздно осознали, к чему всё это приведёт.