ObjectIcon

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:27, 22 мая 2016.
ObjectIcon
Парадигма object-oriented
Портал: ObjectIcon

ObjectIcon - объектно-ориентированный язык программирования, основанный на классическом языке программирования Icon. Как следует из названия добавляются объектно-ориентированные функции, которые предназначены, чтобы сделать его гораздо легче писать большие программы и библиотеки. Некоторые из других существенных особенностей:

  • Очень легкое сo-expressions с динамическим размером стеков. Co-expressions также образуют истинные замыкания над локальными переменными.
  • UTF-8 на основе unicode string type.
  • Package/namespace system

Co-expressions и локальные переменные

В отличие от обычной Icon, Icon Object реализует сопутствующие выражения таким образом, что они разделяют локальные переменные в процедурах, в которой они были созданы (на Icon каждый co-expression получает копию локальных переменных).

Например, следующая программа

import io

procedure main()
   local i, e
   i := 1
   e := create i := 2
   write(i)
   @e
   write(i)
end

выводит

1
2

в то время как в Icon результат будет

1
1

Обновление co-expression создает новое совместное выражение, которое также разделяет те же локальные переменные. Таким образом, программа

import io

procedure main()
   local i, e
   i := 1
   e := create i +:= 1
   write(i)
   @e
   write(i)
   e := ^e
   @e
   write(i)
end

выводит

1
2
3

Оператор !

Object Icon позволяет унарным оператор ! применяться для совместного выражения. Эффект наблюдается при генерировании последовательности результатов из обновленной копии данной co-expression. Другими словами, результат последовательность !e такой же, как для p(e), если p были определены в следующем порядке:

procedure p(e)
   e := ^e
   suspend |@e
end

Обратите внимание, что !e не влияет e, не порождают никаких результатов от него.

Classes and objects

Class syntax

The syntax for a class definition is

class ClassName(Super1, Super2, ...)
   ... Field definitions...
end

Объявление класса вызывает глобальную переменную, имеющий название класса, который будет включена в программу. Начальное значение переменной является значение типа class, представляющего сам класс. Значение переменной может быть изменено с помощью присвоения, так как это просто нормальная глобальная переменная. Это звучит сложно, но это работает таким же образом, что обычный Icon обрабатывает процедуры и встроенные функции. Классы не могут быть созданы или изменены динамически; они зашиты в файл icode.

Lang.Class класс содержит множество статических методов, которые позволяют внутренней структуре класса быть рассмотренной во время выполнения.

Поля

Определения полей являются либо переменными либо методами. Каждое определение начинается с модификаторов доступа, которые определяют, кто может получить доступ к полю, и как это может быть осуществлено. Типичные объявления переменных являются :

private x, y                    # Private instance variables
public static const PI          # A constant, accessible anywhere
private readable z              # A private variable, but accessible read-only from outside

Определение метода выглядит так :

#public метод экземпляра
public set_loc(x, y)
   self.x := x
   self.y := y
end

#Статический метод доступен без экземпляра
public static origin()
   return Point(0,0)
end

Для того, чтобы довести эти вещи вместе, вот простое определение класса для представления точки х, у:

import util(Math)

class Point()
   public const x, y
   public static const ORIGIN

   private static init()
      ORIGIN := Point(0, 0)
   end

   # Radius of a circle on which this point lies
   public radius()
      return Math.sqrt(x * x + y * y)
   end

   # Distance between two points
   public static distance(p1, p2)
      return Math.sqrt((p1.x - p2.x) ^ 2 + (p1.y - p2.y) ^ 2)
   end

   public new(x, y)
      self.x := x
      self.y := y
      return
   end
end

Статический метод init() используется для инициализации статических переменных. Он вызывается автоматически после первого вызова класс. Метод new() аналогичен, но используется для инициализации экземпляров - он вызывается автоматически каждый раз, когда создается новый объект. Некоторые примеры использования класса:

p1 := Point(-2, -3)
p2 := Point(4, 3)
write(Point.distance(p1, p2))
write(p2.radius())
write(Point.distance(p2, Point.ORIGIN))

Одно замечание о классе является то, что он не изменяется. Это означает, что его состояние не изменяется с того момента, как только он был создан.

Ссылки

  1. Field
  2. ObjectIcon
  3. API