Я на Icon парсеры писал, под Windows. Если Perl состоял из регулярных выражений, встроенных в императивный язык программирования, то Icon был регулярными выражениями, эволюционировавшими в язык программирования.
Меня зацепило, что это первый язык программирования, в котором
- Код: Выделить всё
every x := 1 to 10 do
является составным выражением, и каждая часть имеет смысл. 1 to 10 генерирует целые числа от 1 до 10, присваивание здесь честное присваивание, а не фиксированная часть оператора. Оператором является только сам every, который запускает полный бэктрекинг для первого выражения, и, получая каждый новый успешный результат, запускает цепочку операторов ниже. Вместо 1 to 10 может быть и позабористее выражение, а присваивания может и не быть. Всё можно разобрать и пересобрать по своему усмотрению. Так как язык заточен под парсинг, у меня там много генераторов было, парсящих текст, например, поиск совпадений с текстом. Если в функции применять не return, а suspend, то можно целые шаблоны группировать в функции-генераторы, и строить из них ещё более сложные конструкции.
Например, установщик FlyLink DC++ делался в куче разных вариаций для разных провайдеров, и там разные скрипты InnoSetup. Чтобы автоматически нужный хаб добавлялся, ещё надо Favorites.xml предустановить. И ещё у разных провайдеров в текстовом формате описание диапазонов адресов было свой-чужой, чтоб по случайности не накачать с помегабайтной оплатой лишнего. Кучи инфы в разных форматах, а при помощи Icon можно относительно быстро подкопаться.
Если опыт иметь, конечно. Первое время было как стрельба из гаубицы. То в одном месте не так, то в другом. Получаться начинает только после того, как развить в себе двоемыслие. Как будет каждый кусок кода работать в прямом порядке исполнения и при бэктрекинге. Обрезать бэктрекинг нередко надо (expr \ 1). Дополнительно к этому Icon имеет проблемы из-за того, что у него нет обязательной точки с запятой, оператор можно закончить переносом строки. Но при этом в Icon есть куча операций и в бинарной, и в унарной разновидностях, и если перенести операцию на следующую строку, она там может распознаться как унарная операция в следующем операторе. Никогда нельзя переносить на следующую строку операцию, операцию надо оставлять в конце строки.
Ещё я, перейдя с Delphi на Аду, завидовал более современным привязкам к WinAPI для Delphi, и пытался сконвертировать JEDI WinAPI на Аду при помощи Icon.
Графические возможности Icon не изучал