def fib
a, b = 0, 1
loop do
yield a
a, b = b, a + b
end
end
fib . take_while {|x| x < 10}
такое уже не проходит.
Приходится немножко извращаться:
def fib
a, b = 0, 1
res = []
loop do
return res unless yield a
res << a
a, b = b, a + b
end
end
fib {|x| x < 10} # => [0, 1, 1, 2, 3, 5, 8]
Неплохо, но хочется-то предыдущий вариант! :)
Конечно, можно использовать Fiber, дополнив его методом take_while:
class Fiber
def take_while
res = []
loop do
val = self.resume
return res unless yield val
res << val
end
end
end
def fib
Fiber.new do
a, b = 0, 1
loop do
Fiber.yield a
a, b = b, a + b
end
end
end
fib . take_while {|x| x < 10} # => [0, 1, 1, 2, 3, 5, 8]
Работает. Но что же это получается: каждую функцию, от которой требуется свойство бесконечного генератора, внутри оборачивать в Fiber? Noway! Я слишом ленив для такого.
И тут мой взор упал на декораторы питона: «Хорошая штука» — подумал я, сейчас возьму такую же в любимом руби и… внезапно в Ruby такого не оказалось.
«Вещь то полезная… надо реализовать!» — подумал небезызвестный Yehuda Katz и забацал поддержку декораторов для руби в 80 строчек кода.
Пишем свой декоратор:
class Generator < Decorator
def call(this, *args)
Fiber.new { loop { @method.bind(this).call(*args) { |x| Fiber.yield x } } }
end
end
и класс для бесконечного генератора чисел фибоначчи с «чистым» методом fib:
class FibGen
extend MethodDecorators
Generator()
def fib
a, b = 0, 1
loop do
yield a
a, b = b, a + b
end
end
end
FibGen.new.fib . take_while {|x| x < 10} # => [0, 1, 1, 2, 3, 5, 8]
FibGen.new.fib . take(7) . map {|x| x * 2} . reduce(:+) # => 40
Отлично! :)
Итого: добрая половина дня убита занятием вот этой замечательной фигней ^.^
def foo n
numbers = [1]
while numbers.last <= n
puts (numbers.last.even? ? numbers.reverse : numbers).join '-'
numbers << numbers.last.next
end
end
foo 6
Насколько я понимаю, там всё же не wasm, а asm.js
Как и было указано выше данная запись является укороченным вариантом более формальной записи:
VMS = μX: {coin, chock}•(coin → (choc → VMS))
Поправьте, пожайлуста, на:
VMS = μX: {coin, chock}•(coin → (choc → X))
Иначе сильно сбивает с толку :)
Еще, как мнимум, 5 частей ")
В нем проблемы с пайпами как таковой нет:
записывается как:
Но с генераторами вида:
такое уже не проходит.
Приходится немножко извращаться:
Неплохо, но хочется-то предыдущий вариант! :)
Конечно, можно использовать Fiber, дополнив его методом take_while:
Работает. Но что же это получается: каждую функцию, от которой требуется свойство бесконечного генератора, внутри оборачивать в Fiber? Noway! Я слишом ленив для такого.
И тут мой взор упал на декораторы питона: «Хорошая штука» — подумал я, сейчас возьму такую же в любимом руби и… внезапно в Ruby такого не оказалось.
«Вещь то полезная… надо реализовать!» — подумал небезызвестный Yehuda Katz и забацал поддержку декораторов для руби в 80 строчек кода.
Пишем свой декоратор:
и класс для бесконечного генератора чисел фибоначчи с «чистым» методом fib:
Отлично! :)
Итого: добрая половина дня убита занятием вот этой замечательной фигней ^.^
Извините, на говнокод меня уже не хватило (
А то так он с этим ноутом неловко смотрится…
А как же @private, @protected, @public?