def dotimes(n, func):
for x in xrange(n):
func()
def puts(str):
print str
dotimes(5, lambda: puts("Yes Ruby is better than Python."))
С print lambda не работает...
Кстати на этом примере можно увидет недальновидность Гвидо в отношение к lambda, еслиб можно было писать много строчные лямбды это решение ничуть бы не уступало рубивскому. А так писать отдельно фукнции ужос.
write=sys.stdout.write
def times(n):
def repeat(f,*args,**kwargs):
for i in range(n):
f(*args,**kwargs)
return repeat
times(15)(write,'Are you sure?\n')
А ещё, вроде, обещали print функцией сделать.
> Представляешь, как "функциональщики" мучаются - у них там вообще _всё_ - функция. УЖАС:-}
Зато, у них lambda нормальная.
> а в чём проблема? Трудно придумывать имена?
В том числе. А прежде всего --- распыляется код. С лямбдой у тебя в одном месте нормально описано что и как делается, а без нее --- часть действия (функция) описана где-то в другом месте (в случае питона часто можно поближе перетащить).
>Представляешь, как "функциональщики" мучаются - у них там вообще _всё_ - функция. УЖАС:-}
они не мучаються -- у них лямбда нормальная.
> Если серьёзно - а в чём проблема? Трудно придумывать имена?
В том что это вообщем-то совсем не логично, я хочу передать некий код в нутри данной функции высокого уровня в данном контексте, и придумывать какие-то другие функции мне совсем не надо.
>1) Нафига цикл, когда тебе нужно просто выполнить н-ое число раз какое-то действие? >2) Ты создаёшь переменную i, итератор, когда она абсолютно НЕ нужна.
А ты думаешь в руби это делаеться по другому, просто абстрактнее.
>3) Такой код намного хуже читаеться.
А вот +1 именно абстракция здесь главное и весьма существенное отличие. в котором руби выигрывает.
Называй все одноразовые ф-ии "__" - и эта проблема исчезнет. Пока их в одном выражениии меньше 2х нужно - в противном случае скорее всего стоит переходить на "настоящие" языки:-)
>лямбдой у тебя в одном месте нормально описано что и как делается
Мне, почему-то, больше нравится хаскелевский стиль с "where" - когда всякие мелкие сущности определены позже, и не лезут в глаза при чтении. Конечно простые вещи типа (a . b) уносить не стоит, но в питоне полезные вещи настолько понятно не пишутся - тут сразу появится много неочевидно-стоящих "()", которые сразу понадобится считать, а тут уже лучше имя придумать.
>>1) Нафига цикл, когда тебе нужно просто выполнить н-ое число раз какое-то действие? >2) Ты создаёшь переменную i, итератор, когда она абсолютно НЕ нужна.
> А ты думаешь в руби это делаеться по другому, просто абстрактнее.
К слову, как раз таки значение счетчика переменной в times было бы неплохо.
Точнее в ФЯ с ленивой семантикой вычислений.
import System.Environment
main = do args <- getArgs
case args of
[] -> a
_ -> b
where a = putStrLn "No args"
b = putStrLn "Some args"