По факту защиты мной диплома образовалось некоторое свободное время и я таки решил собраться и написать про эту чудесную штучку. Мы в последнее время видим всплеск интереса ко всяким языкам очень высокого уровня, с анонимными функциями, каррингом, мапом/фолдом, метапрограммированием и прочим блэкджэком. Слава богу, я считаю. Задачи усложняются и если люди применяют относительно низкоуровневые средства разработки зачастую наступает ситуация, когда набор абстракций оказывается мал в рамках решаемой задачи, примерно так появляется «спагетти» и велосипеды. Хорошего мало. Хотя умалять роль низкоуровневого программирования не хочется совершенно, по понятным причинам. Совсем недавно, в 2002 году, бравый американец Стив Декорте понял, что ему как-то все вокруг не нравится. Ну то есть нравится, но как-то по частям. Нравится Smalltalk своей Ъ-ООП природой, нравится Lisp своей системой метапрограммирования и общей мегаизвратностью, нравится Self своими прототипами, нравится Lua, потому что маленькая и клево встраивается куда угодно. А вот что бы все и сразу — что-то не то. Погоревал бравый американец, да и наколбасил совй собственный язык программирования — Io.
Io
Io это маленький, полностью объектно-ориентированный язык программирования с динамической типизацией и развитой системой метапрограммирования, анонимными функциями и вытекающими отсюда плюшками. Кроме того, Io невероятно прост, как в синтаксисе, так и внутри. Существуют всего две сущности: объекты и сообщения. На этом базисе построено все остальное. Вообще весь язык следует дзенскому духу минимализма и простоты. В Io нет понятия класс, только объект. Объект может быть склонирован и изменен, таким образом мы получаем другой объект (Это и есть прототипы). Все типы данных, значения и прочая — объекты. Ну что, поехали.Io в примерах
"Hello world" printЭто самизнаетечто. Многих (да и меня в самом начале моих платонических отношений с Io) сильно смутило, какого хрена так странно вызывается print? Тут все просто, главно понять, что в Io нет методов и свойств, есть слоты и сообщения. В данном примере строке "Hello world" отправляется сообщение print. В более традиционных ООП языках это будет выглядеть примерно так:
"Hello world".print()Это что бы было проще понять. Теперь непосредственно про хваленое прототипное ООП:
Mushroom := Object clone
Mushroom isPoison := false
Mushroom whenEaten := method(person,
self isPoison ifTrue(
person kill
)
)
В этом фрагменте кода мы создаем класс Mushroom, определяем его как съедобный и создаем метод whenEaten убивающий съевшего в случае, если гриб оказался ядовитым.
Man := Object clone Man state := "Living" Man eat := method(food, food whenEaten(self) ) Man kill := method( self state := "Dead" )Определяем объект «Мужыг», как видно из кода, Мужыг можеть есть и умереть (ну вот как-то так). Как доказал Сергей Анатольевич Курёхин — Ленин был грибом. Таким образом мы можем определить ленина через клонирование класса Mushroom:
Lenin := Mushroom clone Lenin isPoison := false Lenin speak := method( "Патриотизм - одно из наиболее глубоких чувств, закрепленных веками и тысячелетиями обособленных отечеств." println )Так же, для разнообразия, можно определить ядовиты гриб:
InfectedMushroom := Mushroom clone InfectedMushroom isPoison := trueТеперь мы можем попробовать накормить мужика чем-нибудь:
Man eat(Mushroom) Man state printlnНапечатает «Living».
Man eat(InfectedMushroom) Man state printlnСоответственно «Dead» В то время, пока Ленин говорил:
Lenin speakПришел мужик съел его:
Man eat(Lenin)И остался жив.
Метапрограммирование
Система метапрограммирования в Io в тысячу раз проще чем в том же Lisp'е, но не менее мощная. Здесь нет понятия «макрос», тут просто все дерево кода доступно в рантайме. Не надо извращений со сложными синтаксическими конструкциями, просто изменяй код «on fly» как тебе захочется. Мой любимый пример — реализация Singleton'а в Io:Singleton := Object clone Singleton clone := SingletonТут я просто переопределил стандартный метод clone, что бы он возвращал тот же объект.
9 коммент.:
Ай, малацца! Красиво написал!
Езыг действительно удобный.
Отлично и весьма интересно, пошёл играться, спасибо! Маленькая опечатка: не isTrue, а ifTrue.
Спасибо (:
Опечатку поправил.
интересный язык. правда производительность какая-то непредсказуемая.
вопрос: можно ли его скомпилировать без аддонов только в MSVC?
Спасибо за материалы! Язык очень заинтересовал. Не хватает mysql для использования в рабочем проекте.
Ну вообще, если открыть глаза, то можно увидеть, что в аддонах есть http://iolanguage.com/scm/git/checkout/Io/docs/IoReference.html#DBI, покопайте в эту сторону (:
По поводу компиляции без аддонов сказать ничего не могу, обратитесь к lrrr'у, например, он пробовал.
Ну вы хитрюги:) Тут и так всё достаточно красочно - нет им еще и мускуль :) Автору - респект.
инфециорванный гриб о_0 ?
вирусы в грибах, мощно сказано
Привет! Занятная статейка. Уж больно Io напоминает Lisaac (почти братья близнецы:)), вот только второй компилируется, так что там со скоростью всё норм. Очень советую его посмотреть.
Отправить комментарий