Re[9]: Использование tuple
От: Gaperton http://gaperton.livejournal.com
Дата: 20.10.09 15:09
Оценка:
Здравствуйте, Sinclair, Вы писали:

G>>Типичный вызов из графической либы образца 90-х. Туплов в нем нет.

S>Зато есть имена у параметров. Нажал Ctrl-space — увидел: "int Height".

Пишешь это в комментарии выше — никаких проблем.
Re[10]: Использование tuple
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.10.09 04:13
Оценка:
Здравствуйте, Gaperton, Вы писали:
G>Пишешь это в комментарии выше — никаких проблем.
Хм. Имена параметров ты один раз описываешь в декларации функции и потом пользуешься столько раз, сколько раз ты её вызываешь.
Комментарии ты предлагаешь писать при каждом вызове. Или ты имеешь в виду — описывать их в док-комментарии на функцию, который тебе будет показывать IDE?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: Использование tuple
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.09 12:34
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Gaperton, Вы писали:

G>>Пишешь это в комментарии выше — никаких проблем.
S>Хм. Имена параметров ты один раз описываешь в декларации функции и потом пользуешься столько раз, сколько раз ты её вызываешь.
S>Комментарии ты предлагаешь писать при каждом вызове. Или ты имеешь в виду — описывать их в док-комментарии на функцию, который тебе будет показывать IDE?

Последнее, конечно. Комментарий к функции хотя бы в пару строк писать все равно надо. Запись

-spec get_point() -> { X::integer(), Y::integer() }
get_point() -> ...

от

get_point() -> %% { X::integer(), Y::integer() } — да что угодно тут писать можно, можно сверху или снизу
...

отличается мало. Данный пример завязан на синтаксис Эрланга, но это неважно.

Ключевой момент в том, что имена элементов тупла функциональной нагрузки не несут, компилятор их игнорирует — это по своей сути все равно комментарий. Потому, что поля задаются на самом деле порядком элементов в контрукторе, — так же, как и при вызове функции. Поэтому, это на самом деле не так важно, допускает синтаксис их писать в объявлении типа, или нет. Почувствовать это можно после некоторой практики употребления туплов. Понять — можно и так. Я тебе дело говорю, Синклер, поверь (и проверь сам — я знаю на слово ты не веришь, и это правильно) — нет тут большой проблемы .
Re[12]: Использование tuple
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.09 12:49
Оценка: +1
Здравствуйте, Gaperton, Вы писали:
G>-spec get_point() -> { X::integer(), Y::integer() }
G>get_point() -> ...

G>от


G>get_point() -> %% { X::integer(), Y::integer() } — да что угодно тут писать можно, можно сверху или снизу

G>...

G>отличается мало. Данный пример завязан на синтаксис Эрланга, но это неважно.


Я имею в виду — отличаются в плане возможности автоподсказки, а не контроля типов. Пример на С-подобном псевдокоде, при "хорошем синтаксисе" выглядел бы как-то так:

( int X, int Y ) get_point() { ... }

Вместо

void get_point( int & o_X, int & o_Y ) { ... }

Лучше, не так ли? И не ломает традицию синтаксиса С — возвращаемый тупл должен по возможности выглядеть похоже на аргументы функции, чтобы быть естественным продолжением языка, а не выглядеть уродливо. Сохраняя традицию С, имена X и Y должны быть доступны внутри определения функции, что, кстати, было бы офигенно удобно. Я бы сделал как-то так, добавляя туплы в С-подобный язык. Ну, разрешил бы еще писать просто return в таких случаях, вероятно, а также return с явным туплом. Разумеется, тупл сделал бы l-value.

Или же

( int /* X */, int /* Y */ ) get point() { ... }

но так делать резона нет никакого.
Re[13]: Использование tuple
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.09 12:56
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Лучше, не так ли? И не ломает традицию синтаксиса С — возвращаемый тупл должен по возможности выглядеть похоже на аргументы функции, чтобы быть естественным продолжением языка, а не выглядеть уродливо. Сохраняя традицию С, имена X и Y должны быть доступны внутри определения функции, что, кстати, было бы офигенно удобно. Я бы сделал как-то так, добавляя туплы в С-подобный язык. Ну, разрешил бы еще писать просто return в таких случаях, вероятно, а также return с явным туплом. Разумеется, тупл сделал бы l-value.


Это предложение, как ты видишь, отличается от предложения немерлистов своей простотой и минимальным надругательством над базовым языком. И поднятый вопрос об "опасности" туплов при таком подходе, как ты понимаешь — не стоит вовсе, ибо это есть органическое продолжение базового языка. Вот это и называется, ИМХО — добавлять туплы в язык _правильно_.

А то, что они добавлены по факту через задний проход — это уже не проблемы собственно туплов как таковых.
Re[8]: Использование tuple
От: Gaperton http://gaperton.livejournal.com
Дата: 21.10.09 14:36
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Замечу, что с передачей параметров в ST нет проблем с именами
Автор: Andrei N.Sobchuck
Дата: 25.09.06
.

ANS>А для возврата множества значений предпочитают continuation-passing style
Автор: Andrei N.Sobchuck
Дата: 04.09.06
.


О как. А для группировки аргументов при вызове функции в ST тоже CPS предпочитают? Пример:

call( M, N, O, { empty, 1, 2, 3 } )
...
State = { start, X, Y, Z },
call( M, N, O, State )
...

ANS>Ухожу-ухожу


Да лана, оставайся.
Re[3]: Использование tuple
От: jenyavb  
Дата: 22.10.09 06:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

J>>Вот интересно, нафига сделали Tuple<T>? Зачем кортеж с одним значением?

S>Лично меня больше интересует другой вопрос: где Tuple? Т.е. кортеж с нулём значений?

И зачем же он?
... << RSDN@Home 1.2.0 alpha 4 rev. 1253>>
Re[9]: Использование tuple
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 22.10.09 11:00
Оценка:
ANS>>Замечу, что с передачей параметров в ST нет проблем с именами
Автор: Andrei N.Sobchuck
Дата: 25.09.06
.

ANS>>А для возврата множества значений предпочитают continuation-passing style
Автор: Andrei N.Sobchuck
Дата: 04.09.06
.

G>О как. А для группировки аргументов при вызове функции в ST тоже CPS предпочитают? Пример:

G>State = { start, X, Y, Z },

G>call( M, N, O, State )
G>...

Внутри себя ВМ манипулирует массивами. Именованные переменные это чисто синтаксический сахар. То есть, можно ВМ попросить сделать деструкцию массива. Так что конкретно этот твой пример можно развернуть через два блока так:
someMethod
"..."

 "теперь делаем вызов с CPS"
 self doSomeCall: [ :M :N :O :State |
  [ :Start :X :Y :Z |
    "тут мы имеем доступ и к M, N, O и к Start, X, Y, Z"
    ^ M * N + X + Y - Z."нелокальный возврат"
  ] valueWithArguments: State.
]


И, заметь, без особого синтаксического оверхеда Я проверил — работает.
Но я не думаю, что так хоть кто-то делает. Просто потому, что не-функциональные программы изначально проектируются по другому.
На любом языке, конечно, можно писать как на Фортране Но зачем? Так что пример, где нужно сделать деструкцию двух массивов, можешь не писать
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Использование tuple
От: Oksana Gimmel http://oksana-gimmel.blogspot.com/
Дата: 22.10.09 11:18
Оценка:
Здравствуйте, jenyavb, Вы писали:

S>>Лично меня больше интересует другой вопрос: где Tuple? Т.е. кортеж с нулём значений?


J>И зачем же он?


Как нормальная замена void. Чтобы можно было функции, возвращающие значения, и функции, не возвращающие значения, однотипно полиморфно обрабатывать.
asato ma sad gamaya
Re[5]: Использование tuple
От: jenyavb  
Дата: 22.10.09 11:58
Оценка:
Здравствуйте, Oksana Gimmel, Вы писали:

S>>>Лично меня больше интересует другой вопрос: где Tuple? Т.е. кортеж с нулём значений?

J>>И зачем же он?
OG>Как нормальная замена void. Чтобы можно было функции, возвращающие значения, и функции, не возвращающие значения, однотипно полиморфно обрабатывать.

Так для этого в функциональных языках ведь есть специальный тип, вроде (), зачем его с кортежами мешать?
... << RSDN@Home 1.2.0 alpha 4 rev. 1253>>
Re[6]: Использование tuple
От: Oksana Gimmel http://oksana-gimmel.blogspot.com/
Дата: 22.10.09 12:13
Оценка: 5 (2) +1
Здравствуйте, jenyavb, Вы писали:

OG>>Как нормальная замена void. Чтобы можно было функции, возвращающие значения, и функции, не возвращающие значения, однотипно полиморфно обрабатывать.


J>Так для этого в функциональных языках ведь есть специальный тип, вроде (), зачем его с кортежами мешать?


Ну так это он и есть.
http://en.wikipedia.org/wiki/Unit_type

One may also regard the unit type as the type of 0-tuples, i.e. the product of no types.
...
In the functional programming language Haskell, the unit type is called () and its only value is also (), reflecting the 0-tuple interpretation.

asato ma sad gamaya
Re[5]: Использование tuple
От: Jack128  
Дата: 22.10.09 13:43
Оценка:
Здравствуйте, Oksana Gimmel, Вы писали:

OG>Здравствуйте, jenyavb, Вы писали:


S>>>Лично меня больше интересует другой вопрос: где Tuple? Т.е. кортеж с нулём значений?


J>>И зачем же он?


OG>Как нормальная замена void. Чтобы можно было функции, возвращающие значения, и функции, не возвращающие значения, однотипно полиморфно обрабатывать.


А мона пример??

Tuple GetTuple0() {...}
Tuple<int> GetTuple1 {...}

как можно полиморфно их обработать???
Re[6]: Использование tuple
От: Oksana Gimmel http://oksana-gimmel.blogspot.com/
Дата: 22.10.09 13:57
Оценка:
Здравствуйте, Jack128, Вы писали:

OG>>Как нормальная замена void. Чтобы можно было функции, возвращающие значения, и функции, не возвращающие значения, однотипно полиморфно обрабатывать.


J>А мона пример??


J>Tuple GetTuple0() {...}

J>Tuple<int> GetTuple1 {...}

J>как можно полиморфно их обработать???


Ну, например, в Haskell следующий код будет работать независимо от того, возвращает ли функция f кортеж, () или что-то ещё:
liftM f
asato ma sad gamaya
Re[6]: Использование tuple
От: samius Япония http://sams-tricks.blogspot.com
Дата: 22.10.09 14:53
Оценка: 6 (1) +1
Здравствуйте, Jack128, Вы писали:

J>А мона пример??


J>Tuple GetTuple0() {...}

J>Tuple<int> GetTuple1 {...}

J>как можно полиморфно их обработать???


Например оба можно вызвать через Func<T> (полагаю что второй строчкой метод, а не свойство, судя по Get).
А иначе первый вариант пришлось бы через Action, а второй через Func<T> вызывать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.