99 бутылок: базовый SIMPLE, Bascom-8051
30. Базовый SIMPLE. Необычный язык с интересными синтаксическими конструкциями, поддержкой списков (как в LISP), кортежей, функций с произвольным количеством параметров, псевдоассемблера, предпроцессора и фреймовых структур. Это язык со строгой типизацией и чувствительный к регистру.
Компиляция происходит
Скрипт, выводящий песню о пиве (beer.smp)
// Written by Evgeny Stepanischev
define beer(n) {
cond {
n>0 do princ(n);
n<1 do princ("No");
};
princ(" bottle");
if (n<>1) {princ("s");};
princ(" of beer");
};
define main() {
declare b=99;
lcond {
b=0 do {
print("No more bottles of beer...");
print("Go to the store and buy some more...");
print("99 bottles of beer.");
};
do {
beer(b); princ(" on the wall, ");
beer(b); print(".");
print("Take one down, pass it around.");
b:=b-1;
beer(b); print(" on the wall.");
print("");
};
};
};31.
Расшифровывается BASCOM, как «BASic COMpilator». По моему мнению, он если и похож на Бейсик, то весьма отдаленно. Язык имеет ряд тонких особенностей, с которыми мне пришлось столкнуться при написании даже такой простой программы: оператор for с ключевым словом downto не требует указания отрицательного step, переменная «B» зарезервирована, процедуры надо сначала объявлять, потом только использовать, процедуры являются входимыми (возврат осуществляется по стеку) и программу перед их телом надо останавливать, аргументы функций ассоциируются с переданной переменной по имени, т. е. передав значение процедуре printbeer я присвою значение переменной beer. И т. д. и тому подобное.
Не говоря уж о том, что строку перед конкатенацией с самой собой надо сохранять, а передача параметров
Под Windows существует эмулирующий компилятор со средой разработки, поддерживающий пошаговое исполнение, точки останова и вывод отладочной информации. Я пользовался
Программа, выводящая песню о пиве (beer.bas)
' Written by Evgeny Stepanischev
Dim Beer As Byte , Res As String * 10
Declare Sub Printbeer(beer As Byte)
Beer = 2
While Beer > 0
Call Printbeer(beer)
Print Res ; " on the wall, " ; Res ; "."
Print "Take one down, pass it around."
Decr Beer
Call Printbeer(beer)
Print Res ; " on the wall."
Print
Wend
Print "No more bottles of beer..."
Print "Go to the store and buy some more..."
Print "99 bottles of beer."
End
Sub Printbeer(beer As Byte)
Dim Tmp As String * 10
If Beer = 0 Then Res = "No" Else Res = Str(beer)
Tmp = Res + " bottle" : Res = Tmp
If Beer <> 1 Then Res = Tmp + "s"
Tmp = Res : Res = Tmp + " of beer"
End Sub