99 бутылок: RW1, Euphoria
29. Euphoria. Очень интересный язык с возможностью оперирования списками, как базовыми типами. Например, их можно складывать, сравнивать и вообще производить любые операции, как над атомарными типами. Единственное, что для меня оказалось странным, это тот факт, что атомарные типы не являются частным случаем списков (последовательностей).
В общем не знаю чем, но язык мне понравился. :) Кстати, в языке, насколько я понимаю, есть разница между операция «запятая» (разделение элементов в списке) и «запятая с пробелом» (разделение аргументов функции). Свое предположение я не проверял (а описание читал очень бегло), но, если будете писать программы на этом языке, будьте осторожны с запятой.
Для этого языка существуют интерпретаторы под DOS, Windows и Linux, а так же транслятор в язык Си. Описание языка распространяется вместе с интерпретатором.
Программа, выводящая песню о пиве (beer.ex)
-- Written by Evgeny Stepanischev
integer beer
beer = 99
procedure PrintBeer (integer b)
if b then
printf (1, "%d", b)
else
puts (1, "No")
end if
puts (1, " bottle")
if b!=1 then puts (1, 's') end if
end procedure
while beer>0 do
PrintBeer(beer) puts (1, " of beer on the wall, ")
PrintBeer(beer) puts (1, " of beer.\n")
puts (1, "Take one down, pass it around.\n")
beer = beer - 1
PrintBeer(beer) puts (1, " of beer on the wall.\n\n")
end while
puts (1, "No more bottles of beer...\n")
puts (1, "Go to the store and buy some more...\n")
puts (1, "99 bottles of beer.")
28. RW1. Язык используется в основном для программирования виртуальных роботов, между которыми проводятся такие же виртуальные бои.
В языке есть возможность описания пользовательских функций, но я не смог ими воспользоваться из-за… отсутствия в языке символьных типов. Хорошо хоть оператор SAY понимает строки, причем с возможностью вывода значений переменных.
О самом интерпретаторе. Программы прекомпилируются в собственную систему байт-кодов, после чего исполняются интерпретатором. У прекомпилятора, который и выполняет проверку синтаксиса очень бедные возможности диагностики, так что мне приходилось подолгу ломать голову на тем, почему программа не работает. В частности из-за конструкции «var—», которая в языке существует, но не может быть применена, как самостоятельная конструкция.
И, наконец, что касается вечного цикла в конце. Программы на языке RW1 (по крайней мере, что касается описания роботов, представляет собой зацикленную программу и вечный цикл нужен для того, что бы программа не начала выполняться заново.
Скрипт, выводящий песню о пиве (beer.rw1)
% Written by Evgeny Stepanischev
ROBOT "Beer"
AUTHOR "Evgeny Stepanischev"
main()
{
beer=99
while(beer>0)
{
IF(beer>1) SAY "&BEER bottles of beer on the wall, &BEER bottles of beer."
ELSE SAY "&BEER bottle of beer on the wall, &BEER bottle of beer."
SAY "Take one down, pass it around."
beer = beer-1
IF(beer>1) SAY "&BEER bottles of beer on the wall."
ELSE
{
IF(beer) SAY "&BEER bottle of beer on the wall."
ELSE SAY "No bottles of beer on the wall."
}
SAY ""
}
SAY "No more bottles of beer..."
SAY "Go to the store and buy some more..."
SAY "99 bottles of beer."
WHILE(1)
{
}
}