Я считаю, что язык надо упрощать, а не усложнять (как это делает Scala).
Список пожеланий, что хотелось бы улучшить, добавить:
(в тексте [] используются для простого html == меньше больше)
1. добавить всё что есть в Project Coin: small language changes
много мелких синтаксических сахарков, делающих код более простым и наглядным.
В частности 'array getter/setter': v = myList[i]; mymap["key1"] = value == компилятор подставляет вызов get и put соответственно.
Если методов get/put/set не находится, то можно использовать любые другие проаннотированные @ArrayProperty
2. всё что есть в проекте Google Guava http://code.google.com/p/guava-libraries/
плюс статические и fallback методы у интерфейсов т.е. "перенос" максимум кода из статических методов в instance методы (mySet.filter(..), map1.transform, etc).
Пояснение про fallback: это статические методы в интерфейсе вида T filter (Set this, Filter _) - если у instance метода filter(Filter) нет,
то используется fallback метод из интерфейса.
myset.filter(myfilter).transform(myfunc) выглядит нагляднее и лучше работает с автокомплитом в отличии от transform(filter(myset, myfilter), myfunc)
3. возможность не писать ";" там где IDE и компилятор справятся без ; т.е. сделать точку с запятой более опциональной
Например: после и перед } , после )
4. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело } + именование параметров по умолчанию _ / _0, _1, _2, etc.
Последнее выражение в теле замыкания == return это выражение.
Также простое указание метода реализующего тело замыкания #this.имяМетода или #имяМетода или #другойОбъект.имяМетода (примеры ниже).
Примеры использования:
new Thread(#{log.info("hello!")}).start() == new Thread(new Runnable(){@Override public void run () { log.info("hello!"); }}).start()
mySet.filter(#{_ != null}) == mySet.filter(new Predicate[SomeType](){ @Override public void boolean apply (@Nullable SomeType _) { return _ != null; }});
vs текущее Iterables.filter(mySet, ....многобукв);
list.sort(#(a,b){a-b}) задание читателю ;-)
"ссылка на метод"
new Button("Нажми меня", #myThisButtonClickListener) где в том же объекте объявлен реализующий тело интерфейса listener-а метод
public void myThisButtonClickListener (Button.ClickEvent event) {
final Window subw = new Window("суб-окошечко");
getMainWindow().addWindow(subw);
...
}
== new Button("Нажми меня", #{myThisButtonClickListener(_)})
Многие уже сейчас реализуют это через reflection т.е. можно указать объект (this в данном случае) и имя метода в виде строки "myThisButtonClickListener"
5. конструкцию let[def/val/var], для тел методов, которая бы сама выводила тип переменной _в левую сторону_ vs текущая тенденция
выводить в правую (diamond operator и все эти Джошуа Блоковские static list, newMap и тд).
Пример использования.
let myvar = new ConcurrentHashMap[ТУТ БОЛЬШОЙ СПИСОК С Generics]()
final let s = "hello"
далее по коду работать с этими переменными как с обычными типизированными
for (let i : mybiggenericmap.entrySet()) {
let k = i.key;
for (let j = k; j
6. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
Автобилдеры? myedit.width = 80, hight = 16, styleName = "sexy, main", value = 42;
7. массивы implements Iterable (можно будет применять filter, transform) и for работающий по Iterable/Iterator/Enumeration т.е. всеядный for, а не только массив и Iterable как сейчас.
Кроме того станут возможными унифицированные API: public double sum(Iterable
8. полезные идеи из JavaFX (полный отказ от чистого JavaFX - это хорошо)
У JavaFX 2.0 очень трезвый и разумный roadmap http://javafx.com/roadmap/
Очень рекомендую на него поглядеть, много вкусного.
9. JRebel встроенный в JVM. JRebel хорошо, а out-of-box он бы imho дал такой синергетический эффект, что здорово бы улучшил индустрию.
Самый сильный козырь скриптовых языков быстрый цикл редактирование-тестирование в web, с JRebel этот козырь получили бы все языки JVM.
10. /regexp Pattern/ прямая поддержка в Java коде т.е. данная конструкция должна выглядеть как скомпилированный Pattern.
11. === безопасный вызов equals т.е.: a = b - присваивание, a == b - сравнение ссылок и простых типов, left === b - сравнение объектов (и простых типов): if (left == b) { return true; } if (left == null || b == null) { return false; } return left.equals(b);
Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.
4 комментария:
Fantom.org смотрели? Не все, но половина хотелок как минимум, плюс Actors вместо потоков.
Не смотрел, т.к. не видел чтобы его упоминали особо.
Какой-то он не майнстримный vs Clojure, Groovy, Scala...
Сами пользуетесь?
Ну мейнстримности в требованиях заявлено не было. fun4j поди тоже не шибко мейнстрим. Пользовать да, пытаемся, эффект сразу заметен (в производительности труда, ну да известно, любой язык лучше Джавы), камней пока не видно, а что будет дальше — покажет время.
Помимо языка, хорошо бы:
+ MiG Base64 включили в jre и везде его использовали и было бы одно супер быстрое публичное API для Base64
+ заменили тормозную XML либы на более быстрые. К примеру JAXEN для XPath заметно быстрее того, что в Jre, а woodstox самый быстрый XML парсер - заменить StAX парсер из JRE на него
+ грамотно купить команду JRebel и поставлять его в JRE out-of-box с грамотным публичным API для фреймворк писателей - все скриптописатели захлебнуться от желчи ;-)
Отправить комментарий