99
У американцев есть такая считалочка — «песня о пиве», наверняка её многие слышали в американских фильмах. У меня есть хобби — делать вывод этой считалочки на разных языках программирования. Со временем набралась приличная коллекция.
99 бутылок: AppleScript, Applesoft BASIC
У меня тут мой ноут поперхнулся чаем, так что я неделю был на стареньком компике под Виндой, почувствовал себя себя как без рук. По этой же причине почти не писал ничего в блог, лишь одним вечером на ноуте жены написал очередные две «Песни про пиво» на языках AppleScript и Applesoft BASIC. Первый — современный язык для автоматизации мелочи на «Маках», второй — древний (1977 год) бейсик,
52. AppleScript — встроенный в операционную систему «МакОС» язык программирования, используемый для мелкой автоматизации. По программе этой не очень очевидно, но язык максимально приближен к английскому, причём многие вещи можно формировать разнообразными способами — так же, как бы это сделал носитель английского языка.
В остальном, это обычный динамический интерпретируемый язык со слабой типизацией. Как видно в одном месте мне пришлось сделать преобразование типа.
(* Песня про пиво. Автор — Евгений Степанищев *)
repeat with beer from 99 to 1 by -1
set b to bottles(beer)
log b & " on the wall, " & b & "."
log "Take one down and pass it around, " & bottles(beer - 1) & " of beer on the wall."
log
end repeat
log "No more bottles of beer on the wall, no more bottles of beer."
log "Go to the store and buy some more, 99 bottles of beer on the wall."
on bottles(beer)
if beer = 0 then
return "no bottles"
else if beer > 1 then
return (beer as string) & " bottles"
else
return "1 bottle"
end if
end bottle51. Applesoft BASIC — Бейсик разработанный компанией Майкрософт, использовавшийся в компьютерах фирмы Эпл, начиная с 1977 года. Ничего особо примечательного, вполне полнофункциональный язык, хоть и не без недостатков тех ранних «бейсиков» — вызов функций по номеру строки, параметров нет, локальных переменных нет, в общем, все прелести.
Я специально использовал конструкцию «ON…GOTO», хоть в ней и не было необходимости — хотел показать аналог конструкции switch. SGN тут — встроенная функция нахождения знака выражения.
000 REM Песня про пиво, автор — Евгений Степанищев
001 HOME: TEXT
010 FOR beer = 99 TO 1 STEP -1
020 b = beer: GOSUB 100
030 ? bottles$; " on the wall, "; bottles$; "."
035 b = beer - 1: GOSUB 100
040 ? "Take one down and pass it around, "; bottles$; " of beer on the wall."
050 ?
060 NEXT
070 ? "No more bottles of beer on the wall, no more bottles of beer."
080 ? "Go to the store and buy some more, 99 bottles of beer on the wall."
090 END
099 REM
100 ON SGN(b-1)+2 GOTO 120, 130, 110
110 LET bottles$ = STR$(b) + " bottles": RETURN
120 LET bottles$ = "no bottles": RETURN
130 LET bottles$ = "1 bottle": RETURN99 бутылок: Batsh, VIM script
Потихоньку возобновил наполнение раздела «99 бутылок пива на стене» — тут я пишу американскую считалочку про пиво на различных языках программирования. Добавились языки VIM script и Batsh. Первый используется в консольном редакторе vim для написания внутренних скриптов, второй — для кроссплатформенного написания
Batsh мне вообще понравился своей идеей — простой
50. Batsh — чрезвычайно лёгкий в освоении язык
// Песня о пиве на языке Batsh Степанищева Евгения
function bottles(bottle){
if (bottle == 0) {
return "no bottles";
}
if (bottle == 1) {
return "1 bottle";
}
return bottle ++ " bottles";
}
i = 99;
while (i > 0) {
b = bottles(i) ++ " of beer";
println(b, "on the wall,", b ++ ".");
i = i - 1;
println("Take one down and pass it around,", bottles(i), "of beer on the wall.\n");
};
println("No more bottles of beer on the wall, no more bottles of beer.");
println("Go to the store and buy some more, 99 bottles of beer on the wall.");49. VIM Script — встроенный скриптовый язык программирования консольного редактора VIM. Синтаксис довольно обычен, учится легко. Мощный для своего класса — обилие встроенных функций, довольно согласованный синтаксис, различные типы массивов. Есть интересные особенности, например, возможность явного переопределения функций, префиксы переменных для явного определения зоны видимости (например, префикс «a:» у меня в функции — это аргументы) или функции, которые могут принимать
" написал Евгений Степанищев bolknote.ru"
:function Bottles(bottle)
: return get(["no bottles", "1 bottle"], a:bottle, a:bottle . " bottles")
:endfunction
:for beer in range(99, 1, -1)
: let b = Bottles(beer) . " of beer"
: echo b "on the wall," b . "."
: echo "Take one down and pass it around, " . Bottles(beer-1) . " of beer on the wall.\n"
:endfor
:echo "No more bottles of beer on the wall, no more bottles of beer."
:echo "Go to the store and buy some more, 99 bottles of beer on the wall."99 бутылок: Go
48. Go — язык программирования, придуманный в «Гугле». Я на нём программирую, время от времени, и довольно неплохо его уже знаю. Замечательный, на мой взгляд, язык. Этакий «Си с человеческим лицом». Особенно интересно добавлено туда ООП, да и параллельные вычисления сделаны хорошо. Единственно — не нравится реализация обработки ошибок через panic/defer.
Язык статический, строгой типизации, компилируемый. Кстати, одна из особенностей языка — исключительно быстрая компиляция.
Некоторые ребята считают, что он похож на «Паскаль». Думаю это
package main
import "strconv"
func main() {
for i := 99; i>0; i-- {
b := bottles(i) + " of beer"
println(b + " on the wall, " + b + ".")
println("Take one down and pass it around, " + bottles(i-1) + " of beer on the wall.\n")
}
println("No more bottles of beer on the wall, no more bottles of beer.")
println("Go to the store and buy some more, 99 bottles of beer on the wall.")
}
func bottles(beer int) string {
switch (beer) {
case 0:
return "no bottles"
case 1:
return "1 bottle"
}
return strconv.Itoa(beer) + " bottles"
}99 бутылок: КуМир
47. КуМир — очередной неинтересный язык программирования «Комплект учебных Миров или Миры Кушниренко».
В 1995 году «КуМир» (о ужас!) был рекомендован Министерством образования РФ в качестве основного учебного материала по курсу «Основы информатики и вычислительной техники» на основе учебника А. Г. Кушниренко, Г. В. Лебедева и Р. А. Свореня.
Совершенно неинтересно про него рассказывать, если честно, хотя среда разработки очень неплоха в плане диагностики ошибок.
Добавлено позднее: Язык оказался диалектом или реализацией уже известного мне языка «РАЯ».
| написал Евгений Степанищев bolknote.ru
алг песня про пиво
нач
цел пиво
нц для пиво от 99 до 1 шаг -1
вывод сколько пива(пиво), ' on the wall, ', нс
вывод 'Take one and pass around,', нс
вывод сколько пива(пиво-1), ' on the wall.', нс, нс
кц
вывод "No more bottles of beer...", нс
вывод "Go to the store and buy some more...", нс
вывод "99 bottles of beer."
кон
алг лит сколько пива(цел пиво)
нач
если пиво = 0 то
знач:="No"
иначе
знач:=цел_в_лит(пиво)
все
знач:=знач + ' bottle'
если пиво <> 1 то
знач:=знач+'s'
все
кон99 бутылок: gnuplot
46. gnuplot — программа для построение графиков, имеющая довольно развитый язык программирования. Основная особенность — отсутствие циклов, хотя доступна их эмуляция — через команду перезагрузки файла (reread).
Программа, выводящая песню о пиве (beer.gp)
# Написал Евгений Степанищев
bottles(beer) = beer == 1 ? '1 bottle' : beer ? sprintf('%d bottles', beer) : 'no bottles'
if (!exists("beer")) beer=99
print bottles(beer), " of beer on the wall, ", bottles(beer)," of beer\n",\
"Take one and pass it around,"
beer=beer-1
print bottles(beer)," of beer on the wall.\n"
if (beer>0) reread
print "No more bottles of beer on the wall, no more bottles of beer.\n", \
"Go to the store and buy some more, 99 bottles of beer on the wall."99 бутылок: PowerShell
45. Windows Powershell.
Язык просто изучается, имеет понятную структуру и широкие возможности. Я посмотрел первую версию языка, но уже доступна вторая версия оболочки.
Программа, выводящая песню о пиве (beer.ps1)
# Написал Евгений Степанищев aka BOLK
function bottles([int]$beer) {
switch ($beer) {
0 { "no bottles" }
1 { "1 bottle" }
default { "$beer bottles" }
}
}
99..1 | ForEach-Object {
$bottles = (bottles $_) + ' of beer'
$bottles + ' on the wall, ' + $bottles + '.'
'Take one down and pass it around, ' + (bottles($_-1)) + " of beer on the wall.`n"
}
'No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.'99 бутылок: РАЯ, MS HTML
44. РАЯ (русский алгоримический язык). Язык, придуманный академиком Ершовым для обучения детей программированию. Все названия на русском языке, что, впрочем, совершенно не отвлекает. Для написания программы я использовал падучую реализацию языка с сайта «Инфомир».
Особо о языке сказать нечего, разве что понравились многословные имена переменных, процедур и функций (можно записывать через пробелы), показалось интересным наличие исполнителей (вроде известной «черепашки») и не понравилось отсутствие конкатенации строк и операции «неравно» (в документации я этого не нашёл).
| Написал Евгений Степанищев aka BOLK
алг
нач
цел сколько пива
нц для сколько пива от 99 до 1 шаг -1
выводим пиво(сколько пива, " on the wall, ")
выводим пиво(сколько пива, ".")
вывод нс, "Take one and pass it around,", нс
выводим пиво(сколько пива, " on the wall.")
вывод нс, нс
кц
вывод "No more bottles of beer:", нс
вывод "Go to the store and buy some more:", нс
вывод "99 bottles of beer."
кон
алг выводим пиво(цел пива, лит окончание)
нач
вывод число пива(пива), " bottle"
если пива > 1 или пива=0
то вывод "s"
все
вывод окончание
кон
алг лит число пива(цел пива)
нач
если пива=0
то знач:="No"
иначе знач:=цел_в_лит(пива)
все
кон43. MS HTML. Конечно, HTML не является языком программирования. Но и на этом языке разметки, применяя особенности Internet Explorer, можно написать песню про пиво. Лишнюю строку пришлось «спрятать» за экран. Работает, естественно, только в Internet Explorer.
<!-- Written by Evgeny "BOLK" Stepanischev -->
<style type="text/css">
.outer { position: absolute; top: -20px }
body { background: white; margin: 0; padding: 10px }
body, table { font-size: 11px; font-family: Tahoma }
table, td, tr { margin: 0; padding: 0; border-collapse: collapse }
</style>
<body>
<xml id="dataOuter">
<row>
<d><o>9</o></d>
<d><o>8</o></d>
<d><o>7</o></d>
<d><o>6</o></d>
<d><o>5</o></d>
<d><o>4</o></d>
<d><o>3</o></d>
<d><o>2</o></d>
<d><o>1</o></d>
</row>
</xml>
<xml id="dataInner">
<row>
<d><i>9</i></d>
<d><i>8</i></d>
<d><i>7</i></d>
<d><i>6</i></d>
<d><i>5</i></d>
<d><i>4</i></d>
<d><i>3</i></d>
<d><i>2</i></d>
<d><i>1</i></d>
<d><i>0</i></d>
</row>
</xml>
<xml id="dataInnerSingle">
<row>
<d><i>9</i><s>s</s></d>
<d><i>8</i><s>s</s></d>
<d><i>7</i><s>s</s></d>
<d><i>6</i><s>s</s></d>
<d><i>5</i><s>s</s></d>
<d><i>4</i><s>s</s></d>
<d><i>3</i><s>s</s></d>
<d><i>2</i><s>s</s></d>
<d><i>1</i></d>
</row>
</xml>
<div class="outer">
<table datasrc="#dataOuter">
<tr>
<td>
<table datasrc="#dataInner">
<tr>
<td>
<span datafld="o"></span><span datafld="i"></span> beer bottles
of beer on the wall.<br /><br />
<span datafld="o"></span><span datafld="i"></span> beer bottles
of beer on the wall,
<span datafld="o"></span><span datafld="i"></span> bottles of beer.<br />
Take one and pass it around,<br />
</td>
</tr>
</table>
</td>
</tr>
</table>
<table datasrc="#dataInnerSingle">
<tr>
<td>
<span datafld="i"></span> beer
bottle<span datafld="s"></span> of beer on the wall.<br /><br />
<span datafld="i"></span> beer
bottle<span datafld="s"></span> of beer on the wall,
<span datafld="i"></span> bottle<span datafld="s"></span>
of beer.<br />
Take one and pass it around,<br />
</td>
</tr>
</table>
No beer bottle of beer on the wall.<br />
<br />
No more bottles of beer...<br />
Go to the store and buy some more...<br />
99 bottles of beer.
</div>
</body>
99 бутылок: Refal-5, FOCAL
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;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"; RETURN99 бутылок: XSLT и TBC
38. XSLT. Язык преобразований одного XML-документа в другой, основанный на XML же. Написано о нём достаточно много, так что останавливаться на нём не буду. Это, в отличие от большинства языков, на которых я программировал — декларативный язык. Строго говоря, XSLT мёртв без другого языка — XPath, языка выборки. С его помощью, например, выполняются все вычисления. В парсерах первых версий нет циклов, что кажется несколько странным, так что мне пришлось использовать рекурсию. Кстати, наиболее странное в XSLT другое — однажды объявленная переменная больше не может менять своего значения. Это ограничение обходят при помощи рекурсии и использования локальных переменных.
Запустить скрипт на выполнение можно, сохранив листинг в файл beer.xml и открыв его браузером Internet Explorer.
Программа, выводящая песню о пиве (beer.xml)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="#beer"?>
<!-- Beer song. Written by Evgeny Stepanischev -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
id="beer">
<xsl:output method="html"/>
<xsl:strip-space elements="*"/>
<xsl:template name="beer">
<xsl:param name="n"/>
<xsl:choose>
<xsl:when test="boolean($n)">
<xsl:value-of select="$n"/>
</xsl:when>
<xsl:otherwise>
No
</xsl:otherwise>
</xsl:choose>
<xsl:text> bottle</xsl:text>
<xsl:if test="boolean($n - 1)">
<xsl:text>s</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="while" match="/">
<xsl:param name="i" select="99"/>
<xsl:choose>
<xsl:when test="$i != 0">
<xsl:variable name="str">
<xsl:call-template name="beer">
<xsl:with-param name="n" select="$i"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$str"/>
<xsl:text> on the wall, </xsl:text>
<xsl:value-of select="$str"/>
<xsl:text> of beer.</xsl:text><br />
<xsl:text>Take one and pass around,</xsl:text><br />
<xsl:call-template name="beer">
<xsl:with-param name="n" select="$i - 1"/>
</xsl:call-template>
<xsl:text> on the wall.</xsl:text><br /><br />
<xsl:call-template name="while">
<xsl:with-param name="i" select="$i - 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
No more bottles of beer...<br />
Go to the store and buy some more...<br />
99 bottles of beer.
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>39. TBC (Tokiwa BASIC Compiler). Эта бесплатная версия компилятора является урезанной версией коммерческого компилятора
Компилятор умеет компилировать код в COM и DOS EXE-файлы и интересен тем, что имеет интеграцию со встроенным ассемблером и довольно развитый интересный синтаксис, основанный на языке BASIC. Например, присутствует оператор DefInt, который сообщает компилятору, что переменные, начинающиеся с заданных оператором букв, имеют целочисленный тип.
Есть блочные конструкции, операторы обработки ошибок, выбора альтернативы (on … goto …), поддержка строк и меток, в связи с чем поддерживаются как обычные процедуры и функции, так и переходы по номерам строк. Предусмотрены операторы
Кстати, что неприятно удивило — возвращаемым значением для процедур и функций (кстати, можно сказать, что процедуры и функции тут различаются только ключевыми словами) может быть только числовое значение.
Программа, выводящая песню о пиве (beer.tkw)
* Beer song. Written by Evgeny Stepanischev
Integer I
Character S
For I=99 To 1 Step -1
Call Beer(I)
Print S; " on the wall, ";S;"."
Print "Take one and pass around,"
Call Beer(I-1)
Print S; " on the wall." : Print
Next I
Print "No more bottles of beer..."
Print "Go to the store and buy some more..."
Print "99 bottles of beer."
SubRoutine Beer(I)
Integer I
If I=0 Then S="No" Else S=Str$(%1I I)
S=S+" bottle"
If I<>1 Then S=S+"s"
S=S+" of beer"
Return
SubEnd
End99 бутылок: NSIS, Photoshop JavaScript
Сериал «99 бутылок пива» продолжается. Сегодня — 36
36. Nullsoft (SuperPiMP|Scriptable) Install System. NSIS — настраиваемый инсталлятор от компании «Nullsoft», позволяющий создать пакет для инсталляции и деинсталляции вашего собственного продукта. Выходной файл представляет собой обычную программу. Для сжатия данных NSIS может использовать алгоритмы Zip и Bzip2, так что весь код получается довольно компактным.
Весь процесс установки и удаления продукта описывается на собственном языке программирования, где есть опции управления внешним видом инсталлятора, команды использования внешних плагинов, поддержки нескольких языков, команды предпроцессора и собственно язык с поддержкой функций, секций, ветвления, файлового
Я использовал версию 2.0b2. Язык инсталлятора крайне простой, поэтому не поддерживает локальных переменных и параметров у пользовательских функций — вместо них приходится использовать глобальные пользовательские переменные (их 20 штук) или стек. Кстати, и параметры плагинам передаются именно через стек.
Все имена переменных начинаются с доллара, программист для своих собственных целей может использовать лишь двадцать переменных — $0..$9, $R0..$R9, переменные не типизированы, в строках выполняется интерполяция, в качестве ограничителей строк подходят любые кавычки. Ветвление выполняется командами сравнения, которые в качестве аргумента принимают три ссылки, по одной из которых происходит переход в зависимости от результата сравнения.
Операции с числами так же выглядят несколько неожиданно. Вообще, даже прочитав полностью документацию, без примеров достаточно просто оставить без внимания некоторые возможности, которые становятся очевидными при просмотре примеров. Так что будете писать инсталлятор для своего продукта — загляните ещё и в примеры.
В любом случае, NSIS — достаточно надежный продукт, появился он не один год назад и используется, например, для инсталляции достаточно известного проигрывателя WinAMP.
Программа, выводящая песню о пиве (beer.nsi)
; Beer song. Written by Evgeny Stepanischev
Name "Beer song"
Caption "Beer song"
OutFile "beer99.exe"
BrandingText "Beer song (Evgeny Stepanischev)"
ShowInstDetails show
!macro c
StrCpy $2 ""
Call PrintBeer
!macroend
Function PrintBeer
IntCmp $1 0 no "" ""
StrCpy $2 "$2$1"
Goto +2
no:
StrCpy $2 "$2No"
StrCpy $2 "$2 bottle"
IntCmp $1 1 nos "" ""
StrCpy $2 "$2s"
nos:
StrCpy $2 "$2 of beer"
FunctionEnd
Section ""
StrCpy $1 99
loop:
!insertmacro c
StrCpy $2 "$2 on the wall, "
Call PrintBeer
DetailPrint "$2."
DetailPrint "Take one and pass around,"
IntOp $1 $1 - 1
!insertmacro c
DetailPrint "$2 on the wall."
DetailPrint ""
IntCmp $1 0 "" loop loop
DetailPrint "No more bottles of beer..."
DetailPrint "Go to the store and buy some more..."
DetailPrint "99 bottles of beer."
SectionEnd37. JavaScript for Adobe Photoshop (Photoshop 7.0 Scripting
Описывать JavaScript не интересно — базовые конструкции стандартные, добавлены лишь специфические объекты для управления всем тем, что есть в Photoshop, соответственно и объектная модель отличается от той, что принята, например, в браузерах.
Одним словом — полное управление всем, до чего можно дотянуться в бесконечных меню и опциях Adobe Photoshop (включая фильтры), из скриптового языка. Грандиозные возможности для дизайнеров, пробующих себя в программировании, или программистов, пытающихся заняться дизайном. :)
Программа, выводящая песню о пиве (beer.js)
preferences.rulerUnits = Units.POINTS
preferences.typeUnits = TypeUnits.POINTS
var docRef = documents.add(640, 480)
displayDialogs = DialogModes.NO
var textColor = new SolidColor
textColor.rgb.red = textColor.rgb.green = textColor.rgb.blue = 0
var TextLayer = docRef.artLayers.add()
TextLayer.kind = LayerKind.TEXT;
TextLayer.textItem.font = "Tahoma"
TextLayer.textItem.position = Array(10, 10)
TextLayer.textItem.size = 12
TextLayer.textItem.color = textColor
var content = ''
function WriteLn(str)
{
content += '\r'+str
}
function PrintBeer(n)
{
return (n ? n : 'No') + ' bottle' + (n-1 ? 's' : '') + ' of beer'
}
for (i = 99; i>0;)
{
WriteLn (PrintBeer(i) + ' on the wall, '+PrintBeer(i)+'.')
WriteLn ('Take one and pass around,')
WriteLn (PrintBeer(--i) + ' on the wall.')
WriteLn ('')
}
WriteLn ('No more bottles of beer...')
WriteLn ('Go to the store and buy some more...')
WriteLn ('99 bottles of beer.')
TextLayer.textItem.contents = content
docRef = textColor = TextLayer = null99 бутылок: «Паркетчик», Pocket Basic
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.";
}35. Pocket Basic 1.00 для Casio PV. Несмотря на то, что его автор, Petr Vlcek называет этот язык Бейсиком, Бейсиком он не является. Достаточно хотя бы взглянуть на синтаксис, если это
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
99 бутылок: Parrot, OW-BASIC
32. Parrot. Очень молодой, его первый компилятор
Язык по базовым конструкциям беднее ассемблера — нет ни одной конструкции цикла, все они заменяются условными переходами, ограниченное количество переменных (по 32 на каждый тип переменной), зато есть поддержка функций (параметры передаются через стек), операций с файлами, операторов
Скрипт, выводящий песню о пиве (beer.pasm)
# Beer song. Written by Evgeny Stepanischev
set I1, 99
branch MAIN
beer: if I1, _NZERO
print "No"
branch _I1_EL
_NZERO: print I1
_I1_EL: print " bottle"
eq I1, 1, _NO_S
print "s"
_NO_S: ret
MAIN: bsr beer
print " of beer on the wall, "
bsr beer
print " of beer."
print "\nTake one and pass around,\n"
dec I1
bsr beer
print " on the wall.\n\n"
if I1, MAIN
print "No more bottles of beer...\n"
print "Go to the store and buy some more...\n"
print "99 bottles of beer.\n"
end33.
Конечно, в силу специфики железа, на котором этот интерпретатор работает есть и весьма специфические для этой платформы функции, например, проверка касания экрана, вывод встроенной графики и тому подобное. К сожалению, в интерпретаторе есть ряд весьма досадных багов, например, сбой при выходе за край экрана и местами довольно бедная диагностика ошибок.
Программа, выводящая песню о пиве (! beer)
! beer
! Beer song. Written by Evgeny Stepanischev
PROC beer i, VAR s$
IF i>0 THEN
s = STRING(i)
ELSE
s = "No"
ENDIF
s = s+" bottle"
IF i<>1 THEN
s = s+"s"
ENDIF
s = s+" of beer"
ENDP
FOR i=0 TO 98
beer 99-i, s$
? s;" on the wall, ";s;"."
? "Take one and pass around,"
beer 98-i, s
? s;" on the wall.":? ""
NEXT
? "": ? "No more bottles of beer..."
? "Go to the store and buy some more..."
? "99 bottles of beer."
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 Sub99 бутылок: RW1, Euphoria
28. RW1. Язык используется в основном для программирования виртуальных роботов, между которыми проводятся такие же виртуальные бои.
В языке есть возможность описания пользовательских функций, но я не смог ими воспользоваться
О самом интерпретаторе. Программы прекомпилируются в собственную систему
И, наконец, что касается вечного цикла в конце. Программы на языке 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, а так же транслятор в язык Си. Описание языка распространяется вместе с интерпретатором.
Программа, выводящая песню о пиве (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.")99 бутылок: RBASIC, MACS
26. RBASIC. Язык RBASIC предназначен для того, что бы предоставить пользователю возможность быстро создавать свои программы для решения задач по ведению радиомониторинга с помощью широкодиапазонных компьютерных сканирующих приемников фирмы Winradio Communications.
Основа языка — BASIC к которому добавлены некоторые конструкции и специальные функции для управления приемниками, такие например, как управления шумоподавителем, громкостью, модуляцией и т. п.
Скрипт, выводящий песню о пиве (beer.rbp)
# Beer song. Written by Evgeny Stepanischev
LET b=99
LET s$=""
FOR i=99 TO 1 STEP -1
GOSUB @beer
PRINT s$+" on the wall, "+s$+" of beer."
PRINT "Take one and pass around,"
b = b-1
GOSUB @beer
PRINT s$+" on the wall."
PRINT ""
NEXT i
PRINT "No more bottles of beer..."
PRINT "Go to the store and buy some more..."
PRINT "99 bottles of beer."
END
@beer
LET s$=""
IF b>0 THEN s$ = s$ + str$ (i) ELSE s$ = s$ + "No"
s$ = s$ + " bottle":IF b<>1 THEN s$ = s$+"s"
RETURN27. MACS (MACrotestSoftware). Язык управления стендом и описания технологического процесса ремонта электронных плат. Для этой цели в языке есть весьма специфические конструкции. Из недостатков языка — отсутсвие возможности описания пользовательских процедур и функций и наличие всего двух типов данных — целых чисел и строк. Из глюков интерпретатора — необходимый последний перевод строки.
Программа, выводящая песню о пиве (beer.mcs)
// Written by Evgeny Stepanischev
cls
string beer
string w = " on the wall"
def b
for def i=198 to i > 0, i=i-1
do
b = i/2
if b beer = b else beer = "No" endif
beer = beer+" bottle"
ifs b!=1 beer = beer+"s"
if i&1
beer w ".\r\n\r\n"
else
beer w ", " beer "."
"\r\nTake one down and pass it around,\r\n"
endif
done
"No more bottles of beer...\r\n"
"Go to the store and buy some more...\r\n"
"99 bottles of beer."
pause99 бутылок: KiXtart, Omens
24. KiXtart. Язык пакетных файлов. Достаточно простой, наглядный и функциональный. Интересны конструкции вывода на экран и принципы построения функций. Функции (точнее подпрограммы) можно строить при помощи блока Function или, как в BASIC’е, через GOSUB и метки. Что мне понравилось — KiXtart предоставляет большую свободу в форме записи. Так, например, операторы можно разделять переводом строки, табуляциями, пробелами.
Скрипт, выводящий песню о пиве (beer.kix)
; Beer song. Written by Evgeny Stepanischev
Function Beer($n)
If $n
$n
Else
"No"
Endif
" bottle"
If $n<>1 "s" Endif
EndFunction
FOR $beer = 99 TO 1 STEP -1
Beer ($beer) " on the wall, "
Beer ($beer) " of beer."
? "Take one and pass around,"
? Beer ($beer-1)
" on the wall."??
NEXT
"No more bottles of beer..." ?
"Go to the store and buy some more..." ?
"99 bottles of beer."25. Omens (Object manageMENt System). Язык, сочетающий в себе черты Cи, Cи++ и Java. Например, конструкции он унаследовал от Си, принципы работы с указателями и ссылками — из Си++, а описания классов — из Java.
В данный момент язык и система разработки (компилятор
Сам Omens разрабатывался, как платформонезависимая среда со встроенным облегченным механизмом описания и манипулирования сложными данными, в том числе и с базами данных (DB2, Oracle, MS SQL, dBASE, MS Access, …). Из интересных особенностей — у программы может быть несколько точек входа.
Программа, выводящая песню о пиве (beer.oms)
// Beer song. Written by Evgeny Stepanischev
class beer {
private void PrintBeer(byte n) {
if (n>0)
system.out.print(lang.ltoa(n)); else
system.out.print("No");
system.out.print(" bottle");
if (n!=1) system.out.print("s");
}
private void For(byte i) {
PrintBeer(i);
system.out.print(" on the wall, ");
PrintBeer(i);
system.out.print(" of beer.");
system.out.println("Take one and pass around,\n");
PrintBeer(i-1);
system.out.print(" on the wall.\n\n");
if (i>1) For(i-1);
}
public void main() {
For(99);
system.out.print("No more bottles of beer...");
system.out.println("Go to the store and buy some more...");
system.out.println("99 bottles of beer.");
}
};99 бутылок: Miva, Ruby
22. Miva. Доступ к этому языку я получил чисто случайно. Будем считать, что я нашел распечатки парочки программ на этом языке на улице. Это недалеко от истины, ибо документацию по Miva я в глаза не видел.
Итак Miva — это скриптовый полнофункциональный язык, применяемый исключительно
Скрипт, выводящий песню о пиве (beer.mv)
<HTML><MIVA STANDARDOUTPUTLEVEL = "text, html, compresswhitespace">
<MvCOMMENT>
| Beer song. Written by Evgeny Stepanischev
</MvCOMMENT>
<MvFUNCTION NAME="Beer" PARAMETERS="n">
<MvIF EXPR = "{ l.n NE 0 }">&[ l.n ]<MvELSE>No</MvIF>
bottle<MvIF EXPR = "{ l.n NE 1 }">s</MvIF>
of beer</MvFUNCTION>
<MvASSIGN NAME = "g.i" VALUE = 99>
<MvWHILE EXPR = "{ g.i GE 1 }">
<MvEVAL EXPR="{ Beer(g.i) }"> on the wall, <MvEVAL EXPR="{ Beer(g.i) }">.<BR>
Take one and pass around,<BR>
<MvASSIGN NAME = "g.i" VALUE = "{ g.i - 1 }">
<MvEVAL EXPR="{ Beer(g.i) }">
on the wall.<BR><BR>
</MvWHILE>
No more bottles of beer...<BR>
Go to the store and buy some more...<BR>
99 bottles of beer.
</HTML>23. Ruby. Скриптовый язык, который я посчитал очень похожим на Перл, поэтому писал на нём как на Перле. Отличия есть, и существенные, но тем не менее. Как и предыдущем языке, есть префиксные различия между глобальными (начинаются на «$» или «@») и локальными переменными. Из странностей — конструкцию «1?2:3» не удалось заставить работать с локальными переменными. Возможно это особенность языка, но не ясен её смысл.
Скрипт, выводящий песню о пиве.
# Beer song. Written by Evgeny Stepanischev
def Beer (n)
if n!=0 then
print n
else
print 'No'
end
print " bottle"
print "s" unless n==1
end
$i = 99
while $i>0 do
Beer ($i)
print " on the wall, "
Beer ($i)
print "\nTake one and pass around,\n"
$i-=1;
Beer ($i)
print " on the wall.\n\n"
end
print <<EOF
No more bottles of beer...
Go to the store and buy some more...
99 bottles of beer.
EOF99 бутылок: PasScript, ActionScript
20. PasScript. Можно сказать, что это VIRT со всеми присущими ему особенностями и конструкциями (например, «P << [[ 70, 5], <<P]»), только с синтаксисом Object Pascal. Из глюков интерпретатора я заметил нежелание конструкции «for» работать с переменными типов «byte» и «word», плюс конструкция «writeln» сначала печатает перевод строки и только потом —свой параметр.
Скрипт, выводящий песню о пиве (beer.pas)
// Beer song. Written by Evgeny Stepanischev
program Beer;
procedure PrintBeer( n: byte );
begin
if n<>0 then write (n)
else write ('No');
write (' bottle');
if n<>1 then write ('s');
write (' of beer');
end;
var
I: integer;
begin
for I:=99 downto 1 do
begin
PrintBeer (I);
write (' on the wall, ');
PrintBeer (I);
write ('.');
writeln ('Take one and pass around,');
writeln ();
PrintBeer (I-1);
write (' on the wall.');
writeln ();
writeln ();
end;
write ('No more bottles of beer...');
writeln ('Go to the store and buy some more...');
writeln ('99 bottles of beer.')
end.21. ActionScript5. Внутренний язык Flash5. По виду очень похож на JavaScript (если не считать «add», обязательные точки с запятой и прочие мелочи), даже многие предопределенные объекты те же, но по идеологии — нет. Например, как в JavaScript осуществляется доступ
Из интересных особенностей интерпретатора… ActionScript от версии к версии сильно изменяется. Вплоть до несовместимости. Так вот, если интепретатору подсунуть Flash предыдущей версии, он выполняет все необходимые преобразования в ActionScript за программиста, комментируя все свои действия.
Скрипт, выводящий песню о пиве.
// Beer song. Written by Evgeny Stepanischev
function PrintBeer (i)
{
return (i?i:'No') add ' bottle' add (i-1?'s':'') add
' of beer';
}
for (i = 99; i>0; i--)
{
trace ((b=PrintBeer (i)) add ' on the wall, ' add b add '.');
trace ('Take one down and pass it around,');
trace (PrintBeer (i-1) add ' on the wall.\n');
};
trace ('No more bottles of beer...\n' add
'Go to the store and buy some more...\n' add
'99 bottles of beer.');99 бутылок: РАПИРА (КИ) и VIRT
18. РАПИРА. Точнее некий диалект языка РАПИРА для Конструктора Исполнителей.
Среда разработки и диалект мне не понравились. Не запоминаются положения и размеры окон, расцветка хромает, после вывода ошибки происходит выход, не хватает множества функций, синтаксис, не смотря на заявление разработчика,
Сам язык РАПИРА (расшифровывается, как «Расширенный Адаптированный
Программа, выводящая песню о пиве (Panupa для Конструктора Исполнителей).
// Песня о пиве. Написал Степанищев Евгений
фун встр (и)
старш:= и/10
младш:= и mod 10
если старш>0
возврат симв(48+старш)+симв(48+младш)
иначе
возврат симв(48+младш)
всё
кон фун
фун пиво (и)
если и=0
стр:= 'No'
иначе
стр:= встр (и)
всё
стр:= стр+' bottle'
если и<>1
стр:= стр+'s'
всё
возврат стр
кон фун
проц старт()
для и от 99 до 1 шаг -1
печать пиво (и)+' on the wall, '+пиво (и)+'.'
печать 'Take one and pass it around,'
печать пиво (и-1)+' on the wall.'
печать ''
кц
печать 'No more bottles of beer...'
печать 'Go to the store and buy some more...'
печать '99 bottles of beer.'
кон проц19. VIRT.
Пара слов о реализации. Отступы в программе осуществляются при помощи пробелов, табуляции интерпретатор не любит, кроме того не любит он пробелов между именем функции и скобками. Но это не самое странное. Реализованный язык, по всей видимости, не дает использовать многобуквенные переменные, по крайней мере внутри функций. Так что, если вдруг, будьте внимательны.
На сайте есть компонент (45$) для Delphi, позволяющий использовать интерпретатор в качестве внутреннего языка
Программа, выводящая песню о пиве (beer.w).
-- Песня о пиве. Написал Евгений Степанищев
function PrintBeer(n)
s := ''
if n<>0 then
s := s+str(n)
else
s := s+'No'
end
s := s+' bottle'
if n<>1 then
s := s+'s'
end
return s+' of beer'
-- Main program
P := 99
While P Do
Writeln( PrintBeer( P )+' on the wall, '+PrintBeer( P )+'.' )
Writeln( 'Take one and pass it around,' )
P := P-1
Writeln( PrintBeer( P )+' on the wall.'+EOL() )
End
Writeln( 'No more bottles of beer...' )
Writeln( 'Go to the store and buy some more...' )
Writeln( '99 bottles of beer.')
return
99 бутылок: Оберон-2, Ox
16.
Считается, что язык это крайне простой и аскетичный. Лично мне он не понравился. Уж не знаю чем. Впечатлил меня транслятор. Использовал я JOB v0.75 С.Свердлова. Интересен он тем, что переводит программу
Отсюда и, встречающиеся в листинге, строчки «javalang» и «javalang.PString». Думаю, транслятор этот пригодится Pascal-ориентированным программистам, которым понадобилось написать пару апплетов или классов Java.
Программа, выводящая песню о пиве
(* Beer song. Written by Stepanischev E.V.*)
MODULE Beer;
IMPORT javalang, Out;
PROCEDURE PrintBeer( n : INTEGER );
BEGIN
IF n#0 THEN Out.Int (n,1) ELSE Out.String ("No") END;
Out.String (" bottle");
IF n#1 THEN Out.Char ("s"); END;
Out.String (" of beer");
END PrintBeer;
PROCEDURE main*( VAR args : ARRAY OF javalang.PString );
VAR beer: INTEGER;
BEGIN
Out.Open;
FOR beer:=99 TO 1 BY -1 DO
PrintBeer (beer);
Out.String(" on the wall,");
PrintBeer (beer); Out.Char ("."); Out.Ln;
Out.String ("Take one and pass it around,"); Out.Ln;
PrintBeer (beer-1);
Out.String (" on the wall."); Out.Ln; Out.Ln;
END;
Out.String ("No more bottles of beer..."); Out.Ln;
Out.String ("Go to the store and buy some more..."); Out.Ln;
Out.String ("99 bottles of beer.");
END main;
END Beer.17. Ox («Окс») —
Программа на языке Ox.
// Beer song. Written by Evgeny Stepanischev
#include <oxstd.h>
printbeer (const beer)
{
print (beer?beer:"No", " bottle", beer-1?"s":"");
}
main()
{
decl beer;
for (beer = 99; beer > 0;)
{
printbeer (beer);
print(" on the wall, ");
printbeer (beer);
print (".\nTake one and pass it around,\n");
beer--;
printbeer (beer);
print (" on the wall.\n\n");
}
print ("No more bottles of beer...\n",
"Go to the store and buy some more...\n",
"99 bottles of beer.");
}