Здравствуйте все, противники перегрузки локальных функций могут начинать меня бить за сабж, высказанный в irc.
VD>>Я тебе свою точку зрения иложил. Спорить мне не о чем.
ВВ>Ну так я ее не понял. Почему f(x) и f(x, y) это разные имена, а x = 1 и x = { someobject } — нет? Принцип-то какой?
ВВ>То, что в скобочках после f — это часть описания *функции*, т.е. значения, которая у нас справа пишется. У тебя получается, что тип значения каким-то загадочным образом меняет имя.
ВВ>Вот мне эта концепция непонятна.
Можно подумать о семантике в другом ключе. Приступим.
Давайте посмотрим на классы. Там есть некоторые данные и функции, замкнутые на эти данные. Что это напоминает? { mutable x=1; def f() { x=5; } }
Единственная разница в том, что в непосредственно теле класса нельзя писать код и замыкание захватывает переменные, объявленные и после определения функции (метода) тоже. Можно было бы вообще развить такой подход, что весь код в теле класса исполняется при загрузке класса, тогда например связывание происходило бы только с переменными выше определения, но это по-моему слишком радикально. Зато тогда появляется больше доводов в пользу унификации синтаксиса с введением def для полей и методов. С геттерами/сеттерами тогда правда не совсем понятная ситуация, но можно сказать, что это всего-лишь не вписывающийся в общую картину синтаксический сахар для вложенных классов с переопределёнными оператором = и приведения к типу. Хотел ещё сказать про идею эквивалентности переменных функциям, но не буду, потому что тогда с учётом перегрузки появляется возможность определения переменных с одним именем и разным типом, выбираемых в зависимости от их типа в операции.
В общем похоже мне с этими идеями надо форкать немерле и идти экспериментировать

Что же до языка в текущем виде, то на перегрузку локальных функций меня натолкнуло вот что: во-первых есть перегрузка обобщённых локальных функций (по дженерику), во-вторых есть зачатки сопоставления с образцом через tuples comprehension как например в def f((1,a),b), которая будет вызвана только когда в кортеже нулевой элемент равен 1, в противном случае произойдёт ошибка, в-третьих некоторую аналогию с классами я привёл выше. В принципе ничего не запрещает ввести перегрузку локальных функций с возможностью переопределения уже определённых выше функции, кроме того концепцию tuple comprehension'ов неплохо было бы развить в сопоставление с образцом по-типу того же хаскеля, при чём не только на кортежи среди аргументов, но и на сами аргументы. Если пойти дальше, то аналогичный механизм можно вкрутить в методы. Очевидно реализация через прокси-функцию с match.
Основные мои аргументы основываются именно на однородности языка, т.к. разнородность усложняет его и может отталкивать адептов.
Кстати, по поводу
ВВ>Немерле пытается схитрить и когда у нас есть обращение к некоторому имени f, вместо него может произойти вызов функции-члена с таким же именем вместо того, чтобы вызвать функцию, которая является значением переменной f. Мне кажется, это не очень красивый момент в поведении языка. В данном-то случае это есть необходимо зло и плата за поддержку ООП и ФП.
можете привести примеры? Пока не смог добиться описанного поведения.
Спасибо за внимание.