Есть такой динамический язык для JVM (Java Vistual Machine) — Groovy. Его преимущество в том, что можно конфигурировать язык практически на лету, а также обрабатывать неизвестные ему конструкции.
Мой коллега ради интереса попробовал сымитировать ЯРИЛ на Groovy. Вот что получилось:
story { startLocation "РаспутьеЛок" startProcedure "Стартовая" Река = "нет" Стартовая { showMessage """О сколько нам историй чудных |Готовят приключенья дух, |И опыт, сын ошибок трудных, |И гений, парадоксов друг, |И случай, бог изобретатель... | | | | | | |У лукоморья дуб зеленый; |Златая цепь на дубе том: |И днем и ночью кот ученый |Всё ходит по цепи кругом; |Идет направо — песнь заводит, |Налево — сказку говорит. |Там чудеса: там леший бродит, |Русалка на ветвях сидит; |Там на неведомых дорожках |Следы невиданных зверей; |Избушка там на курьих ножках |Стоит без окон, без дверей; |Там лес и дол видений полны; |Там на заре прихлынут волны |На брег песчаный и пустой, |И тридцать витязей прекрасных |Чредой из вод выходят ясных, |И с ними дядька их морской; |Там королевич мимоходом |Пленяет грозного царя; |Там в облаках перед народом |Через леса, через моря |Колдун несет богатыря; |В темнице там царевна тужит, |А бурый волк ей верно служит; |Там ступа с Бабою Ягой |Идет, бредет сама собой; |Там царь Кащей над златом чахнет; |Там русской дух... там Русью пахнет! |И там я был, и мед я пил; |У моря видел дуб зеленый; |Под ним сидел, и кот ученый |Свои мне сказки говорил. |Одну я помню: сказку эту |Поведаю теперь я свету... | | | |Сцена вторая. |Руслан ищет свою жену, которую украл колдун Черномор. Но ему хочет помешать его соперник Рогдай. |Игра начинается с того момента, когда он нападает на Руслана. | |Цель игры - победить Черномора, ну и традиционная - спасти принцессу. | |Однажды, темною порою, |По камням берегом крутым |Наш витязь ехал над рекою. |Всё утихало. Вдруг за ним |Стрелы мгновенное жужжанье, |Кольчуги звон, и крик, и ржанье, |И топот по полю глухой. |«Стой!» — грянул голос громовой. |Он оглянулся: в поле чистом, |Подняв копье, летит со свистом |Свирепый всадник, и грозой |Помчался князь ему навстречу. |«Aгa! догнал тебя! постой! — |Кричит наездник удалой, — |Готовься, друг, на смертну сечу; |Теперь ложись средь здешних мест; |А там ищи своих невест». | |При свете трепетном луны |Сразились витязи жестоко; |Сердца их гневом стеснены, |Уж копья брошены далеко, |Уже мечи раздроблены, |Кольчуги кровию покрыты, |Щиты трещат, в куски разбиты... | |Кому-то пасть... вдруг витязь мой, |Вскипев, железною рукой |С седла наездника срывает, |Подъемлет, держит над собой |И в волны с берега бросает. |«Погибни! — грозно восклицает; — |Умри, завистник злобный мой!» | |Сцена третья. |После битвы наш герой продолжает свой путь. Он остановился на развилке дорог.""" } locations { location("РаспутьеЛок") { name "Распутье" description """Руслан на развилке дорог. |Одна ведет прямо на север к лесу, другая ведет направо, огибает камень и поворачивает далее на юг, третья ведет налево на |запад на берег моря.""" north "ЛесЛок" south "РекаЛок" west "БерегМоряЛок" hooks { instead("идти на юг") { if (Река == "нет") { showMessage """ | И вот уже, направя к югу | Нетерпеливый бег коня, | Он думал пред закатом дня | Нагнать любимую подругу. | Но день багряный вечерел; | Напрасно витязь пред собою | В туманы дальние смотрел: | Всё было пусто над рекою. | Зари последний луч горел | Над ярко позлащенным бором. | Наш витязь мимо черных скал | Тихонько проезжал и взором | Ночлега меж дерев искал. |""" goToLoc "РекаЛок" Река = "да" } else { goToLoc "РекаЛок" } } instead("идти на север") { showMessage """ |Но вскоре вспомнил витязь мой, |Что добрый меч герою нужен |И даже панцирь; а герой |С последней битвы безоружен. |""" goToLoc "ЛесЛок" } } } } }
В принципе, его можно расширить — вместо текстовых идентификаторов локаций использовать ссылки, а также позволять в переходах вместо локаций указывать код и т.д.
Мне это напомнило систему Hydra, когда-то разрабатываемую для РИЛ. Если не ошибаюсь, на Python. Что-то не смог найти про неё информации.
А вам было бы удобно писать таким образом?
Я бы писал
Что-то не смог найти про неё информации (с)
Про Худру:
http://ifwiki.ru/Hydra
Топик «[Hydra] – новый этап развития IF на русском!!! (?)» на тяпе:
http://forum.ifiction.ru/viewtopic.php?id=558
И ещё кое-что:
http://forum.ifiction.ru/viewtopic.php?pid=4983#p4983
Спасибо!)
Хмммм… Непривычно было бы на первых порах:).
На самом деле ИМХО по первому взгляду на код трудно судить об удобстве языка — все зависит от имеющихся в нем средств. Для меня с точки зрения удобства критически важны возможность инкапсулировать действия в объект и наследование (желательно множественное).
По идее, Груви как раз это поддерживает. )