Здравствуйте, z00n, Вы писали:
Z>В Scheme, CL и даже Javascript карринг, разумеется, есть:
Z>Z>;; Scheme
Z>(define curry
Z> (lambda (f)
Z> (lambda (x)
Z> (lambda (y) (f x y)))))
Z>(define positive? ((curry <) 0))
Z>(define add-42 ((curry +) 42))
Z>
Такой "карринг" конечно есть и в Nemerle. Можно практически переписать вышеприведенный код один-в-один, но так как язык статически типизированный он будет работать только с функциями одного типа. Но можно использовать дженерики:
def curry[X,Y,R](f : X * Y -> R)
{
fun(x : X) { fun(y : Y) { f(x, y) } }
}
def add_42 = add(_ + _)(42);
def positive = curry(_ < _)(0);
А речь разумеется о синтаксическом сахаре для currying, который есть в ML и Haskell. Там можно написать нечто вроде
add42 = (+) 42. В Nemerle так нельзя, но можно так:
def add42 = 42 + _; // или _ + 42
def positive = 0 < _; // или _ > 0
На мой взгляд это ничем не хуже, а в определенных случаях даже лучше. Но название и суть несколько другие.
Z>Странно, но я прочитав "Grokking Nemerle" — так и не смог грокнуть насколько функции first-class, а насколько это все макросы Просветите меня.
Макросы здесь вообще не причем, а функции естественно first-class. Странный вопрос вообще...