99 бутылок: Старсет
Семьдесят четвёртый выпуск считалочки «песни о пиве», которую я пишу на разных языках программирования, для разнообразия сделаю на языке родом из СССР. Как-то я мало такому уделяю внимания, а ведь это тоже история!
74. Старсет — язык программирования высокого уровня, разработанный в Институте программных систем РАН в 1991 году. К сожалению, мне не удалось обнаружить компиляторов или интерпретаторов этого языка, и даже упоминания, что они вообще когда-либо были реализованы.
Поэтому программировать пришлось исключительно по описанию языка, почерпнутого из книжки, купленной за двести рублей с рук в интернете.
Язык, кстати говоря, небезынтересный — в наличие имеется развитая работа со множествами и свой язык регулярных выражений («образцов»), который может применяться не только на скалярах, но и на множествах! Кроме того имеются операторы, позволяющие распараллеливать вычисления!
Помимо скаляров и множеств, язык поддерживает «классы» — насколько я понял, своеобразные вычисляемые «срезы» множеств по какому-либо условию (вроде того как это делается в numpy), но могу и ошибаться, книга написана очень сухим, академическим языком и иногда вообще не удаётся понять, что имеется ввиду.
Например, попробуйте разобраться в этом отрывке («каноническая запись», как утверждается выше процитированного — это когда отброшены все незначащие нули):
Каноническим числовым представлением нуля будем считать слово 0. В частности, каноническим числовым значением слова 1 является оно само, каноническим представлением слова 2 является слово −6, каноническим представлением слова 3 — слово 67000000000000000.
Я, сколько ни пытался, не смог уловить закономерность.
Программы по внешнему виду сильно напоминают «Паскаль» — совпадают некоторые конструкции и принципы, но, конечно же, есть и вещи, которые сильно отличаются.
Выполнение программы выполняется с первой процедуры и завершается с выходом из неё. Возврат значения из функции (тут она называется «процедура-функция») осуществляется через переменную, совпадающую с именем функции. Все переменные, включая переменную для возврата, должны быть задекларированы в специальном блоке. Скалярные переменные декларируются в секции word, множества — в set, классы — в секции class.
/* Считалочка про пиво на языке «Старсет». Написал Евгений Степанищев */
/* https://bolknote.ru */
Func Бутылки(колво)
Word: Бутылки, колво;
Choice
Case колво = 1 Do Бутылки := '1 bottle' End
Case колво = 0 Do Бутылки := 'no bottles' End
Otherwise Do Бутылки := колво^' bottles' End
Endfunc
Proc Песня()
Word: колво, бутылок;
колво := 99;
бутылок := Бутылки(колво);
While колво > 0 Do
Write бутылок^' of beer on the wall, '^бутылок^' of beer.';
колво := колво - 1;
бутылок := Бутылки(колво);
Write 'Take one down and pass it around, '^бутылок^' of beer on the wall.';
Write ''
End
Write 'No more bottles of beer on the wall, no more bottles of beer.';
Write 'Go to the store and buy some more, 99 bottles of beer on the wall.'
Endproc
Все строки заключаются в апострофы, которые в книге имеют непривычный вид (’), я не стал их тут использовать, вряд ли это какая-то особенность языка, скорее уж такой символ просто поставили при наборе.
Ещё необычно выглядит операция конкатенации — ^ и повторения строки — ^^. Из-за того, что в языке есть неявные преобразования, можно делать вот такое:
Write 'МА' ^^ '2 раза' /* Будет выведено «МАМА», так как «2 раза» преобразуется к двойке */
С удовольствием познакомился с языком, благо он не выглядит, как что-то, сделанное «в стол», для «галочки» или исключительно для обучения школьников или студентов.