LINUX.ORG.RU
ФорумTalks

[лисп r.i.p.]Замыканиям в Java 7 Быть!


0

0

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

Ознакомится как это будет сделано можно в спецификации собстно замыканий и якобы они будут сильно похожи на FCM.

Краткая справка:

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

Примеры:

//javac
#int(int,int) plus = #(int x, int y) x+y;

//из FCA

//The following example shows the method type to which 
//a static method reference can be assigned:

  List<String> list = ...
  #(int(Object)) ref = list#indexOf(Object);

//The following example creates an anonymous inner method assigned
// to a method type:

  #(void(ActionEvent)) action = #(ActionEvent ev) {
    System.out.println("ActionEvent fired");
  }

//acessing to this
  public class MyClass {
    public void process() {
      #(void(String)) example = #(String message) {
        Logger.log(this, message);
      };
      example.invoke("Logged message");
    }
  }

★★☆
Ответ на: комментарий от Deady

покажи пожалуйста законченный пример с замыканиями.

после того как будут законченные замыкания, пока что скачать jdk7 с замыканиями я не могу в силу того что их нет.

пока я вижу увеличение классов только за счет фабрик, но из них можно сделать 1 с помощью рефлексии,

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

кажется мне что с замыканиями классов будет ровно столько же

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

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

>Определение сахара я тебе приводил

ну и под него прекрасно попадает замена нескольких деклараций '#(...)'-синтаксисом

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

>если конечно в очереденой раз создятлы не ударятся в обратную совместимость, как это было с генериками (хотя с чем тут совместимость?)

нет ни малейшего намёка, что кто-то собирается эту обратную совместимость нарушить. И получится именно так как с дженериками.

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

>охохо, так ты читать не уммешь, а я то парюсь

хм, ты в чём угодно заставишь сомневаться...

Читаем: ««Синтаксический сахар» — это любой элемент синтаксиса языка программирования, который даёт программисту альтернативный способ записи другой, уже имеющейся в языке синтаксической конструкции»

Видим: #(...) аналогично дополнительному объявлению одного...нескольких классов и неявному вызову одного метода.

Хоть убей - не вижу разницы

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

с чем совместимость? Пока что у нас есть проблема (она же фича) в в виде #() == Rinnable, но подобное легко решается как автобоксинг, а создание на каждый метод еще одного класса - маразм не достойный даже создателей 1ц (потому, что уже есть класс Method).

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

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

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

>создание на каждый метод еще одного класса - маразм

Ну наконец-то нашли общий язык! =)

Если (в чём я ооочень сильно сомневаюсь) эту «фичу» реализуют не через класс - паду ниц перед твоим провиденьем =]]]

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

>ткнули в границу уже этим определением

единственная нестыковка - «уже имеющейся в языке синтаксической конструкции» - в единственном числе, а у нас - замена нескольким конструкциям. По мне - не принципиально. Но могут быть и другие мнения =)

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

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

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

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

опять не догоняю.

если

#(int(int)) add2 = #(int x) x+2;

превратиться в

interface II { int invoke(int x); } // только не в текущем package, а в каком-то едином для всех функц. типов package, по умолчанию импортируемом во все другие модули

II add2 = new II() { public int invoke(int x) { return x+2; } }

то что это если не создание класса?

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

смотри как реализован автобоксинг в жабке, заодно узнаешь про все его костыли и почему в 1.5

Integer a = 10;
Integer b = 10;
Integer c = 1000;
Integer d = 1000;
System.out.println(a == b);
System.out.println(c == 1000);
System.out.println(c == d);

вернет

true
true
false

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

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

>прикинешь как они могут реализовать для ламбд превращение в Runnable к примеру

1. «лямбда» уже будет отдельным классом (и ни что пока не говорит об обратном)

2. могут реализовать только создав (пусть «анонимный» - это тоже сахар) [вложенный] класс, имплементирующий Runnable, в invoke которого будет «вызов» твоей «лямбды», в коайнем случае (инлайнинг) - тело твоей лямбды. Ну и тут-же «на лету» создать экземпляр от него (точь в точь как с анонимами).

Другого пути без насилования JVM не вижу, а последнее не предвидится (дадада, та самая пресловутая обратная совместимость)

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

>мир станет чище

тогда остаюсь при своём мнении

yyk ★★★★★
()
Ответ на: комментарий от wfrr
class Node {
    Node(String param) {
    }
}
class Post extends Node {
    Post(String param) {
        super(param);
    }
}

class NodeFactory<T extends Node>{
    
    Class<T> cl;

    NodeFactory(Class<T> cl) {
        this.cl = cl;
    }

    public T newInstance(String param) throws Exception {
        return cl.getConstructor(String.class).newInstance(param);
    }
}


class Check {
    public static void main(String[] args) throws Exception {
        Map<String, NodeFactory> ctor = new HashMap<String, NodeFactory>();
        ctor.put("Node", new NodeFactory<Node>(Node.class));
        ctor.put("Post", new NodeFactory<Post>(Post.class));

        Node p = ctor.get("Post").newInstance("firstPost");
    }
}


приведи хотя бы макет (в том варианте, который ты видишь) того, как ты реализуешь замыкание и из которого видно, что нет такой проблемы как

отсутствие статической типизации

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

1. «лямбда» уже будет отдельным классом (и ни что пока не говорит об обратном)

Пердешь мимо - «на орбите летает золотой чайник, и ничего не говорит об обратном», это еще в начале прошлого века уже обсуждали кстати.

могут реализовать только создав (пусть «анонимный» - это тоже сахар) [вложенный] класс

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

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

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

Просвещайся неучь, потом будешь петь псалмы белко, за то что она выдернула тебя из выгребной ямы заблужения http://jroller.com/scolebourne/ «Function types, so that closures are first-class citizens in the type system.»

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

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

По делу: по всем твоим ссылкам (и «по ссылкам по ссылкам») всего-то и написано, что а) делать замыкания будут; б) как конкретно - ещё не окончательно ясно, но в) существующие API менять ни кто не собирается; г) кто-то там уже наваял порядка 80 дженерик-интерфейсов, и это только для поддержки в замыканиях простых типов.

Спорить я с тобой больше не буду - без толку. Осталось подождать «всего-ничего»: несколько месяцев если всё это ограничится новым синтаксисом для кучи интерфейсов, или пару лет, если изменения коснуться байткода.

Удачи!

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

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

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

>моя зодача, жирных троллей научить читать.

а... ну удачи.

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