Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 08.08.12 16:32
Оценка: 326 (11)
Вкратце — это продолжение идеи WUI.Reactive, только переписанное практически с нуля. Удалось создать достаточно мощный транслятор Nemerle -> Javascript, правда немного заточенный под конкретные MVVM нужды. Если кто не знает, как работает MVVM в вебе, то советую посмотреть на http://knockoutjs.com/. Эта библиотека сейчас как раз и используется для биндингов.

Теоретически ограничения транслятора упираются только в BCL, который, конечно никто не будет дублировать. Практически, проект даже не на стадии альфа, так что о полноте возможностей проебразования говорить пока рано. Однако матчинг, string interpolation, и прочие вкусности работают.

Также была добавлена возможность общаться с сервером в такой манере:

SomeClientSideFunction(user) {
   server.SaveUser(user, result => {
       //Do something with result
   });
}


Сервер описан во вложенном классе:

class Server {
   SaveUser(user : User) : string {
      db.Users.Update(user);
      $"User $(user.Name) succcessfully updated!"
   }
}


Достаточно в модели представления объявить вложенный класс с именем Server, так сразу появляется доступ к полю server с нужными методами, у которых добавляется параметр-коллбек. На данном этапе это единственная конвенция, но можно будет сделать и другие, например ИмяМоделиServer

Пока это всё. За Roadmap я ещё даже не садился, но планов выше крыши.
Одному работать очень тяжело, три недели практически безвылазно программировал, так что надеюсь, что кто-то ещё заинтересуется.

Репозиторий: https://github.com/ionoy/NemerleWeb
Сэмплы: http://nemerleweb.site44.com/index.html (К сожалению два последних сэмпла завязаны на серверную часть, а у меня сейчас нет под рукой Asp.NET хостинга. Так что пока там приведён только код.)

Огромное спасибо Владу, который очень много помогал по ходу проекта. Без его помощи я бы точно не разобрался.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: Сделал прототип Веб фреймворка для Немерле
От: catbert  
Дата: 09.08.12 20:28
Оценка:
Очень интересно. Может захостите где-нибудь вживую, с серверсайдом?
http://nemerle.org/banners/?t=%20catbert%20
Re: Сделал прототип Веб фреймворка для Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.08.12 10:32
Оценка: +1
Здравствуйте, ionoy, Вы писали:

I>Вкратце — это продолжение идеи WUI.Reactive, только переписанное практически с нуля...


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

Так же надо бы сделать более пушистые тесты, а то на примитивных не видна мощь.

Что касается АСП-хостинга, то можно на РСДН-е захоститься.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 10.08.12 11:23
Оценка:
Здравствуйте, catbert, Вы писали:

C>Очень интересно. Может захостите где-нибудь вживую, с серверсайдом?


Если получиться с РСДН хостингом, то в субботу/воскресенье выложу. Если нет, постараюсь найти в ближайшие дни что-нибудь подешевле и зарегить там.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 10.08.12 11:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Теперь надо бы заняться типизацией представлений (чтобы и в них код преобразовывался из немерлового).

Для начала надо решить, как будут описываться представления, через XML макрос или каким-то другим способом. Если, через макрос, то его надо допиливать, так как у него есть ограничения.
Дальше надо решить, каким образом описывать биндинги. У меня была идея на подобие такой:

<span @(bind.text.FirstName) />
<button @(bind.click.SaveInfo) />
<a @(bind.click.js("function(p) { alert(p); }"))) />


Объект bind генерируется макросом, так что мы получаем интеллисенс и прочее.
Хорошо бы ещё каким-то образом устранить необходимость скобок для простых выражений, как это сделано в Рейзоре.

VD>Так же надо бы сделать более пушистые тесты, а то на примитивных не видна мощь.

Предлагайте тему, попробую реализовать. Мне самому интересно как это дело будет себя вести в боевых условиях.

VD>Что касается АСП-хостинга, то можно на РСДН-е захоститься.

Было бы отлично. Если это возможно, то напиши, пожалуйста, в личку как получить доступ.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: Сделал прототип Веб фреймворка для Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.08.12 11:42
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Если получиться с РСДН хостингом, то в субботу/воскресенье выложу. Если нет, постараюсь найти в ближайшие дни что-нибудь подешевле и зарегить там.


А что же там не получится? Конечно получится.

У тебя есть скайп Ziaw? Постучись к нему. У него есть нужны права и опыт. Если еще и время найдется, он тебе обязательно поможет в этом вопросе.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Сделал прототип Веб фреймворка для Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.08.12 11:50
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Для начала надо решить, как будут описываться представления, через XML макрос или каким-то другим способом.


Дык, решай. Это и есть дизайн. Проект твой, тебе и решать.

I>Если, через макрос, то его надо допиливать, так как у него есть ограничения.


Я, думаю, что однозначен надо делать через макрос. Вопрос только какой, макрос. Нужно чтобы представление было статически типизировано (чтобы ошибки выявлялись во время компиляции, и чтобы интелисенс был).

I>Дальше надо решить, каким образом описывать биндинги. У меня была идея на подобие такой:


I>
I><span @(bind.text.FirstName) />
I><button @(bind.click.SaveInfo) />
I><a @(bind.click.js("function(p) { alert(p); }"))) />
I>


Зачем здесь js?

I>Объект bind генерируется макросом, так что мы получаем интеллисенс и прочее.


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

I>Хорошо бы ещё каким-то образом устранить необходимость скобок для простых выражений, как это сделано в Рейзоре.


Думаю, с этим особых проблем не будет. Просто после @нужно скармливать код парсеру немерла и тот сам съест столько сколько сможет. Если что, доработаем напильником что надо.

VD>>Так же надо бы сделать более пушистые тесты, а то на примитивных не видна мощь.

I>Предлагайте тему, попробую реализовать. Мне самому интересно как это дело будет себя вести в боевых условиях.

Блоги для РСДН

А так, что-нить с серверным кодом. Чтобы было видно как вызываетется серверна сторона, как ей данные (типизированные) передаются, и как результат передается обратно.

VD>>Что касается АСП-хостинга, то можно на РСДН-е захоститься.

I>Было бы отлично. Если это возможно, то напиши, пожалуйста, в личку как получить доступ.

Ну, админский доступ раздавать всем я не могу. Он есть у Алекса Зимина (Ziaw). Свяжись с ним по скайпу. Думаю, он тебе поможет. Да и админ из него намного более проффесиональный, чем из меня.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 10.08.12 12:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, ionoy, Вы писали:


I>>Если, через макрос, то его надо допиливать, так как у него есть ограничения.

VD>Я, думаю, что однозначен надо делать через макрос. Вопрос только какой, макрос. Нужно чтобы представление было статически типизировано (чтобы ошибки выявлялись во время компиляции, и чтобы интелисенс был).
Видимо придётся брать XML за основу и дополнять его нужными фишками по мере необходимости.

I>>
I>><span @(bind.text.FirstName) />
I>><button @(bind.click.SaveInfo) />
I>><a @(bind.click.js("function(p) { alert(p); }"))) />
I>>

VD>Зачем здесь js?
Ассемблерная вставка А если серъёзно, то нужна возможность иногда откатиться в чистый ЖС. Посмотри, например, третий туториал. Там я теоретически мог бы сделать обёртку для Sammy, и всё описать на Немерле. Но это взяло бы много времени и с каждым изменением API мне пришлось бы допиливать свою обёртку. Короче, без подобных лазеек некоторые вещи будет очень сложно сделать.

VD>Его и без объекта можно получить. У представления должны быть реактивные пропертя к которым можно биндиться. Чем меньше будет мусора, тем лучше.

Покажи код, каким ты себе его представляешь.

VD>Блоги для РСДН

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

VD>А так, что-нить с серверным кодом. Чтобы было видно как вызываетется серверна сторона, как ей данные (типизированные) передаются, и как результат передается обратно.

Кстати, теоретически должны работать Computation Expressions, надо только написать обёртку для аякса.

VD>Ну, админский доступ раздавать всем я не могу. Он есть у Алекса Зимина (Ziaw). Свяжись с ним по скайпу. Думаю, он тебе поможет. Да и админ из него намного более проффесиональный, чем из меня.

ОК.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: Сделал прототип Веб фреймворка для Немерле
От: catbert  
Дата: 10.08.12 12:48
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Предлагайте тему, попробую реализовать. Мне самому интересно как это дело будет себя вести в боевых условиях.


Web-IDE для Немерле, хех.
http://nemerle.org/banners/?t=%20catbert%20
Re[4]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 10.08.12 13:04
Оценка:
Здравствуйте, catbert, Вы писали:

C>Web-IDE для Немерле, хех.

Был один неподъёмный проект, стало два? http://rsdn.org/forum/images/anvaka/shok.gif
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[5]: Сделал прототип Веб фреймворка для Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.08.12 13:25
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Видимо придётся брать XML за основу и дополнять его нужными фишками по мере необходимости.


Наверно.

I>Ассемблерная вставка А если серъёзно, то нужна возможность иногда откатиться в чистый ЖС. Посмотри, например, третий туториал. Там я теоретически мог бы сделать обёртку для Sammy, и всё описать на Немерле. Но это взяло бы много времени и с каждым изменением API мне пришлось бы допиливать свою обёртку. Короче, без подобных лазеек некоторые вещи будет очень сложно сделать.


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

VD>>Его и без объекта можно получить. У представления должны быть реактивные пропертя к которым можно биндиться. Чем меньше будет мусора, тем лучше.

I>Покажи код, каким ты себе его представляешь.

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

I>В блогах мало интерактива, там преимущества MVVM не так заметны.


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

I>Такой проект хорошо делать, когда фреймворк уже взрослый, чтобы показать как на нём строится архитектура приложения, работа с БД и прочее.


+1
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Сделал прототип Веб фреймворка для Немерле
От: dotneter  
Дата: 11.08.12 12:51
Оценка: +1
Хотелось бы видеть транслятор в виде отдельного самодостаточного проэкта, хотя бы в виде утилиты командной строки. Имхо веб-фреймворк для Немерла нужен полтора человеку, а вот альтернатива js может быть интересна и для далеких от .net
Rojac v0.1 / rev. 899
Talk is cheap. Show me the code.
Re[2]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 11.08.12 13:26
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Хотелось бы видеть транслятор в виде отдельного самодостаточного проэкта, хотя бы в виде утилиты командной строки. Имхо веб-фреймворк для Немерла нужен полтора человеку, а вот альтернатива js может быть интересна и для далеких от .net


Что подразумевается, под самодостаточным транслятором? Как ни крути, придётся ставить его в какие-то рамки. 1 в 1 приложение .NET невозможно в общем случае привести к ЖС, как минимум из-за того, что в джаваскрипте нет BCL.
Сейчас проект умеет брать заданный класс и строить по нему ЖС код. Но если встечается вызов незнакомого метода или ссылка на незнакомый класс, то он просто оставит всё как есть. Т.е. xs.Where(...).Select(...) волшебным образом не транслируется, придётся вручную реализовывать LINQ. Ну и так далее.

Короче, как ни старайся, штука в любом случае будет ограничена, поэтому надо определится с областью применения и реализовать только то, что нужно в этой области.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: Сделал прототип Веб фреймворка для Немерле
От: fddima  
Дата: 11.08.12 13:29
Оценка:
Здравствуйте, ionoy, Вы писали:

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

Ну я так понимаю сделать что-то вроде Script#.
Re[4]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 11.08.12 13:36
Оценка:
Здравствуйте, fddima, Вы писали:

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

F> Ну я так понимаю сделать что-то вроде Script#.

Что и требовалось доказать. Штука достаточно ограниченная и имеет только одну область применения.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: Сделал прототип Веб фреймворка для Немерле
От: dotneter  
Дата: 11.08.12 15:28
Оценка:
Здравствуйте, ionoy.
Вы писали:

В первом приближании BCL и не нужен. А нужна только возможность генерировать js из всех конструкций языка, псюс делать обертки над библиотеками js.
Rojac v0.1 / rev. 899
Talk is cheap. Show me the code.
Re[5]: Сделал прототип Веб фреймворка для Немерле
От: dotneter  
Дата: 11.08.12 15:28
Оценка:
Здравствуйте, ionoy.
Вы писали:

I> Здравствуйте, fddima, Вы писали:

I>>>Короче, как ни старайся, штука в любом случае будет ограничена, поэтому надо определится с областью применения и реализовать только то, что нужно в этой области.
F>> Ну я так понимаю сделать что-то вроде Script#.
I> Что и требовалось доказать. Штука достаточно ограниченная и имеет только одну область применения.
А какие тут еще могут быть области применения кроме как заменить js на что нибудь нормальное? И что значит ограниченная?
Rojac v0.1 / rev. 899
Talk is cheap. Show me the code.
Re[6]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 12.08.12 06:58
Оценка:
Здравствуйте, dotneter, Вы писали:

D>А какие тут еще могут быть области применения кроме как заменить js на что нибудь нормальное? И что значит ограниченная?


Я про то, что применять подобный транслятор можно только в некотором контексте, например, скрипт для страницы.

Собственно, ничего не мешает сделать утилиту, которая бы вызывалась из коммандной строки. Только надо определится, что мы хотим иметь на выходе, потому что универсального решения, имхо, не существует.
Конкретно сейчас мы получаем классы для работы с MVVM, но убрать обёртки ko.observable — это не проблема.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: Сделал прототип Веб фреймворка для Немерле
От: ionoy Эстония www.ammyui.com
Дата: 12.08.12 07:08
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Здравствуйте, ionoy.

D>Вы писали:

D>В первом приближании BCL и не нужен. А нужна только возможность генерировать js из всех конструкций языка, псюс делать обертки над библиотеками js.


Cейчас, по идее, должны обрабатываться практически любые конструкции языка, так как трансляция идёт из типизированного представления (TExpr), которое очень низкоуровневое и никаких сложных вещей не содержит.
Другое дело, что пока это мало тестировалось, поэтому наверняка некоторые вещи остались нереализованными. Также не сделаны такие вещи как наследование, дженерики и т.д. В контексте MVVM это не нужно, поэтому я пока даже не запаривался по этому поводу.

Насчёт обёрток надо подумать, каким образом лучше их оформить. Каждая обёртка должна быть привязана к конкретной версии библиотеки, иначе могут быть конфликты. То есть, нужно сохранять некий модуль класс немерле + файл JS.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[7]: Сделал прототип Веб фреймворка для Немерле
От: dotneter  
Дата: 12.08.12 08:59
Оценка: +1
Здравствуйте, ionoy.
Вы писали:
I> Я про то, что применять подобный транслятор можно только в некотором контексте, например, скрипт для страницы.
Это почему же? Подобный транслятор можно использовать где угодно, хватило бы фантации, хоть с note.js, хоть пиши мобильные приложения с phonegap или расширения для браузеров.

I> Собственно, ничего не мешает сделать утилиту, которая бы вызывалась из коммандной строки. Только надо определится, что мы хотим иметь на выходе, потому что универсального решения, имхо, не существует.

По моему универсальное решение это, беру файл test.n натравливаю на него n2js.exe получаю на выходи test.js добавлю зависимость от какой то общей либы nemerle.js и все, у меня вся логика test.n работает на джаваскрипте. Ну и желательно что бы не было какой либо низкоуровневой зависимости от стороних фреймворков, что бы они поставлялись в виде отдельных необязательных либах.
Rojac v0.1 / rev. 899
Talk is cheap. Show me the code.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.