krlz ([info]krlz) wrote,
@ 2009-02-28 17:25:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Кортежи в baseLanguage из MPS

Во многих функциональных и динамических языках, есть тип кортеж. Котреж это последователь=ность фиксированного размера. Например, пара, тройка, четверка, это все кортежи. Они бывают полезны, когда мы хотим возвратить из метода несколько значений, и в том коде, который работает с сущностями, состоящими из нескольких элементов, но они не настолько важны, чтобы заводить отдельный класс под них.

Давайте посмотрим, как это было реализовано в MPS.

У нас есть тип кортежа, вот так, например, мы определяем пару из строки и целого числа:

Также у нас есть специальный литерал для создания кортежей:

У каждого элемента кортежа есть имя, при помощи которого можно получить к нему доступ:

Кортежи не изменяемы, так что вы можете создавать новые кортежи, но не можете изменять уже созданные. Если типы кортежей имеют одни и те же типы соответсвующих элементов, то их можно присваивать друг другу. Т.е можно написать что-то вроде:

Чтобы реализовать кортежи потребовалось около пол дня, что, по моему, очень продуктивно :-). Фичу можно будет повертеть в руках в Бета2, которую мы выпустим на днях

Основная сила MPS заключается именно в возможности таких расширений. Взяв несколько расширений baseLanguage, можно быть уверенным в том, что они будут совместимы друг с другом. В MPS тажке можно делать обычные DSL-и, но это не самый лучший способ использовать его. Простые DSL-и хороши, но без возможностей расширения/встраивания кода туда, возможность их повторно использовать будет существенно ограничена.




(2 comments) - (Post a new comment)


[info]pod_baobabom
2009-02-28 03:39 pm UTC (link)
А нахрена, спрашивается, именовать элементы n-ок? Такого рода контейнер с именованными элементами - это уже не n-ка, а запись. И для них свои правила для проверки изоморфности. Наиболее классический пример таковых записей - Standard ML.
У элемента n-ки же уже есть идентификатор - его номер. В большинстве случаев он не нужен, потому как n-ка преимущественно используется в pattern-matching'е как то:

p match {
case (x, _) => foo(x)
case (_ , s@"abc") => bar(s)
}

Если сильно нужно сослаться на конкретный элемент, можно не изобретать велосипед, а сделать как это принято:

val snd = (1, 2)._2

(Reply to this) (Thread)


[info]krlz
2009-02-28 04:23 pm UTC (link)
Да, это скорее не n-ка, а n-ко запись. Такая реализация была выбрана из-за того, что, хотелось сделать все, как можно проще, без проверки изоморфности, зачем она маленькому вспомогательному типу. Другой причиной именования было неуклюжесть паттерн матчинга в императивном языке. Не хочется разводить блок, чтобы обратиться к элементу, ну а обращение по номеру выглядит очень низкоуровнево. У нашего подхода, кстати, есть и плюсы, например, функций, возвращаюящая несколько элементов, может дать им длинные имена, что логично, тк они документируют ее, но в том коде, который их используют их можно переименовать, и использовать имена покороче.

Вообще, в MPS можно реализовать и тот вариант, что предлагаешь ты. Расширения языков совместимы друг с другом, и можно использовать альтернативный синтаксис, если не нравится стандартный.

(Reply to this) (Parent)


(2 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…