Re[5]: Преобразование в кортеж
От: Воронков Василий Россия  
Дата: 19.10.10 09:37
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Что-то нечасто я вдел чтобы функция принимала чисто кортеж.


Ну это может быть, к примеру, каррированная (в вашем случае — "частично примененная") функция. В таком случае сценарий не столь уж и редкий.

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


А какие проблемы с этим неявным приведением, кроме чисто технических? Неочевидно получается?
Я в принципе вполне понимаю, почему поляки так сделали. Совпадение синтаксиса вызова функции и литерала кортежа — не очень хорошо. Они фактически сделали финт ушами и говорят — они совпадают не просто так. Ведь параметры функции это и есть кортеж. И отсюда следуют все ваши неявные приведения. Т.е. это не просто неявные приведения, это, получается, часть дизайна языка.

Кардинальным решением было бы изменить литерал кортежа на что-то более другое и бесскобочное.
Re[5]: Преобразование в кортеж
От: Воронков Василий Россия  
Дата: 19.10.10 09:57
Оценка:
Здравствуйте, hardcase, Вы писали:

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


Кстати, альтернатива — придумать более выразительный в плане синтаксиса, чем литерал, явный механизм упаковки аргументов в кортеж. Например так:

fun(1,2,)
Re[5]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 14:38
Оценка:
Здравствуйте, artelk, Вы писали:

A>А можно так?

A>
A>def tuple = (1,2);
A>def f(x,y) {}
A>f tuple;//cкобки уже есть в tuple :)

A>//или так:
A>f $ tuple;
A>


Это будет крайне трудно объяснить людям (а первое вообще противоречит концепциям языка).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Преобразование в кортеж
От: Воронков Василий Россия  
Дата: 19.10.10 14:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это будет крайне трудно объяснить людям (а первое вообще противоречит концепциям языка).


А как тебе такой костыль:

fun(1,2,)


Т.е. запятая в конце — список параметров надо преобразовать в кортеж.
Re[7]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:11
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А как тебе такой костыль:


ВВ>
ВВ>fun(1,2,)
ВВ>


Плохо — это и так допустимая конструкция. Да и опять же не очевидно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:15
Оценка: 8 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А какие проблемы с этим неявным приведением, кроме чисто технических? Неочевидно получается?


Да.
Например вот в таком коде:
http://code.google.com/p/nemerle/issues/detail?id=1268&can=1&sort=-id
def f (x, y)
{
 def f (x) 
 {
  f(x, y) 
 };

 if (x <= 0)
  y
 else
  f (x,1) + y 
}

f(1,3);

Вместо сообщения о том, что в функцию передается неверное количество параметров получается сообщение:

in argument #1, needed a ?, got (? * ?): the element with index 0 in tuple '(? * ?)' is recursive. This bug can be caused by the parametr to tuple transformation.


ВВ>Я в принципе вполне понимаю, почему поляки так сделали.


Все тоже — хотели как лучше.

ВВ>Совпадение синтаксиса вызова функции и литерала кортежа — не очень хорошо. Они фактически сделали финт ушами и говорят — они совпадают не просто так.


Скажу больше. Никакого совпадения не было. Это было задумано с самого начала. В системе типов функция описывается так: "тип -> тип" и подразумевается, что если параметров более одного, то "тип" — это кортеж:
  public variant FixedType : TypeVar
  {
...
    | Fun { from : TypeVar; [RecordIgnore] public argsCount : int; to : TypeVar;
...
    | Tuple { args : list [TypeVar]; }

Потому я и высказываю сомнения, что удастся легко отключить эту фичу.

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

ВВ>Ведь параметры функции это и есть кортеж. И отсюда следуют все ваши неявные приведения. Т.е. это не просто неявные приведения, это, получается, часть дизайна языка.


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

ВВ>Кардинальным решением было бы изменить литерал кортежа на что-то более другое и бесскобочное.


Литерал тут в общем-то не причем. Дело в логике работы с функциями.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Преобразование в кортеж
От: Воронков Василий Россия  
Дата: 19.10.10 16:29
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Совпадение синтаксиса вызова функции и литерала кортежа — не очень хорошо. Они фактически сделали финт ушами и говорят — они совпадают не просто так.

VD>Скажу больше. Никакого совпадения не было. Это было задумано с самого начала. В системе типов функция описывается так: "тип -> тип" и подразумевается, что если параметров более одного, то "тип" — это кортеж:

А что это дает с точки зрения языка? Т.е. я понимаю, что да, в статьях вроде как написано — считается, что параметры функции описываются через кортеж. Но мне казалось, что это больше "идейное" утверждение. Т.е. завтра можно сказать, что параметры функции ни через какой кортеж не описываются, и функция типа int -> (int * int) имееет на самом деле тип int -> int -> int.

Что-нибудь, кроме этой самой неявной упаковки/распаковки кортежа, будет противоречить этому утверждению?
Re[8]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 16:32
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А что это дает с точки зрения языка? Т.е. я понимаю, что да, в статьях вроде как написано — считается, что параметры функции описываются через кортеж. Но мне казалось, что это больше "идейное" утверждение. Т.е. завтра можно сказать, что параметры функции ни через какой кортеж не описываются, и функция типа int -> (int * int) имееет на самом деле тип int -> int -> int.


ВВ>Что-нибудь, кроме этой самой неявной упаковки/распаковки кортежа, будет противоречить этому утверждению?


Текущая реализация. А так по идее должно все взлететь.

Надо повнимательнее посмотреть на ситуацию под отладчиком. Возможно удастся просто обрубить распаковку на уровне типизации функций (создания лишних перегрузок).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Преобразование в кортеж
От: Воронков Василий Россия  
Дата: 19.10.10 17:48
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Плохо — это и так допустимая конструкция.


Используется для создания кортежа из одного элемента?

VD>Да и опять же не очевидно.


Ну тут хз. Интересно было бы посмотреть на другие варианты. Как и на другие варианты бесскобочного литерала для кортежа. Наверняка можно придумать что-нибудь интересное.
Re[9]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.10 19:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Используется для создания кортежа из одного элемента?


Используется теми кому в лом при копипасте редактированием заниматься. Просто можно вбивать в любом перечислении лишнюю запитую.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Преобразование в кортеж
От: _nn_ www.nemerleweb.com
Дата: 28.10.10 16:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Скажу больше. Никакого совпадения не было. Это было задумано с самого начала. В системе типов функция описывается так: "тип -> тип" и подразумевается, что если параметров более одного, то "тип" — это кортеж:

VD>
VD>  public variant FixedType : TypeVar
VD>  {
VD>...
VD>    | Fun { from : TypeVar; [RecordIgnore] public argsCount : int; to : TypeVar;
VD>...
VD>    | Tuple { args : list [TypeVar]; }
VD>

VD>Потому я и высказываю сомнения, что удастся легко отключить эту фичу.

Есть вероятность это это все таки возможно ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.10.10 16:53
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Есть вероятность это это все таки возможно ?


Дык тут надо пробовать. Так ничего сказать нельзя. Учитывая, что народная поддержка вроде как есть, можно попробовать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Преобразование в кортеж
От: Ka3a4oK  
Дата: 31.10.10 09:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Народ! Высказываетесь по этому поводу!


VD>Я тоже склоняюсь, что данную фичу лучше запретить. От нее вреда больше чем пользы.


Может для начала сделать ворнинг с сообщением о том, что в будущем фича будет запрещена?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[3]: Преобразование в кортеж
От: hardcase Пират http://nemerle.org
Дата: 31.10.10 17:13
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Может для начала сделать ворнинг с сообщением о том, что в будущем фича будет запрещена?


Тут вопрос в другом — предположительно снос бошки этой "фиче" позволит некисло ускорить вывод типов (а имеено выбор перегрузок) и уменьшить время компиляции.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Преобразование в кортеж
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.11.10 16:53
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Может для начала сделать ворнинг с сообщением о том, что в будущем фича будет запрещена?


Как-то времени не остается. Релиз на носу. Надо или пробовать ее удалять, или оставпить все как есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Преобразование в кортеж
От: _nn_ www.nemerleweb.com
Дата: 10.11.10 11:37
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>Есть вероятность это это все таки возможно ?


VD>Дык тут надо пробовать. Так ничего сказать нельзя. Учитывая, что народная поддержка вроде как есть, можно попробовать.


Поддержка есть
IMHO нужно пробовать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.