Pull to refresh

Io Language: Синтаксис

Abnormal programming *Lisp *Smalltalk *

В продолжение серии статей про Io, хотелось бы отдельно остановиться на синтаксисе языка.
В двух словах синтаксис Io можно описать так: простой, но странный. Многих удивит такой подход, но, спешу заверить, как и в Lisp, синтаксис неудобен только при взгляде со стороны. С эстетической точки зрения можно отдельно выделить тот факт, что многие прогаммы на Io внешне кажутся излишне разреженными, на экране остается много «лишнего», незаполненного полезным кодом места, это ощущение меня не покидает довольно давно, я пока не придумал, как полностью избавиться от этого вывиха мозга, я просто придумал для себя некоторые правила оформления кода, при соблюдении которых эффект значительно сморщивается:
  • Длина строки не должна превышать 80 символов (Привет, text mode!)
  • Между клонированием объекта и описанием тела нового должна быть пустая строка
  • Методы и свойства группируются
  • Без лишней необходимости скобки на новую строку не переносятся


Ну что, поехали. Вынос мозга №2.


Синтаксис Io


В Io не существует понятия «ключевое слово», любой текст на Io — выражение состоящее из имен объектов и сообщений. Таким образом у нас нет никаких «function, def, defun, define» и прочего синтаксического мусора.
Объект в Io представляет собой базовый контейнер состоящий из слотов, слот — единица хранения объектом чего-либо. Ну натурально так — слот. Вот отсюда и будем плясать.
В Io существует три различных по значению операции «присваивания»:
  • = (Обновить слот, компилируется в сообщение updateSlot, если слот куда-то делся или никогда не существовал сгенерируется исключение)
  • := (Установить слот, компилируется в setSlot, создает новый слот, присваивает значение)
  • ::= (Создать слот, компилируется в newSlot, создает слот, создает сеттер, устанавливает значение)

Так что не пугайтесь, := это вовсе не наследие паскаля, не к ночи будь помянут.
(Тут я, кстати, еще немножко отойду в сторону и отвечу на каммент к предыдущему посту: да, в Io можно перегружать присваивание, в Io можно перегружать вообще все)

Теперь пару слов о сообщениях.
Сообщения передаются объектам и записываются через пробел, постфиксным образом, а так как в Io объект вообще все, очень лихо прокатывают такие гламурные приемы программирования как цепочки (chains). Например можно наколбасить вот такую загогулину:
Lenin speak split reverse foreach(println)

Общие правила передачи сообщений просты как три копейки: Object message. Все.

Обработчик на каждое сообщение лежит в своем собственном слоте, если так можно выразиться, имя слота это образец который срабатывает при передаче определенного сообщения объекту держателю слота. Создавать слоты так же просто, как и передавать сообщения.
SomeObject someSlot := "Пройдемте в нумера?"

Тут мы создаем слот someSlot объекта someObject, содержащий в себе строковое значение.
(В это месте я впервые за время написания статьи почувствал себя в роли Капитана Очевидность, хехе)
Таким образом можно создавать свойства объектов.
Методы объектов создаются так:
SomeObject someMethod := method(SomeObject someSlot print) 

Причем важно заметить, что method это не ключевое слово, а стандартный метод объекта Object (А значит его тоже можно, ага...)
Метод method (мой мозг...) возвращает анонимную функцию, которую можно использовать хоть прямо так, хоть присвоить ей имя и получить метод класса.
Кроме метода method (ааа!!1) существует метод block, разница между ними только в том, что block лексически ограничен рамками объекта из которого вызывается. (Про систему сообщений я напишу отдельный пост, она тут нетривиальна и мегакрута).
А вот теперь начинаются странные штуки.

Делаем особую магию


Основная форма методов method и block такова:
method(arg1, arg2, ... ,argN, do message)

То есть определение функции сложения двух чисел будет выглядеть так:
add := method(a, b, a + b)

Как видно, никакого принудительного возвращения результата тут не наблюдается. Возвращается результат вычисления do message, как в lisp'е, erlang'е и вообще почти во всех языках с мощной поддержкой функциональной парадигмы. Хотя, справедливости ради, нужно заметить, что return в Io есть и работает как обычный, нормальный return.
Для удобства записи обычно do-часть переносят на следующую строку, вот типа так:
add := method(a, b,
  a + b
)

То есть можно воспринимать круглые скобки как операторные, что б лишний раз не травмировать психику, хотя это не так.

Условные конструкции


Форма такая:
if(condition, true-expression, else-expression)

Также Io унаследовал от папы-Smalltalk'а методы ifTrue, ifFalse, etc.
Можно записывать if в более привычной форме:
if(condition) then(exp) else(exp)

Но обычно не нужно (:

Операторы


Операторы в Io стандартнее некуда, никакой тебе префиксной нотации польского калькулятора, все до тошноты обыкновенно:
1 + 2
1 +(2)
1 +(2 * 4)
etc...


Строки


В Io строки больше всего похожи на строки (Капитан очевидность, на помощь!):
s := "Ленин был грибом.\nИ радиоволной."

Длинные строки и строки с неэкранированными символами можно впихнуть в тройные кавычки:
s := """Дело в том, что находясь в одном из главных храмов мексиканских, я долго рассматривал
фрески и обнаружил, что большинство фресок посвящены какому-то событию истории Мексики, 
и которое до боли напомнило мне нашу Октябрьскую революцию. 
Те же самые изможденные люди, вооруженные примитивными орудиями труда, 
которые свергают какие-то правительства - 
это все очень похоже, понимаете?"""

Экраном служит привычный большинству «бэкслэш» «\». Непечатные символы унаследованы из Си «\n,\t,…».

Комментарии


Io поддерживает три формы комментариев:
C style:
/*
 Никогда не компилируй это! 
 BadObject terribleMethod := method( someAwfulLogic )
*/

C++ style inline:
// OMFG!

И Unix style inline:
# Old
# School

Последние в основном используются для изготовления «шебангов» (#!/usr/bin/io).

Вот, собственно, весь синтаксис Io, мало какой язык может похвастаться тем, что его описание синтаксиса влезает в одну статью.
Дальше по плану статья про объектную модель Io.
Stay turned (-;

(Из моего блога)
Tags:
Hubs:
Total votes 50: ↑45 and ↓5 +40
Views 3.3K
Comments 17
Comments Comments 17

Stories