99 бутылок пива. Исполняют RW1 и Euphoria

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)
  {
  }
}



29. Euphoria. Очень интересный язык с возможностью оперирования списками, как базовыми типами. Например, их можно складывать, сравнивать и вообще производить любые операции, как над атомарными типами. Единственное, что для меня оказалось странным, это тот факт, что атомарные типы не являются частным случаем списков (последовательностей).

В общем не знаю чем, но язык мне понравился. :) Кстати, в языке, насколько я понимаю, есть разница между операция "запятая" (разделение элементов в списке) и "запятая с пробелом" (разделение аргументов функции). Свое предположение я не проверял (а описание читал очень бегло), но, если будете писать программы на этом языке, будьте осторожны с запятой.

Для этого языка существуют интерпретаторы под DOS, Windows и Linux, а так же транслятор в язык C. Описание языка распространяется вместе с интерпретатором.

Программа, выводящая песню о пиве (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.")



7 июля 2001 13:20

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML: