В D к примеру есть UFCS (Unified Function Call Syntax), который считает эквивалентными код
F(x, a, b, c) и x.F(a, b, c). И есть чёткие правила поиска. Притом работает для любой свободной функции как минимум с одним аргументом.
В C# приходится лапками больше поработать, чтобы сделать такое. C++ половину пути в одну сторону преодолел в виде специализаций шаблонов типа std::swap, а вот в другую сторону путь даже не начинал.
В C# тоже в общем-то. Помнится, был жуткий вой среди разработчиков при введении нового ключевого слова var.
После этого но одно новое средство языка не ломало обратную совместимость в том смысле, что новый компилятор всегда компилировал код, написанный под более старую версию компилятора. Отсюда растут некоторые странные конструкции, такие как pattern matching например.
Не прошло и полгода, вернулся наконец к этому вопросу.
Вызов TypeDescriptor.Refresh (и любой его перегрузки) не привело к ожидаемому эффекту: кэш со строками сброшен не был. Печаль :(
Я немножко другое имел в виду (или не так понял написанное): задача не в том, чтобы захватить несколько блокировок, а в том, чтобы минимизировать управление блокировками там, где это не нужно. Например, группу изменений закатать в транзакцию, сократив количество прыжков в kernel space.
Использовать в качестве аргумента за JS необъятную кучу невнятных велофреймворков… Ну не знаю даже…
Действительно ли так хороши фреймворки, которые устаревают к моменту завершения чтения раздела Getting Started в официальной документации?
F(x, a, b, c) и x.F(a, b, c). И есть чёткие правила поиска. Притом работает для любой свободной функции как минимум с одним аргументом.
В C# приходится лапками больше поработать, чтобы сделать такое. C++ половину пути в одну сторону преодолел в виде специализаций шаблонов типа std::swap, а вот в другую сторону путь даже не начинал.
После этого но одно новое средство языка не ломало обратную совместимость в том смысле, что новый компилятор всегда компилировал код, написанный под более старую версию компилятора. Отсюда растут некоторые странные конструкции, такие как pattern matching например.
atomic!"+=" (*value, 1)
А ещё const, immutable, in — разные, но так похожи.
Между прочим, во многих языках не хватает…
Вызов TypeDescriptor.Refresh (и любой его перегрузки) не привело к ожидаемому эффекту: кэш со строками сброшен не был. Печаль :(
Но это приведёт к разрастанию контейнера и прокси-объекта, либо же к полиморфности прокси.
Эммм… JS разрабатывался изначально как раз как клиентский Java-подобный язык.
Пруф: https://habrahabr.ru/company/livetyping/blog/324196/
Действительно ли так хороши фреймворки, которые устаревают к моменту завершения чтения раздела Getting Started в официальной документации?