угу, ясно. только тоогда нужно учесть момент, что если мы были на первой странице и изменили параметры фильтрации, то наш основной dependentObservable по идее не будет вызван(номер страницы то не изменился), а значит перегрузку данных нужно и вспомогательном dependentObservable тоже делать. примерно так:
ko.dependentObservable(function () {
var data = ko.toJS(this.filterParams);
// Reset page number when any filtration parameters change
if (this.paging.PageNumber() == 1) {
// получаем данные через ajax
} else {
this.paging.PageNumber(1);
}
}, this);
Не раскрыта тема наследования. По крайней мере F# при коде насыщенном иерархиями наследования/коваринатностью ведет себя очень глухо (http://www.rsdn.ru/forum/decl/3789317.1.aspx)
В Nemerle ситуация лучше, вот о его алгоритме было бы интереснее почитать.
>> Устранение общих подвыражений
эта оптимизация(как и туча других) была бы гораздо полезнее, если бы в выражениях могли бы участвовать не только локальные переменные, но и вызовы функций. А для этого нужно уметь определять является ли функции чистыми. Либо дать возможность программисту давать хинт компилятору по этому поводу… ИМХО такая фича весьма и весьма помогла бы и в деле ускорения программ, и вообще в понятности кода.
Вроде же он этот SIP поддерживает и соответственно Skype просто убил более узкую разработку для Астерикса в пользу более общей, что в принципе логично.
А как же MS попинать???
Код, генерирующий разметку «традиционно» делают extension-ом к классу HtmlHelper/HtmlHelper<>. Так делают разработчики MVC, так же делают разработчики сторонних продуктов, см тот же телерик. @helper тоже генерирует разметку. По моему достаточно логичным было бы, чтобы @helper'ы тоже можно было бы сделать extension методами.
у хелперов есть некоторые недоделки
1) они не могут быть generic's — это просто недоделка.
2) они не могут быть extension методами (в частности — html-helper'ами)
если ты не постоянный посетитель сайта — то 100% НЕ стоит, про сапожника без сапог тут уже сказали — по и по отнашению к юнусу — это относится в первую очередь.
var test2 =
from x in SendRequest("hello")
let _ = WriteLine(x)
from y in SendRequest(x)
from z in SendRequest(x + y)
let __ = WriteLine("select from DB: " + y + z)
let t = selectSmthFromDB(y, z)
select WriteFile("tmp", t);
предполагается, что WriteLine/WriteFile возвращают какое нить значение, например Unit
private static IObservable Test(int v)
{
var sum =
from x in SendRequest(v)
from y in SendRequest(x*x)
select x + y;
return sum.Select(x =>
{
Console.WriteLine(x);
return new Unit(); // это нужно потому что void - это не тип.
});
}
ko.dependentObservable(function () {var data = ko.toJS(this.filterParams);
// Reset page number when any filtration parameters change
if (this.paging.PageNumber() == 1) {
// получаем данные через ajax
} else {
this.paging.PageNumber(1);
}
}, this);
В Nemerle ситуация лучше, вот о его алгоритме было бы интереснее почитать.
Вот подробная инструкция, как это делать: www.mikepfeiffer.net/2010/01/how-to-install-the-active-directory-module-for-windows-powershell/
эта оптимизация(как и туча других) была бы гораздо полезнее, если бы в выражениях могли бы участвовать не только локальные переменные, но и вызовы функций. А для этого нужно уметь определять является ли функции чистыми. Либо дать возможность программисту давать хинт компилятору по этому поводу… ИМХО такая фича весьма и весьма помогла бы и в деле ускорения программ, и вообще в понятности кода.
А как же MS попинать???
1) они не могут быть generic's — это просто недоделка.
2) они не могут быть extension методами (в частности — html-helper'ами)
var test2 = from x in SendRequest("hello") let _ = WriteLine(x) from y in SendRequest(x) from z in SendRequest(x + y) let __ = WriteLine("select from DB: " + y + z) let t = selectSmthFromDB(y, z) select WriteFile("tmp", t);предполагается, что WriteLine/WriteFile возвращают какое нить значение, например Unit
private static IObservable Test(int v){
var sum =
from x in SendRequest(v)
from y in SendRequest(x*x)
select x + y;
return sum.Select(x =>
{
Console.WriteLine(x);
return new Unit(); // это нужно потому что void - это не тип.
});
}
let second (x, y) = y // разбор кортежа
let getValueFromOption (Some value) = value // разбор discriminated union'а
с рекурсивными подзапросами — и без расширений катит.