Язык программирования моей мечты

Apr 23, 2009 08:32

Поскольку я сейчас нездоров, серьёзными делами заниматься нет сил, то опубликую всё-таки мои наброски "языка программирования моей мечты", о котором я уже упоминал. Это именно наброски, конспект - скорее для себя самого, чтобы не забыть. Я не стал оформлять в БНФ, думаю, опытным программистам достаточно неформального описания. Ну и, конечно, далеко не все вопросы проработаны, есть кое-какие вещи, которые ещё не устоялись (да и вообще этот "проект" регулярно подвергается реформам - надо же мне чем-то заниматься, когда стою в очередях ;))

Да, и не стоит ждать никаких откровений: все использованные мной идеи придуманы давным-давно, я просто соединил их вместе.

UPD: Добавил много забытого.


Зарезервированные слова (48 штук):

and continue final is proc then
bool do finally long protected this
break double float not public true
byte else for object raise try
case elsif if or return var
char end import override static when
class enum int package super while
const false interface private synchronized with

Единица компиляции - файл, файлы объединяются в пакеты (как в Java):

package qwerty.asdf;
import asdf.qwerty.*;
/*Не решён вопрос: разрешать ли на верхнем уровне только классы, интерфейсы и перечислимые типы, или считать файлы "модулями" и разрешить также процедуры и переменные*/

Комментарии - /*...*/ (допускаются вложенные) и // (однострочные).

Все типы данных (включая предопределённые int и др.) - классы (предопределённые - final, т.е. не переопределимые). Нет оператора new, само имя класса с параметрами является вызовом конструктора. Пустой список параметров можно опускать (как в конструкторах, так и в вызовах процедур-методов).

Описание перечислимого типа:

enum Asdf (aaa,bbb,ccc); //тип Asdf имеет значения aaa,bbb,ccc
Допускается наследование перечислимых типов:

enum Qwerty: Asdf (xxx,yyy,zzz); //тип Qwerty имеет значения aaa,bbb,ccc,xxx,yyy,zzz

Интерфейс:

interface Xcv: Abc is
proc abcd(x: int; y: bool): int;
end interface;

Класс:

class Zxcv{class T}: Uiop interface Xcv is
this is // конструктор
...
end this;

this (val: int) is
...
end this;

public proc xxx(n: int) is
...
end proc;
protected:
var x: int;
proc ax(i: int): int is
...
end;
private:
var y: float;
end class;

Все методы являются замыканиями (т.е. сохраняют свои локальные переменные, пока есть ссылка на вложенный метод или класс).

Определение "свойства" (property): для чтения - это просто процедура, возвращающая значение, для записи - другая процедура с тем же именем и с одним аргументом:

class MyClass is
proc size: int is
...
end;
proc size(sz: int) is
...
end;
end;

var m: MyClass; ...
m.size:=10;
s:=m.size;

В теле класса кроме полей, констант и методов допускается присваивание полям (т.е. нечто вроде ограниченного конструктора), зачем это нужно - см. чуть ниже.

Переменная-процедура:

var p: proc (int, int): int;

В выражении (например, в аргументе процедуры) можно использовать безымянную процедуру:

abcd(proc (int): float is ... end);
Если тип формального параметра - процедура без параметров, возвращающая значение, то вместо безымянной процедуры можно использовать просто выражение, возвращающее соответствующее значение:

abcd(a+b);
Это очень эффективно, например, для логов:

proc log(proc s: String) is
if debugLevel>3 then
print(s);
end;
...
end;

log("asdf "~S~": "~SS); //здесь конкатенация выполняется только если вывод в лог будет реально происходить

Создание безымянного класса с переопределением методов:

var x := MyClass is
... // переопределение методов
end;
Здесь можно использовать присваивание полям:

var textField:=TextField("asdf") is
title:="qwrqwerwqer";
name:="asdfasdf";
width:=100;
height:=50;
...
end;

Условный оператор:

if условие then
...
elsif условие then
...
else
...
end if;
Краткие формы:

if условие return ...;
if условие break;
if условие continue;
if условие raise ...;

В выражении:

a:= if ... then 1 else 0 end;

Оператор выбора:

case x
when 1 do
...
when 2 do
...
else
...
end case;

Оператор присоединения (одновременно играет роль оператора выбора типа):

with rec do
when T1 do
...
when T2 do
...
else
...
end with;
или краткая форма (без выбора):

whith rec do
...
end with;

Выбор и присоединение также допускаются в выражениях (аналогично if).
Зарезервированные слова (if, case и т.п.) после end разрешается опускать.

Обработка исключительных ситуаций:

try
...
raise Exception;
...
when e: Exception do
...
finally
...
end try;

Цикл с условием:

while ... do
...
end while;

Цикл по итератору:

for a: iter(param) do
...
end for;
Итератором является процедура, последний параметр которой - процедура, принимающая параметры цикла (см. ниже).

Описания массивов:

var arrx: int[3];

var arr:=int[](1,2,3,4); //конструктор массива
var arr:=(1,2,3,4); //то же самое

var tuple: (int,String); //кортеж ("множественное значение") - обобщение понятия массив
tuple:=(1,"asdf");

(a,b):=(x,y); //множественное присваивание

var hashTable := HashTable{String,int}(("asdf",1),("qwerty",2),("zxcvb",125));

Зарезервированное значение null отсутствует. Вместо этого применяется библиотечный тип

final enum Null (null);

Если переменная должна иметь возможность принимать значение null, то её нужно описать как объединение типов:

var p: MyClass or Null:=null;

p:=MyClass(...);

with p
when MyClass do //если тип переменной - MyClass
...
when Null do //если тип переменной - Null (и значение, соответственно, null)
...
end with;

Пример класса с итератором:

class MyClass is
...
proc each(body: proc(key: int, value: int)) is
...
while ... do
...
body(k,v); //вызов тела цикла
...
end;
end each;
end myClass;
Вызов итератора:

for key, value: p.each do
...
end;

Есть зарезервированная операция-итератор ..:

for i: 1..10 do
...
end;

Зарезервированный тип byte имеет параметр - количество байт; он считается беззнаковым целым данной длины.

var b: byte{4}:=12345;
Только над байтовым типом допускаются битовые операции &, |, <<, >>, ^.

Перекрытие операций осуществляется методами класса с соответствующими именами:

opAdd, opSub, opMul, opDiv, opMod, opCat, opAnd, opOr, opXor, opNot, opCmp.

Приоритет операций:

** (возведение в степень), ~ (конкатенация)
*, /, % (остаток), << (битовый сдвиг влево), >>, & (битовое И), ^ (битовый XOR)
+, -, | (битовое ИЛИ)
=, <>, <, >, <=, >=, == (совпадение)
and, not
or

Можно совмещать двухместные операции с присваиванием:

+:=, -:=, *:= и т.д.

Уффф... может, что-то и забыл...

язык, программазм

Previous post Next post
Up