Добрый день!
Приветствую всех участников форума. Я программирую по-русски давно, с 2000-го года. Для этого сделал для себя предкомпилятор, который переписывает идентификаторы, записанные кириллицей, в транслит. Т.е. если в исходном файле написано: «Обработать_строку (переменная1, переменная2);», то в файле «.cpp» будет записано: «Obrabotat_stroku (peremennaya1, peremennaya2);». Настолько к этому привык, что англоязычные идентификаторы теперь не перевариваю. Хотя английский знаю гораздо лучше, чем в среднем по стране: в свое время натаскал в английском свою жену так, что она успешно сдала кандидатский минимум по иностранному языку, хотя в школе учила французский.
Преимущества программирования на русском очевидны: думаешь только над решаемой задачей, не отвлекаясь на перевод туда и обратно.
Хотел бы уточнить: есть ли спрос на программы, подобные той, которую я сделал? Если да – мог бы её довести до такого состояния, что её не стыдно предложить коллегам по цеху. В принципе, этот предкомпилятор должен работать и с Пакалем, и с другими языками, только надо доработать парсер.
В свой «русский С++» я внёс, помимо транслитерации, и другие усовершествования.
1. Идентификаторы могут содержать одиночные пробелы. Согласитесь, что идентификатор «длина строки» выглядит предпочтительнее, чем «длина_строки». Одиночный пробел при транслитерации заменяется на символ «_». Но за все удобства приходится расплачиваться, поэтому одиночный пробел после этого не может служить разделителем идентификаторов, для этого нужен либо последовательность пробелов длиной от 2-х символов и более, либо табуляция и прочие обычные для С++ разделители. Т.е. сложность заключается в следующем: «int и» при транслитерации заменяется на «int_i», а это не то, что хотят в таких случаях; надо теперь писать «int и» (с двумя пробелами), тогда будет корректно.
2. Идентификатором может служить вообще любая последовательность символов, обрамляемая таким образом: ``Пи * 2` или ``!@#$%^&*()_+` - предкомпилятор преобразует такие последовательности в приемлемый для компилятора вид.
Приведу примеры из написанных мною программ:
int получить число с плавающей точкой(char* откуда, char* куда)
{
int смещение в строке = 0;
int число цифр = 0;
// пропустить пробелы
for (; смещение в строке < 32; смещение в строке ++)
{ if (откуда [смещение в строке] != ' ')
break;
}
// скопировать все цифры
for (int i=0; смещение в строке < 32; смещение в строке ++, i++)
{ if ((откуда [смещение в строке] < '0' || откуда [смещение в строке] > '9') && откуда [смещение в строке] != '.')
{ куда [i] = 0;
break;
}
куда [i] = откуда [смещение в строке];
++ число цифр;
}
return число цифр;
};
Взялся недавно за PHP5, но меня печалила мысль, что не могу употреблять столь любимый мой русский язык. Начал думать, что надо бы доработать свою утилиту под синтаксис PHP… Но потом взял и попробовал вставить русские идентификаторы – решил поиздеваться над интерпретатором. Такая идиотская мысль могла прийти только мне. И что же? Работает!!! Имена переменных, имена функций – всё работает! В качестве доказательства привожу пример функций, реализующих «сумму прописью»:
//-------------------------------------------
// Перевод числа к виду 99-00 рубли-копейки
function Рубли_копейки($val)
{ return Рублей ($val) . " " . Копеек($val);
}
//-------------------------------------------
// Получая строку с целым числом и род (0-мужской, 1 - женский), функция возвращает
// строку с соответствующими числительными (от единиц до миллардов)
function Три_цифры_словами($входящее_значение, $женский_род=0)
{
if (strlen($входящее_значение) == 1)
$входящее_значение = "0" . $входящее_значение;
if (strlen($входящее_значение) == 2)
$входящее_значение = "0" . $входящее_значение;
$сотни = (int) substr ($входящее_значение, 0, 1);
$десятки = (int) substr ($входящее_значение, 1, 1);
$единицы = (int) substr ($входящее_значение, 2, 1);
static $Сотни_словами = array (1 => " сто", " двести", " триста", " четыреста", " пятьсот", " шестьсот", " семьсот", " восемьсот", " девятьсот");
static $Десятки_словами = array (2 => " двадцать", " тридцать", " сорок", " пятьдесят", " шестьдесят", " семьдесят", " восемьдесят", " девяносто");
static $Дцать_словами = array (10 => " десять", " одиннадцать", " двенадцать", " тринадцать", " четырнадцать",
" пятнадцать", " шестнадцать", " семнадцать", " восемнадцать", " девятнадцать");
static $Единицы_словами = array (0 => " ноль", " один", " два", " три", " четыре", " пять", " шесть", " семь", " восемь", " девять");
$строка = "";
if ($сотни >= 1)
$строка = $Сотни_словами [$сотни];
if ($десятки >= 2)
{ $строка = $строка . $Десятки_словами [$десятки];
if ($единицы > 0)
{ $строка_единиц = $Единицы_словами [$единицы];
if ($женский_род == 1)
{ if ($единицы == 1)
$строка_единиц = " одна";
if ($единицы == 2)
$строка_единиц = " две";
}
$строка = $строка . $строка_единиц;
}
}
else
{
if ($десятки == 1)
{ $десятки = 10 * $десятки + $единицы;
$строка = $строка . $Дцать_словами [$десятки];
}
elseif ($десятки == 0)
{
$строка_единиц = $Единицы_словами [$единицы];
if ($женский_род == 1)
{ if ($единицы == 1)
$строка_единиц = " одна";
if ($единицы == 2)
$строка_единиц = " две";
}
$строка = $строка . $строка_единиц;
}
}
return $строка;
}
//-------------------------------------------
// Получая плавающее число, функция возвращает массив, где
// [0] - целое число, равное целой часть исходного числа
// [1] - целое числое, 2 цифрам дробной части (с округлением)
function Целое_и_дробное($входящее_значение)
{
$входящее_значение = round ($входящее_значение, 2);
$целое = floor ($входящее_значение);
$входящее_значение = round (100 * ($входящее_значение - $целое));
$массив = array (0 => $целое, $входящее_значение);
return $массив;
}
//-------------------------------------------
// Получая плавающее число, функция возвращает строку, в которой
// дробную часть числа выдаёт словами и приписывает "копейки" в нужном падеже
function Копеек($входящее_значение)
{
$массив = Целое_и_дробное($входящее_значение);
$Drobnoe = $массив [1];
if ($Drobnoe < 10)
$tr = "0";
$tr = "$tr$Drobnoe";
if ($tr === "01")
$kop = "йка";
elseif ($tr === "02" || $tr === "03" || $tr === "04")
$kop = "йки";
else
$kop = "ек";
$kop = Три_цифры_словами($tr, 1) . " копе" . $kop;
return $kop;
}
//-------------------------------------------
// Получая плавающее число, функция возвращает строку, в которой
// целую часть числа выдаёт словами и приписывает "рубли" в нужном падеже
function Рублей($входящее_значение)
{
$массив = Целое_и_дробное($входящее_значение);
$целое = $массив [0];
$строка = (string) $целое;
$длина_строки = strlen ($строка);
$длина_части_строки = 3; // число цифр для единиц
if ($длина_строки <= 3)
$длина_части_строки = $длина_строки;
$часть_строки = substr($входящее_значение, $длина_строки-$длина_части_строки, $длина_части_строки);
$результат = Три_цифры_словами($часть_строки) . " рубл";
$последний_символ = substr($часть_строки,2,1);
if ($последний_символ == "1")
$результат = $результат . "ь";
elseif ($последний_символ == "2" || $последний_символ == "3" || $последний_символ == "4")
$результат = $результат . "я";
else
$результат = $результат . "ей";
$длина_строки -= $длина_части_строки;
if ($длина_строки > 0)
{
$длина_части_строки = 3; // число цифр для тысяч
if ($длина_строки <= 3)
$длина_части_строки = $длина_строки;
$часть_строки = substr($входящее_значение, $длина_строки-$длина_части_строки, $длина_части_строки);
if ((int) $часть_строки > 0)
{
$последний_символ = substr($часть_строки,strlen($часть_строки)-1,1);
if ($последний_символ == "1")
$результат = "а " . $результат;
elseif ($последний_символ == "2" || $последний_символ == "3" || $последний_символ == "4")
$результат = "и " . $результат;
else
$результат = " " . $результат;
$результат = Три_цифры_словами($часть_строки) . " тысяч" . $результат;
}
$длина_строки -= $длина_части_строки;
}
if ($длина_строки > 0)
{
$длина_части_строки = 3; // число цифр для миллионов
if ($длина_строки <= 3)
$длина_части_строки = $длина_строки;
$часть_строки = substr($входящее_значение, $длина_строки-$длина_части_строки, $длина_части_строки);
if ((int) $часть_строки > 0)
{
$последний_символ = substr($часть_строки,strlen($часть_строки)-1,1);
if ($последний_символ == "1")
$результат = " " . $результат;
elseif ($последний_символ == "2" || $последний_символ == "3" || $последний_символ == "4")
$результат = "а " . $результат;
else
$результат = "ов " . $результат;
$результат = Три_цифры_словами($часть_строки) . " миллион" . $результат;
}
$длина_строки -= $длина_части_строки;
}
if ($длина_строки > 0)
{
$длина_части_строки = 3;
if ($длина_строки <= 3)
$длина_части_строки = $длина_строки;
$часть_строки = substr($входящее_значение, $длина_строки-$длина_части_строки, $длина_части_строки);
if ((int) $часть_строки > 0)
{
$последний_символ = substr($часть_строки,strlen($часть_строки)-1,1);
if ($последний_символ == "1")
$результат = " " . $результат;
elseif ($последний_символ == "2" || $последний_символ == "3" || $последний_символ == "4")
$результат = "а " . $результат;
else
$результат = "ов " . $результат;
$результат = Три_цифры_словами($часть_строки) . " миллиард" . $результат;
}
$длина_строки -= $длина_части_строки;
}
$результат = ucfirst (trim ($результат));
return $результат;
}
//-------------------------------------------
Сколько открытий чудных!
Отредактировано Юрий (10-03-2009 17:21:48)