ObjectIcon
Последнее изменение этой страницы: 02:27, 22 мая 2016.
Парадигма | 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))
Одно замечание о классе является то, что он не изменяется. Это означает, что его состояние не изменяется с того момента, как только он был создан.
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.