99 бутылок: «Паркетчик», Pocket Basic
35. Pocket Basic 1.00 для Casio PV. Несмотря на то, что его автор, Petr Vlcek называет этот язык Бейсиком, Бейсиком он не является. Достаточно хотя бы взглянуть на синтаксис, если это для кого-то не аргумент, то скажу, что каждый элемент строки является число от -128 до 127, над которыми можно производить обычные арифметические действия, например вот так:
ASSIGN text<a+1>=text<a+1>+2
Для того, чтобы работать со элементами строки, как с символьными значениями, применяется модификатор точка («.»).
Язык довольно минималистский (например, из операторов ввода присутствует только TOUCH, позволяющий узнать в каком месте экрана было произведено касание, в функцию нельзя передать параметр и так далее), а потому малораспространенный. Несмотря на это язык мне понравился, своей простотой и, если так можно выразиться, средой разработки.
В отличие от OWBasic, где для редактирования программ используется встроенное в ОС приложение Memo, Pocket Basic предоставляет собственную среду для создания программ. Реализация имеет массу недостатков, в частности, встроенная клавиатура не содержит национальных символов, нет возможности переименования файлов и так далее, но есть и достоинства. Большим достоинством среды Pocket Basic является возможность набора операторов за один клик.
Каждый оператор языка начинаются с уникальной буквы, так что если редактор ждет ввода оператора, при нажатии на нужную букву оператор вводится целиком. Такой подход потребовал от создателя языка некоторых жертв, например блочный оператор IF выглядит довольно неожиданно, его полная конструкция выглядит, как IF — ELSE — CONTINUE. Другим достоинством среды является возможность использования колеса PV для передвижения по тексту.
Теперь, что касается программы, которая получилась в конечном счете. Поскольку документация весьма скудная, да еще и на немецком я не смог узнать если ли в языке условие «неравно». Испробовав все возможные варианты, я пришел к выводу, что нету. В конце цикла я использую очистку экрана перед выводом следующей фразы, у Pocket Basic’a есть серьезные проблемы со скроллингом, так что, чтобы избежать мусора на экране мне пришлось просто очищать экран. Как видно у программы отсутствует форматирование отступом, причина — среда разработки не позволяет производить такое форматирование.
Программа, выводящая песню о пиве (Beer)
! Beer song. Written by Evgeny Stepanischev
PROC beer
IF b=0
WRITE "No"
ELSE
WRITE b
CONTINUE
!
WRITE " bottle"
IF b=1
ELSE
WRITE "s"
CONTINUE
!
WRITE " of beer"
RETURN
!
!
VAR INT b
ASSIGN b=99
!
FOR b>0
USE beer
WRITE " on the wall, "
USE beer
WRITE "."l
WRITE "Take one down and pass around."l
ASSIGN b=b-1
USE beer
WRITE "."
SLEEP 4
BOX
ASSIGN posy=0
ASSIGN posx=0
NEXT
!
WRITE "No more bottles of beer..."l
WRITE "Go to the store and buy some more..."l
WRITE "99 bottles of beer."
SLEEP 20
34. Паркетчик. Весьма забавный язык, предназначенный для обучения детей программированию. Очень напоминает переведенный Паскаль, если не считать сишных блочных конструкций. Если бы у меня были дети я бы для их обучения, на первых порах, возможно, выбрал бы этот язык.
Кроме основых конструкций ветвления, циклов и поддержки подпрограмм, язык предоставляет средства управления «Паркетчиком» — неким средством рисования цветных квадратов на ограниченом поле. В программе я специально разбил содержимое цикла на две фазы, чтобы показать, как «Паркетчика» можно использовать, например, для контроля за четностью.
Из недостатков.
Язык, конечно, не предназначен для серьезного программирования, но это не оправдание для того, чтобы не делать поддержку строк и чисел с плавающей точкой.
Насколько я понял из файлов примеров, в программе нет циклов с произвольным шагом, приходится для этого использовать циклы «пока».
Кроме того, в бесконечном цикле «Паркетчик» умудрился намертво завесить мою Windows XP. Никакой возможности прервать программу я не нашел, компьютер ни на что не реагировал.
Скрипт, выводящий песню о пиве (beer.prg)
цел пиво;
Программа {
пиво:=198;
Делать пока (пиво>0) {
если (слева стена) то {
если (пиво=2) то {
Сообщить "1 bottle of beer on the wall, 1 bottle of beer."
} иначе
{
Сообщить пиво/2, " bottles of beer on the wall, ",
пиво/2, " bottles of beer."
};
Сообщить "Take one down, pass it around."
Шаг вправо;
} иначе
{
если (пиво=2) то {
Сообщить "1 bottle of beer on the wall."
} иначе {
если (пиво>1) то {
Сообщить пиво/2, " bottles of beer on the wall."
} иначе {
Сообщить "No bottles of beer on the wall.";
};
};
Шаг влево;
};
пиво:=пиво-1;
};
Сообщить "No more bottles of beer...";
Сообщить "Go to the store and buy some more...";
Сообщить "99 bottles of beer.";
}