LINUX.ORG.RU

Прототип замыканий (closures) в языке Java поддерживает все пункты спецификации

 , , , , , ,


0

0

Об этом сообщает в своем блоге Нил Гафтер ( http://gafter.blogspot.com/ ).

Пикантость ситуации придает тот факт, что Гафтер долгое время работал ведущим инженером (senior staff engineer) в Sun Microsystems, участвуя в реализации явы с версии 1.4 по 5.0.

После этого Гафтер перешел в компанию Микрософт, где и работает в настоящее время над языками dotnet. Тем не менее, в свободное время Гафтер участвует в развитии языка Java, как он сам пишет для того, чтобы "сбалансировать свою жизнь" (To balance his life).

>>> Спецификация замыканий в яве

Предидущая новость на эту тему была все-таки не совсем верной.

> Еще один из блистательной плеяды разработчиков Java покинул команду и ушел к новому работодателю, Microsoft.

Ушел давно, судя по тому, что участвовал в работе над 5.0

> Чем он будет там заниматься и что развивать?

Он сам пишет, что *уже* работает on the dotNet platform languages.

> Справедливый вопрос, учитывая, что C# уже имеет в своем составе замыкания, которыми Гафтер занимался в openjdk

С точностью до месяца он *продолжает* заниматься замыканиями, последняя статья в блоге -- 7 августа 2008 года.

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

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

www_linux_org_ru ★★★★★
() автор топика

Хм, в яве нет замыканий?

anonymous
()

Синтаксис ввел меня в дебри конгитивного диссонанса, это писец.

wfrr ★★☆
()
Ответ на: комментарий от DOKA

>Машина времени? :=Ё Не 5.0, а 1.5 (!)

Да нет, всё пральна, с версии 1.5 новая нумерация релизов. Сейчас версия Java 6.0 1.6.0, была Java 5 1.5.0, будет Dolphin Java 7 1.7.0. 1.6.0, 1.7.0 это =внутренняя= нумерация, для разработчиков, а для простых людей 5, 6, 7, 8...

anonymous
()
Ответ на: комментарий от www_linux_org_ru

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

А как же ты искал, что вот этой ссылки не увидел http://www.artima.com/forums/threaded.jsp?forum=121&thread=239398 Йа так и не понял, зачем Нил делает презентацию для некрософт о языках в JavaVM? Они стратегию .NET Framework выбирают?

anonymous
()

Нил вначале перешёл в Гугл, а уже потом в Microsoft. В последнем JavaPosse можно послушать комментарии его самого.

С кложерами много вопросов - Chief Java Architect в Google Джошуа Блох(=> в JCP от компании тоже он), но он не поддерживает предлагаемые Нилом кложеры, вместе с Бобом Ли(Guice, Android) & Дугом Лиа(Threads on JVM, fork-join framework) они предлагают альтернативу CICE(более простой синтаксис для анонимных классов).

anonymous
()

замыкания - для тупых быдлокодеров, обычные метки рулят!

anonymous
()

Бля, зачем делать замыкания "лишь бы было"? Они хороши читабельностью и уместностью, а тут какое-то синтаксическое безумие.

anonymous
()
Ответ на: комментарий от anonymous

эти трое гонят. CICE требует обявления конкретного интерфейса. BGGA соответствия сигнатуре. BGGA - лучше. Если добавить немножко вывода типов - будет вообще кроткословно насколько это возможно в жабе. А CICE требует инстанциации конкретного интерфейса - что приведет к куче оберток. Невозможно например бутет написать нормальный map или foldl/r - надо будет объявлять интерфейс и имплементировать его что явно бред.


r ★★★★★
()

Хочется в очереднйо раз процитировать фразу услашанную в одном из серии фильиов про силиконовую долину: "Микрософт всегда приходит на вечеринку последним, но задерживается там дольше всех".

Микрософт сманивает сотрудников Сан, Гугл, пичкая им в карманы тоннобаксы еще на пороге собеседования и постоянно бурча: "мы все купим, мы все равно все купим, а не купим так скопируем, мы все равно все скопируем".

С джавой "мы все скопируем" не получилось, что-то они там накопировали, но разве может обезьяна научиться играть на скрипке...

anonymous
()
Ответ на: комментарий от anonymous

> Сейчас версия Java 6.0

Сейчас просто Java 6

bbk123 ★★★★★
()

Ура. Корову оседлали. Зачем только корове это седло нужно?

anonymous
()

Нихрена не понял что там по ссылке, это же невозможно читать. Что за хрень?!

Кто-то на erlang возбухал, мол синтаксис ужасный, да вот только код на erlang по сравнению с ЭТИМ просто стихотворение написанное калиграфическим почерком.

Oceanborn
()

Нормальный синтаксис. Примеры на Хаскеле почитайте - там всё позаковыристей будет.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Вон нарисовано. Без свободных переменных. Хочешь перепиши так:

final int x = 5;
{int y => x + y}

Полегчает?




r ★★★★★
()

что такое ЗАМЫКАНИЯ , ктонить вообще может ответить? %) %) %)

// p.s.: программирую на c++98 ..

anonymous
()

Симпатично, но из стиля джавы выбивается, индусы не оценят. Кому нужны замыкания и джава - используют scala.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

> что такое ЗАМЫКАНИЯ , ктонить вообще может ответить? %) %) %)

не позорь себя и людей своим PS-ом для начала, посмотри гугл.

Displacer ★★
()
Ответ на: комментарий от Displacer

в том смысле, что уровень образования достаточный, чтобы самому найти информацию.

Displacer ★★
()
Ответ на: комментарий от Legioner

>Я могу. > >// wikipedia

вот сдесь?: http://ru.wikipedia.org/wiki/Замыкание_(программирование)

.. тогда дело плохо ..:

.. тут не сказанно ни про какие "=>" , а всеголишь рассказано про всякие lambda-функции (или чтото похожее( па замыслу) на них)..

anonymous
()
Ответ на: комментарий от Displacer

>> что такое ЗАМЫКАНИЯ , ктонить вообще может ответить? %) %) %)

>не позорь себя и людей своим PS-ом для начала, посмотри гугл.

мне пофигу -- я ананим :D :D :D :D ..

anonymous
()

5 ряз прочитал фикипедию и осталось такое ощщущение что лямбда функции -- это и есть замыкания %) .... (ну илиобъектные функции (с перегруженным оператором"()") )

anonymous
()
Ответ на: комментарий от anonymous

>такое ощщущение что лямбда функции -- это и есть замыкания %)

а пространство имён, доступное этой функции?

p.s. в голове мелькает, что-то про замкнутые формулы, в которых нет свободных переменных... но это не по теме

dimon555 ★★★★★
()
Ответ на: комментарий от anonymous

> Т.е. в Java уже есть замыкания.... чего же еще надо ?

нормальный синтаксис и автоматическое генерирование обёрток для захвата переменных.

anonymous
()
Ответ на: комментарий от anonymous

> 5 ряз прочитал фикипедию и осталось такое ощщущение что лямбда функции -- это и есть замыкания %) .... (ну илиобъектные функции (с перегруженным оператором"()") )

Они просто обычно взаимосвязаны.

int x = 5; Func<Int32, Int32> func = (y) => { return x + y; };

var r1 = func(1); x++; var r2 = func(1);

r1 == 6 r2 == 7

здесь func - это лямбда функция, которая завхватывает переменную x и звнешнего контекста

anonymous
()
Ответ на: комментарий от anonymous

>Т.е. в Java уже есть замыкания.... чего же еще надо ?

Нормальные замыкания.

r ★★★★★
()
Ответ на: комментарий от anonymous

Это функция с одним аргументом типа Int32 и возвращаемым значением типа Int32.

PS: Прочитай уже википедию.

r ★★★★★
()
Ответ на: комментарий от tailgunner

>Примеры на Хаскеле почитайте - там всё позаковыристей будет.

Позаковырестей-то может быть и позаковырестей, но в хаскеле синтаксис более-менее регулярен. А тут замыкания ну как-то совершенно не в тему.

Кроме того, нужность замыканий при текущем состоянии явы мне представляется сомнительной.

Либо мы объявляем "все есть объект" и делаем "обычные" функции с блекдж^W замыканиями и поддержкой оптимизации хвостовой рекурсии, ибо явские методы в силу чисто нотационных причин не очень удобно использовать в виде объектов первого класса, либо уж не множим и без того многие сущности.

Macil ★★★★★
()
Ответ на: комментарий от anonymous

> А это что Func<Int32, Int32> ? 
> Тип возвращаемого значения? Ну и где там Func<Int32, Int32>?

Вот более реалистичный пример (Nemerle)

def gw = urlMap[url];

_ = ThreadPool.QueueUserWorkItem(fun (_object) {
  using(context.Request.InputStream) {
    using (context.Response.OutputStream) {
      try {
        gw.Process(context);
      }
      catch {
        | e =>
          logger.Error($"Error processing request $(e.ToString())");
          context.Response.StatusCode = 500;
      }
    }
  }});
}

context - переменная из внешнего скопа. 
Соотв лямбда функция захватывает context и запускается поток
обработки запроса в обёртке над исключениями.

Да, здесь можно обойтись без замыкания, но классы обёртки придётся делать ручками.

anonymous
()

А кто-нибудь может объяснить на пальцах, что есть замыкания (closures) и, главное, какое преимущество от их использования?

PS: По ссылке вычитал parameterized delayed-execution blocks of code. Но всё равно не понятно для чего это.

PPS: Вопрос не ради флейма, а исключительно ради самообразования.

anonymous
()
Ответ на: комментарий от anonymous

> Они просто обычно взаимосвязаны.

> int x = 5; Func<Int32, Int32> func = (y) => { return x + y; };

> var r1 = func(1); x++; var r2 = func(1);

> r1 == 6 r2 == 7

> здесь func - это лямбда функция, которая завхватывает переменную x и звнешнего контекста

То есть, чтобы теперь ошибки для разработчиков вообще возникали "хрен знает откуда, у меня всё должно быть корректно"??

anonymous
()
Ответ на: комментарий от anonymous

> А кто-нибудь может объяснить на пальцах, что есть замыкания (closures)

Это функции (возможно, анонимные), которые имеют доступ к локальным переменным другой функции.

> и, главное, какое преимущество от их использования?

Улучшение структуры кода, более краткий и выразительный код.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

>http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8...)

> Замыкание — это особый вид функции. Она определена в теле другой функции ...

Правильно я понял, что в C это есть как само собой разумеющееся? Если определить блок внутри другого блока кода, то вложенному блоку будут видны все переменные внешнего. Всё равно не понятно, какой от этого плюс.

anonymous
()
Ответ на: комментарий от anonymous

Только если в сях вернут указатель на вложенную функцию то будет алярм.

wfrr ★★☆
()
Ответ на: комментарий от anonymous

>> Замыкание — это особый вид функции. Она определена в теле другой функции ...

> Правильно я понял, что в C это есть как само собой разумеющееся?

Нет. В Си нет замыканий.

> Если определить блок внутри другого блока кода, то вложенному блоку будут видны все переменные внешнего.

Различие между блоком кода и функцией от тебя ускользнуло?

> Всё равно не понятно, какой от этого плюс.

Долго объяснять. Попробуй почитать SICP.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

>что такое ЗАМЫКАНИЯ

>программирую на c++98

Еды нет!

anonymous
()

такие closures в java не нужны

Tails
()
Ответ на: комментарий от Legioner

>Кому нужны замыкания и джава - используют groovy

fxd :)

thevery ★★★★
()
Ответ на: комментарий от anonymous

>А кто-нибудь может объяснить на пальцах

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

Собственно такой объект и называется "замыканием". Ну а дальнейшее его использование - зависит от реализации.

Полезность замыканий в том, что это "объекты для бедных" или объекты это "замыкания для бедных"?

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

Например, есть у нас функция log(level,message), а мы хотим сдлеать функцию debug(message). Тогда мы делаем примерно следущее (на питоне):

def makeLogger(level):
...def logger(message):
......log(_level,message)
...return logger

debug = makeLogger(DEBUG) info = makeLogger(INFO)
debug("Debug message") info("Info мessage")

У функций (замыканий) debug и logger в вычислительном контексте будет находится level = DEBUG и level = INFO

Глобальные переменные - частный случай замыканий, т.е. у всех есть "глобальный" вычислительный контекст.

В том же самом питоне есть хитрый оператор yield, который тормозит исполнение текущей функции и возвращает ее замыкание.

Это если на пальцах, с нематематической точки зрения.

А с математической точки зрения, у лямбда-терма могут быть связанные и свободные переменные, так вот, с точки зрения функции logger(message) message - связанная переменная, а level - свободная.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Как я понял из объяснения, это просто для упрощения написания программ. Никаких функциональных преимуществ нет. Так?

Тогда в C это можно просто заменить define-ом.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.