ObjectIcon совместим с исходным кодом классического Icon, однако есть несколько важных отличий между этими двумя языками программирования.
Вот наиболее существенные отличия ObjectIcon от его предшественника:
- Новые операторы и ключевые слова: class, const, defer, final, import, package, private, protected, public, readable.
- Несколько новых встроенных функций: cast(), is(), classof(), keyof(), ucs(), uchar(), text(). Также ObjectIcon имеет несколько меньше встроенных функций, поскольку большая часть функциональности реализована в классах.
- Несколько новых ключевых слов, среди которых &why — строковая переменная, содержащая причину отказа (очень похоже на переменную errno из языка программирования C). &yes и &no являются типовыми значениями для флагов в состоянии включено/выключено, и соответственно равны 1 и &null. Опять же, большая часть ключевых слов Icon доступна в классах.
- I/O полностью переписан, в частности, встроенных функций (write, read и подобные) нет, как и встроенного типа file. I/O реализован в классах из модуля io.
- Большинство встроенных графических примитивов Icon были перенесены в новый модуль graphics. В частности, окно представляется в форме класса Window, взамен встроенному в Icon типу file. Большинство ключевых слов Icon, относящихся к графике,в ObjectIcon просто не существует.
- Математические функции представлены как статические методы класса util.Math и не являются встроенными. Константы &pi, &e и &phi в ObjectIcon отсутствуют, но имеются их эквиваленты в классе util.Math.
- Функция set() создает символьное множество и добавляет каждый параметр, передаваемый в функцию, в новое символьное множество. В Icon эта функция принимает список и добавляет его члены в новое символьное множество.
- Преобразование и управление runtime error, использующее &error в ObjectIcon отсутствует. Вместо этого, runtime error может быть перехвачено с помощью ковыражения с использованием ключевого слова &handler.
- Для типа record функция type() возвращает не имя типа записи, а »record». Для получения имени типа записи можно использовать метод Constructor.get_name(), вызванного для данного экземпляра record.
- Для вызова PDCO используется вызов ковыражений, как индивидуальных параметров, вместо их сборки в единый список аргументов. Таким образом синтаксис proc{expr1, expr2, …} эквивалентен proc(create expr1, create expr2, …).
- Ковыражения имеют несколько иную семантику. Кроме того, в Icon ковыражения создают большую нагрузку, в то время как в ObjectIcon они менее требовательны к ресурсам.
- В Icon необъявленные идентификаторы вызывают предупреждения транслятора, в ObjectIcon они вызывают ошибку.
- В Icon глобальные переменные, представляющие функции, функции, процедуры и записи, могут быть присвоены во время выполнения. В ObjectIcon, они являются константами и не могут быть изменены.
- Для списков встроенная функция insert(x,i,o) имеет параметр i, в случае равенства которого нулю или *x+1, работающая также как и put(x,o). В Icon это выражение просто дает fail.
- Разный формат ucode — вы не можете слинковать код ObjectIcon и Icon.
- Разные имена исполняемых файлов: icont и iconx — в Icon, oit и oix в ObjectIcon.
- Разные переменные среды. Icon использует IPATH и LPATH,а ObjectIcon — OIPATH и OLPATH. Кроме того, эти переменные используют тот же синтаксис, что и переменные среды рабочей платформы.
- IPL. Большая часть IPL доступна и в ObjectIcon, однако IPL разделена на модули. Технически, это значит, что вместо инструкции link options теперь используется инструкция import ipl.options.
Информация взята из официальной вики проекта ObjectIcon, переведена специально для блога.