99 бутылок: Refal-5, FOCAL
41. FOCAL. Название языка произошло от сокращения «Formula CALculator». В настоящее время язык, можно сказать, умер — в интернете мне с большим трудом удалось найти его описание. Ни одной действующей версии компилятора или интерпретатора языка мне найти не удалось.
Что интересно в языке — нумерация строк. Она двойная. Строки организуют группы с внутренней нумерацией, к которым (группам) можно обращаться при помощи различных конструкций. Другая интересная особенность — все операторы можно сокращать. Например, вполне можно писать COMMENT как C, а FOR — как F.
Как я сказал, компилятора или интерпретатора мне найти не удалось, так что пришлось писать программу по теории. В частности, по скудной литературе мне не удалось понять как должна работать функция FSBR (вызов группы строк как функции), поэтому пришлось определять функции другим путём.
Уже после выхода этой песни, со мной связался Алексей Томин и привёл описание функции FSBR. Вот, что он пишет: FSBR позволяет определить функцию с одним аргументом (с использованием & как параметра). Самое интересное — возможна рекурсия.
Пример, вычисление факториала:
11.1 I (&-1) 11.3,11.3,11.2
11.2 S &=&*FSBR(11,&-1)
11.3 R
Программа, выводящая песню о пиве (beer)
1.10 COMMENT Beer song. Written by Evgeny Stepanischev
1.20 FOR I=99, -1, 1; DO 2
1.30 TYPE "No more bottles of beer...", !
1.40 TYPE "Go to the store and buy some more...", !
1.50 TYPE "99 bottles of beer.", !
1.60 QUIT
2.10 SET B=1; DO 3; TYPE " on the wall, "; DO 3
2.20 TYPE !, "Take one and pass around,", !
2.30 SET B=2; DO 3; TYPE " on the wall.", !
3.10 DO 4.10; TYPE " of beer"; RETURN
4.10 IF (I-B) 4.20, 4.30, 4.40
4.20 TYPE "No bottles"; RETURN
4.30 TYPE "1 bottle"; RETURN
4.40 TYPE %4.00, I, "bottles"; RETURN
40. Refal. Литературы по этому языку достаточно, так что, если возникнет заинтересованность — поищите в интернете. Пожалуй, описывать я его не буду, лишь приведу небольшую выдержку из учебника.
«Рефал» — язык манипулирования символьными объектам: текстами, формулами, программами и т. п. Программа на «Рефале» состоит из функций, которые могут определяться друг через друга, т. е. рекурсивно. Отсюда и название: «Алгоритмический язык Рекурсивных Функций». Язык «Рефал» был создан В. Турчиным в качестве метаязыка для описания семантики других языков. Язык определения функций «Рефала», основанный на понятиях образца и результатного выражения, чрезвычайно прост и компактен. Образцы — […] в сжатой и наглядной форме обеспечивают как запись условий на вид аргумента, так и разбиение аргумента на составные части.
Программа, выводящая песню о пиве (beer.ref):
** Beer song. Written by Evgeny Stepanischev
Pr {
e1 = <PRINTLN! *STDOUT e1>;
};
S {
1 = ;
e1 = 's';
};
Beer {
0 = 'No bottles of beer';
e1, <S e1>: e2 = e1 ' bottle' e2 ' of beer';
};
Beers
{
e1 (e2), <Beer e1>: e.beer =
<Pr e.beer ' on the wall, ' e.beer '.'>
<Pr 'Take one and pass around,'>
<Pr <Beer e2> ' on the wall.'>
<Pr>;
};
Start
{
0 = <Pr 'No more bottles of beer...'>
<Pr 'Go to the store and buy some more...'>
<Pr '99 bottles of beer.'>;
e1, <- e1 1>: e2 = <Beers e1 (e2)> <Start e2>;
};
$EXEC Start 99;