Интервью, взятое у Лукаса в процессе съёмок «Мести ситов»:
«Так откуда у Энакина этот шрам, Джордж?», — спрашивает Джон Нолл.
«Почём мне знать? Спросите Говарда,» — отвечает Лукас, имея ввиду президента компании «Lucas Licensing» Говарда Роффмана. — «Это одна из тех вещей, произошедших в романах между фильмами. Я просто вставил их в сценарий. Пусть он [Говард] объясняет откуда шрам. Мне думается, что Энакин поскользнулся в ванной, но, естественно, он никому в этом не признается.»
В этой серии постов будет рассказано о многих технологиях «Звёздного пути», таких, как варп, досветовые двигатели и тому подобные научно-фантастические и имеющие аналоги сегодня достижения техники.
Рассчитывал на статью в духе «какие штуки из научной фантастики в настоящий момент фантастикой уже не являются». И тут такой облом.
Изначально меня возмутило название метода «putIfAbsent», который используется для получения значения.
Так он так и не используется, где Вы это нашли? Спец. поискал его использование в посте, нашел единственное место, где результат вообще игнорируется. Основное назначение метода — именно put.
Я Вам задаю один вопрос, Вы мне отвечаете на другой.
Вам важен сам факт генерации класса?
Нет. Мне важен факт понимания реализации.
ну это уж точно не сахар
А где я это говорил?
реализации совсем без класса.
Вот об этом я и спросил. Нам в любом случае нужен объект, реализующий интерфейс Predicate. Как в текущей реализации jvm может быть объект, реализующий интерфейс, но при этом «совсем без класса» я не понимаю. Т.е. мне видится, что это фундаментальное ограничение платформы. Как вы «Даже не думая» можете его обойти?
Может я что-то не понимаю, прошу пояснить если так.
Как это сделать через MethodHandle? У нас функция filter принимает Predicate. И тут хочешь не хочешь, но этот Predicate надо иметь. Или имеется ввиду что будет не класс на каждое создание лябды, а единственный класс с полем final MethodHandle? Но, опять же, одним классом не обойтись. Как минимум класс на интерфейс.
Спасибо за развернутый ответ. С такой формулировкой полностью согласен. Я, действительно, все свои выводы про сахар сделал относительно текущей реализации.
оффтоп
Если честно, то сомневаюсь, что она когда-нибудь поменяется.
Мне просто очень не нравятся заявления в духе «чушь, там invokedynamic», без добавления, что в текущей реализации класс все же создается.
Не нужно всё сводить к сахару, а то у нас сводилка слипнется. ;)
Прошу заметить, я нигде не сказал что сахар — это плохо.
Это я смотрел в случае filter, map и пр. Т.е. когда нам обязательно нужен именно экземпляр интерфейса. Если вызывать метод сразу на месте, то, возможно, класс не создается. Не смотрел еще.
Хотя думаю, что все равно будет. В любом случае надо ведь записать что-то в переменную.
1. ответ на Ваш пред. коммент: а я и не говорил, что функции высших порядков нельзя реализовать элегантно, я лишь сказал что в этом месте за исключением очень удобного сахара, не изменилось ничего. А вот сам сахар и добавляет элегантности.
2. Тем не менее, если верить исходникам, то после вызова invokedynamic, внутри бутстрап метода, как раз явно создается класс через asm и загружается через unsafe. Да, это не «старый добрый аноним», а некая более оптимизированная его версия. Но по сути, неявное создание класса все же есть.
Как именно «собирает про него знания»? Какая-то интеграция с гуглом и его статистикой запросов (если честно, есть ли вообще api для этого я не знаю) или же какое-то свое решение?
0. Спасибо за статью и саму разработку. Очень радует, что постепенно подобные «фантастические» штуки начинают появляться.
1. Субъективно, дороговат кубик. Хотя и вполне приемлемо. Интересует, в первую очередь, вот какой вопрос: «первая партия» — это бета (по качеству/готовому функционалу), или же все готово, просто хочется проверить спрос на маленьком объеме?
Рассчитывал на статью в духе «какие штуки из научной фантастики в настоящий момент фантастикой уже не являются». И тут такой облом.
Так он так и не используется, где Вы это нашли? Спец. поискал его использование в посте, нашел единственное место, где результат вообще игнорируется. Основное назначение метода — именно put.
Но основная мысль, конечно же, верная. Вот это уже сломалось бы.
А по теме, спасибо, больше вопросов нет.
Нет. Мне важен факт понимания реализации.
А где я это говорил?
Вот об этом я и спросил. Нам в любом случае нужен объект, реализующий интерфейс Predicate. Как в текущей реализации jvm может быть объект, реализующий интерфейс, но при этом «совсем без класса» я не понимаю. Т.е. мне видится, что это фундаментальное ограничение платформы. Как вы «Даже не думая» можете его обойти?
Что за метод?
Как это сделать через MethodHandle? У нас функция filter принимает Predicate. И тут хочешь не хочешь, но этот Predicate надо иметь. Или имеется ввиду что будет не класс на каждое создание лябды, а единственный класс с полем final MethodHandle? Но, опять же, одним классом не обойтись. Как минимум класс на интерфейс.
Мне просто очень не нравятся заявления в духе «чушь, там invokedynamic», без добавления, что в текущей реализации класс все же создается.
Прошу заметить, я нигде не сказал что сахар — это плохо.
Хотя думаю, что все равно будет. В любом случае надо ведь записать что-то в переменную.
2. Тем не менее, если верить исходникам, то после вызова invokedynamic, внутри бутстрап метода, как раз явно создается класс через asm и загружается через unsafe. Да, это не «старый добрый аноним», а некая более оптимизированная его версия. Но по сути, неявное создание класса все же есть.
Т.е. higher-order функция объявляется вполне стандартно:
Но вот при использовании можно вместо
писать
Внутри, на самом деле, неявно создается аноним.
1. Субъективно, дороговат кубик. Хотя и вполне приемлемо. Интересует, в первую очередь, вот какой вопрос: «первая партия» — это бета (по качеству/готовому функционалу), или же все готово, просто хочется проверить спрос на маленьком объеме?