Вот я тут задумался и сам сходу ответить не смог. Почему для типа array[] синтакис конструктора совпадает с именем типа, а для кортежей и функций придуман свой синтаксис?
Почему не сделать объявление типа кортежей и функций совпадающим с синтаксисом их описания? Вроде бы нигде нет мест, где может стоять как тип так и выражение.
def x(f : int => int) : (int, string) {
}
Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
Z>Вот я тут задумался и сам сходу ответить не смог. Почему для типа array[] синтакис конструктора совпадает с именем типа, а для кортежей и функций придуман свой синтаксис?
Z>Почему не сделать объявление типа кортежей и функций совпадающим с синтаксисом их описания? Вроде бы нигде нет мест, где может стоять как тип так и выражение.
Z>def x(f : int => int) : (int, string) { Z>}
Z>Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
Что тебе не нравится в текущем объявлении функции f : int -> int, помоему выглядит красиво и так во всех почти функциональных языках, => здесь не совсем уместен, его привыкли видеть при создании анонимных функций и матчей. И кортежи тоже что плохого в int * string, сразу видно что это объявление типа параметра, а x(f : int => int) : (int, string) {, от скобок разделенных двоеточием в глазах рябит. Такое изменение синтаксиса требует серьезной перестройки, потому что все уже привыкли к такому. Можешь как решение сделать макрос например уровня типа или метода, который анализирует код и производит замену твоего синтаксиса в немерловый, (int, string) будет наверное PExpr.Tuple, его заменишь на объявление параметров. Дальше какое то составное выражение, f : int => int, которое можно тоже разобрать и преобразовать в стандартные немерловые деревья. Все это можно легко делать обходя деревья Macros.TraverseExpr или TraverseExprWithContext. И будет тебе свой синтаксис, который можешь включать макросом.
Здравствуйте, Ziaw, Вы писали:
Z>Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
Синтаксис кортежей тоже перекочевал из ML помоему, лучше когда язык похож на своих собратов по парадигме программирования.
Здравствуйте, Ziaw, Вы писали:
Z>Почему не сделать объявление типа кортежей и функций совпадающим с синтаксисом их описания? Вроде бы нигде нет мест, где может стоять как тип так и выражение.
По поводу кортежей, давно уже, было обсуждение в гугулгруппе с авторами. Если не ошибаюсь, сошлись на том, что решение в виде (тип, другой) хорошее, но коней на переправе не меняют.
Что касается фунций, то это вообще натянуто. => — это просто макрос. Реально синтаксис определения методов, локальных функций и лямбд совсем другой (да и различаются между собой).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, CodingUnit, Вы писали:
CU>Что тебе не нравится в текущем объявлении функции f : int -> int, помоему выглядит красиво и так во всех почти функциональных языках, => здесь не совсем уместен, его привыкли видеть при создании анонимных функций и матчей. И кортежи тоже что плохого в int * string, сразу видно что это объявление типа параметра, а x(f : int => int) : (int, string) {, от скобок разделенных двоеточием в глазах рябит. Такое изменение синтаксиса требует серьезной перестройки, потому что все уже привыкли к такому.
Таких причин я и сам могу выдумать. Мне интереснее, есть ли объективные.
Здравствуйте, CodingUnit, Вы писали:
Z>>Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
CU>Синтаксис кортежей тоже перекочевал из ML помоему, лучше когда язык похож на своих собратов по парадигме программирования.
Начнем с того, что в ML списки аргументов не заключаются в скобки. Кивать на ML в плане синтаксиса совсем не логично, ибо nemerle это такой ML с синтаксисом C#, а не наоборот.
Здравствуйте, VladD2, Вы писали:
Z>>Почему не сделать объявление типа кортежей и функций совпадающим с синтаксисом их описания? Вроде бы нигде нет мест, где может стоять как тип так и выражение.
VD>По поводу кортежей, давно уже, было обсуждение в гугулгруппе с авторами. Если не ошибаюсь, сошлись на том, что решение в виде (тип, другой) хорошее, но коней на переправе не меняют.
Мне кажется в Н2 можно исправить это недоразумение. Причем мягко, старый синтаксис поддерживать, но объявить deprecated.
VD>Что касается фунций, то это вообще натянуто. => — это просто макрос. Реально синтаксис определения методов, локальных функций и лямбд совсем другой (да и различаются между собой).
Да ладно, абсолютно неважно, что такое => внутри. По факту это самый распространенный способ создать лямбду. Зачем делать два разных смайлика для описания и создания?
Я понимаю, что мы привыкли, но это выглядит как ошибка дизайна, а их желательно исправлять.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, CodingUnit, Вы писали:
CU>>Что тебе не нравится в текущем объявлении функции f : int -> int, помоему выглядит красиво и так во всех почти функциональных языках, => здесь не совсем уместен, его привыкли видеть при создании анонимных функций и матчей. И кортежи тоже что плохого в int * string, сразу видно что это объявление типа параметра, а x(f : int => int) : (int, string) {, от скобок разделенных двоеточием в глазах рябит. Такое изменение синтаксиса требует серьезной перестройки, потому что все уже привыкли к такому.
Z>Таких причин я и сам могу выдумать. Мне интереснее, есть ли объективные.
Объективная причина при выборе синтаксиса — удобство его использования, чтобы код не казался однородной кашей и можно было отделить одни условные куски кода от других и понять их назначение. Это как известно, больше на уровне интуитивного восприятия, возможно кому то хотелось бы иметь свой синтаксис и для этого хотят либо изменить существующий или создать новый язык. Вот я и начал с того что есть ли объективные причины у тебя что то изменять в существующем синтаксисе? Традиции языков, которым следует Н, в объявлениях это не малый аргумент в пользу использования именно этого синтаксиса, это касается f : int -> int и int * string, это помогает людям в освоении языков, которые перешли на них с предыдущего поколения. Если разработчики нескольких языков пошли на это решение значит действительно у людей есть веские основания, и я не вижу ничего плохого в этом, логично разделять объявление и использование, иначе все превращается в неинтуитивную кашу. Например конкретно: какой плюс от использования f : int => int синтаксиса? На изменение этого и уход от традиций языков должен быть веский повод.
Здравствуйте, Ziaw, Вы писали:
Z>Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
А мне вот => не нравится, -> как-то лучше выглядит.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, CodingUnit, Вы писали:
Z>>>Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
CU>>Синтаксис кортежей тоже перекочевал из ML помоему, лучше когда язык похож на своих собратов по парадигме программирования.
Z>Начнем с того, что в ML списки аргументов не заключаются в скобки. Кивать на ML в плане синтаксиса совсем не логично, ибо nemerle это такой ML с синтаксисом C#, а не наоборот.
Я имел в виду именно int * string синтаксис параметров кортежей, создание их как и все в ML и F# без скобок, потому что они вообще почти безскобочные это их минус. А (a, b) это синтаксис конструктора, только безымянного типа, условными полями которого являются параметры конструктора. Вот этого то не надо делать при объявлении типов параметров, потому что int * string это математическая нотация декларации, а (int, string) валит либо на конструктор либо на вызов функции, но никак на декларацию.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Ziaw, Вы писали:
Z>>Я понимаю, что для функций -> исторически сложилась. А => пришел из C# позже. А вот с кортежами не очень понятно. Где неоднозначности?
H>А мне вот => не нравится, -> как-то лучше выглядит.
Согласен, вообще -> это лямбда калкулус, математическая нотация объявления функции, поэтому нововведения здесь не нужны.
Здравствуйте, CodingUnit, Вы писали:
CU>Объективная причина при выборе синтаксиса — удобство его использования, чтобы код не казался однородной кашей и можно было отделить одни условные куски кода от других и понять их назначение. Это как известно, больше на уровне интуитивного восприятия, возможно кому то хотелось бы иметь свой синтаксис и для этого хотят либо изменить существующий или создать новый язык. Вот я и начал с того что есть ли объективные причины у тебя что то изменять в существующем синтаксисе? Традиции языков, которым следует Н, в объявлениях это не малый аргумент в пользу использования именно этого синтаксиса, это касается f : int -> int и int * string, это помогает людям в освоении языков, которые перешли на них с предыдущего поколения. Если разработчики нескольких языков пошли на это решение значит действительно у людей есть веские основания, и я не вижу ничего плохого в этом, логично разделять объявление и использование, иначе все превращается в неинтуитивную кашу. Например конкретно: какой плюс от использования f : int => int синтаксиса? На изменение этого и уход от традиций языков должен быть веский повод.
Для (x, y) => x * y, логично выводить тип (int, int) => int, а не int * int -> int или (int, int) -> int.
Как и многие, я привык к синтаксису ->. Да и звездочки в кортежах не напрягают. Но я не вижу ни одной причины кроме нашей привычки. А она вызвана тем, что мы давно используем этот нелогичный синтаксис. И никакой логики для тех, кто пришел с C# я тут не наблюдаю.
Здравствуйте, Ziaw, Вы писали:
Z>Начнем с того, что в ML списки аргументов не заключаются в скобки. Кивать на ML в плане синтаксиса совсем не логично, ибо nemerle это такой ML с синтаксисом C#, а не наоборот.
А ты подумай что в ML берется в скобки. Потом погляди что в ML описывается знаком "*" и сам все поймешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Мне кажется в Н2 можно исправить это недоразумение.
Может для начала поинтересоваться считают ли окружающие это недостатком и хотят ли они чтобы этот недостаток исправлялся?
А то ты тут об объективности рассуждаешь, а сам никаких доводов не приводишь, делая свои заключения на основе своего субъективного мнения.
VD>>Что касается фунций, то это вообще натянуто. => — это просто макрос. Реально синтаксис определения методов, локальных функций и лямбд совсем другой (да и различаются между собой).
Z>Да ладно, абсолютно неважно, что такое => внутри. По факту это самый распространенный способ создать лямбду. Зачем делать два разных смайлика для описания и создания?
По факту ты притягиваешь факты за уши и высасываешь выводы из пальца. О каком серьезном обсуждении тут можно вести речь?
Скажи просто, что тебе не нравится стрелочка ->, а нравится => и все тебя пойму, как в прочем, поймут что это чистая вкусовщина.
Идея же делать описание типа функций похожими на их декларацию давно признана несостоятельной. На эти грабли наспупали еще в С. Но спустя 30 лет на них по прежнему наступают (Циклон, Котлин).
В немерле используется классическая математическая нотация. Функция описывается символом ->, который выражает стрелку. Причем функция принимает на вход кортеж и возвращает кортеж. Кортеж так же описывается принятой еще до появления программирования нотацией — произведение типов входящих в кортеж. Читайте классику.
Z>Я понимаю, что мы привыкли, но это выглядит как ошибка дизайна, а их желательно исправлять.
Не я вижу другое. Тебе делать не чего и ты решил пересмотреть базовые принципы. Но ты для начала поинтересуйся может они всех кроме тебя устраивают. Лично меня устраивают. Менять шило на мыло (т.е. -> на =>), лично я смысла не вижу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Для (x, y) => x * y, логично выводить тип (int, int) => int, а не int * int -> int или (int, int) -> int.
Нет тут ничего логичного. Это всего лишь твои предпочтения. Те кто продумывал мат.формализм предпочитал описывать кортежи как произведение типов.
Пытаться сделать все типы похожими на конструкторы их значений — это не логично. Как уже не раз говорил в немерле "=>" — это макро-оператор. Довольно глупо пытаться делать похожим описание типа функции на макро-оператор. Тогда уж нужно брать описание функции в немерле. Оно имеет вид:
имя(параметр1 : тип1, параметрХ : типХ) : тип
Дизайнеры языков ненаделенные знаниями в области систем типов пошли таким путем и мы получили на свет знатных уродов вроде указателей на функции в С и делегатов в Шарпе. Сейчас вот к стану дизайнеров-похожистов примкнули авторы Котлина и Циклона.
Результат их работы — уродство. Мыслили они в точности как ты.
Z>Как и многие, я привык к синтаксису ->. Да и звездочки в кортежах не напрягают. Но я не вижу ни одной причины кроме нашей привычки. А она вызвана тем, что мы давно используем этот нелогичный синтаксис. И никакой логики для тех, кто пришел с C# я тут не наблюдаю.
Тут все очень просто. В выборе синтаксиса нет ни одной объективной причины. Все причины субективны. Такими причинами являются: традиции, личные предпочтения, фаза луны и т.п.
Текущий синтаксис прижился и удовлетворяет всех окружающих. Я сам в свое время предлагал поменять описание типов кортежей, но понял, что особого смысла в этом нет. Запись получится не разу не понятнее.
Замена стрелочки на другую — это вообще чистый бздик. Я скорее соглашусь с тем, что логичнее было бы в лямбдах использовать ->.
В общем, на мой взгляд это ничего не даст. А стал быть не стоит на это тратить время.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали: VD>Замена стрелочки на другую — это вообще чистый бздик. Я скорее соглашусь с тем, что логичнее было бы в лямбдах использовать ->.
Такой макрос когда-то был в билиотеке (аналог питоновских лямбд):
Здравствуйте, VladD2, Вы писали:
VD>Скажи просто, что тебе не нравится стрелочка ->, а нравится => и все тебя пойму, как в прочем, поймут что это чистая вкусовщина.
Нравится мне стрелочка. Сильно больше чем =>. Не правится два разных синтаксиса. И я спрашиваю причины, а слышу только: потому, что нам нравится, отвали.
Менять синтаксис создания лямбды вижу бОльшим злом. Ибо сишарперы съедят.
VD>Идея же делать описание типа функций похожими на их декларацию давно признана несостоятельной. На эти грабли наспупали еще в С. Но спустя 30 лет на них по прежнему наступают (Циклон, Котлин).
Во, первый намек на конструктив. Какие грабли? Синтаксис Котлина видится довольно стройным и адекватным.
VD>Не я вижу другое. Тебе делать не чего и ты решил пересмотреть базовые принципы. Но ты для начала поинтересуйся может они всех кроме тебя устраивают. Лично меня устраивают. Менять шило на мыло (т.е. -> на =>), лично я смысла не вижу.
Я вот вижу, что от нечего делать тут люди собираются экономить на пабликах. Не заморачиваясь глобальным дизайном и вопросами интуитивной понятности и принципам наименьшего сюрприза. А у меня был простой вопрос, который превратился в предложение только после "думали, логично, но коней на переправе не меняют".
Здравствуйте, Ziaw, Вы писали:
Z>Нравится мне стрелочка. Сильно больше чем =>. Не правится два разных синтаксиса. И я спрашиваю причины, а слышу только: потому, что нам нравится, отвали.
Ладно, Саш не обижайся, все свои, Влад хоть и грубоват, но говорит правду, нам с тобой надо идти в школу и учить лямбда исчисление и формальные языки, тогда все вопросы отпадут сами собой.