пятница, 28 марта 2014 г.

Мёртвый язык

Учитель Суку путешествовала с тремя послушниками по заснеженным горам, направляясь к далёкому храму. Тропа головокружительно поднималась на огромную скалу, и, как только стало смеркаться, они осознали, что наступает долгая ночь, и начали искать место, которое дало бы им укрытие от ветра.

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

"Что вы видите?" - спросила Суку остальных.

"Пометки", - сказал первый послушник, - "сделанные камнем".

"Слова", - сказал второй, - "вырезанные мертвецом".

"Сообщение", - сказал третий, - "не предполагающее ответа".

Суку покачала головой, роясь в карманах своего пальто: "Это последняя просьба, предназначенная нам".

"Можете ли вы понять буквы?" - спросил первый послушник.

"Нет", - сказала Суку, достав свой сотовый телефон и направив ​​его камеру на царапины. - "Но я распаковывала исходники из многих дальних стран. И хотя форма в каждом месте разная, я ещё могу понять, когда что-то кричит ПРОЧТИ МЕНЯ".

Original: Dead Language

Велосипед изобрели

Судя по всему, для компиляции выражений в блоках лямбд используется самописный компилятор, в котором забыли про некоторые новые возможности языка Java. Например, свеженький баг показывает проблему с обработкой исключений, когда для одного try используются одновременно catch и multi-catch.

А вчерашний баг в лямбдах показывает, что проблема в реализации autoboxing/unboxing. Давайте напишем две лямбды на стандартных интерфесах из пакета java.util.function:
    ((IntConsumer) value -> {
        while (value > 0) {
            System.out.println(value--);
        }
    }).accept(10);

    ((Consumer<Integer>) value -> {
        while (value > 0) {
            System.out.println(value--);
        }
    }).accept(10);
В первом случае будет напечатаны числа от 10 до 1, как и ожидается, а во втором - от 9 до 0.