ИЛ на Groovy

Есть такой динамический язык для 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. Что-то не смог найти про неё информации.

А вам было бы удобно писать таким образом?

ИЛ на Groovy: 5 комментариев

  1. uux

    Хмммм… Непривычно было бы на первых порах:).

    На самом деле ИМХО по первому взгляду на код трудно судить об удобстве языка — все зависит от имеющихся в нем средств. Для меня с точки зрения удобства критически важны возможность инкапсулировать действия в объект и наследование (желательно множественное).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *