ruby-changes:51715
From: k0kubun <ko1@a...>
Date: Tue, 10 Jul 2018 22:05:45 +0900 (JST)
Subject: [ruby-changes:51715] k0kubun:r63926 (trunk): Revert "benchmark/*.yml: convert from benchmark/bm_*.rb"
k0kubun 2018-07-10 22:05:29 +0900 (Tue, 10 Jul 2018) New Revision: 63926 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63926 Log: Revert "benchmark/*.yml: convert from benchmark/bm_*.rb" This reverts r63900. Having single-execution benchmark as a normal Ruby script is preferred by ko1. I'm not a big fan of having inconsistent benchmark formats, but I can understand some benefits of it. common.mk: remove obsolsted benchmark-each PHONY declaration, support running Ruby scripts added by this commit. README.md: follow ARGS change Added files: trunk/benchmark/bm_app_answer.rb trunk/benchmark/bm_app_aobench.rb trunk/benchmark/bm_app_erb.rb trunk/benchmark/bm_app_factorial.rb trunk/benchmark/bm_app_fib.rb trunk/benchmark/bm_app_lc_fizzbuzz.rb trunk/benchmark/bm_app_mandelbrot.rb trunk/benchmark/bm_app_pentomino.rb trunk/benchmark/bm_app_raise.rb trunk/benchmark/bm_app_strconcat.rb trunk/benchmark/bm_app_tak.rb trunk/benchmark/bm_app_tarai.rb trunk/benchmark/bm_app_uri.rb trunk/benchmark/bm_array_sample_100k_10.rb trunk/benchmark/bm_array_sample_100k_11.rb trunk/benchmark/bm_array_sample_100k__100.rb trunk/benchmark/bm_array_sample_100k__1k.rb trunk/benchmark/bm_array_sample_100k__6k.rb trunk/benchmark/bm_array_sample_100k___10k.rb trunk/benchmark/bm_array_sample_100k___50k.rb trunk/benchmark/bm_array_shift.rb trunk/benchmark/bm_array_small_and.rb trunk/benchmark/bm_array_small_diff.rb trunk/benchmark/bm_array_small_or.rb trunk/benchmark/bm_array_sort_block.rb trunk/benchmark/bm_array_sort_float.rb trunk/benchmark/bm_array_values_at_int.rb trunk/benchmark/bm_array_values_at_range.rb trunk/benchmark/bm_bighash.rb trunk/benchmark/bm_dir_empty_p.rb trunk/benchmark/bm_erb_render.rb trunk/benchmark/bm_file_chmod.rb trunk/benchmark/bm_file_rename.rb trunk/benchmark/bm_hash_aref_dsym.rb trunk/benchmark/bm_hash_aref_dsym_long.rb trunk/benchmark/bm_hash_aref_fix.rb trunk/benchmark/bm_hash_aref_flo.rb trunk/benchmark/bm_hash_aref_miss.rb trunk/benchmark/bm_hash_aref_str.rb trunk/benchmark/bm_hash_aref_sym.rb trunk/benchmark/bm_hash_aref_sym_long.rb trunk/benchmark/bm_hash_flatten.rb trunk/benchmark/bm_hash_ident_flo.rb trunk/benchmark/bm_hash_ident_num.rb trunk/benchmark/bm_hash_ident_obj.rb trunk/benchmark/bm_hash_ident_str.rb trunk/benchmark/bm_hash_ident_sym.rb trunk/benchmark/bm_hash_keys.rb trunk/benchmark/bm_hash_long.rb trunk/benchmark/bm_hash_shift.rb trunk/benchmark/bm_hash_shift_u16.rb trunk/benchmark/bm_hash_shift_u24.rb trunk/benchmark/bm_hash_shift_u32.rb trunk/benchmark/bm_hash_small2.rb trunk/benchmark/bm_hash_small4.rb trunk/benchmark/bm_hash_small8.rb trunk/benchmark/bm_hash_to_proc.rb trunk/benchmark/bm_hash_values.rb trunk/benchmark/bm_int_quo.rb trunk/benchmark/bm_io_copy_stream_write.rb trunk/benchmark/bm_io_copy_stream_write_socket.rb trunk/benchmark/bm_io_file_create.rb trunk/benchmark/bm_io_file_read.rb trunk/benchmark/bm_io_file_write.rb trunk/benchmark/bm_io_nonblock_noex.rb trunk/benchmark/bm_io_nonblock_noex2.rb trunk/benchmark/bm_io_pipe_rw.rb trunk/benchmark/bm_io_select.rb trunk/benchmark/bm_io_select2.rb trunk/benchmark/bm_io_select3.rb trunk/benchmark/bm_loop_for.rb trunk/benchmark/bm_loop_generator.rb trunk/benchmark/bm_loop_times.rb trunk/benchmark/bm_loop_whileloop.rb trunk/benchmark/bm_loop_whileloop2.rb trunk/benchmark/bm_marshal_dump_flo.rb trunk/benchmark/bm_marshal_dump_load_geniv.rb trunk/benchmark/bm_marshal_dump_load_time.rb trunk/benchmark/bm_securerandom.rb trunk/benchmark/bm_so_ackermann.rb trunk/benchmark/bm_so_array.rb trunk/benchmark/bm_so_binary_trees.rb trunk/benchmark/bm_so_concatenate.rb trunk/benchmark/bm_so_exception.rb trunk/benchmark/bm_so_fannkuch.rb trunk/benchmark/bm_so_fasta.rb trunk/benchmark/bm_so_lists.rb trunk/benchmark/bm_so_mandelbrot.rb trunk/benchmark/bm_so_matrix.rb trunk/benchmark/bm_so_meteor_contest.rb trunk/benchmark/bm_so_nbody.rb trunk/benchmark/bm_so_nested_loop.rb trunk/benchmark/bm_so_nsieve.rb trunk/benchmark/bm_so_nsieve_bits.rb trunk/benchmark/bm_so_object.rb trunk/benchmark/bm_so_partial_sums.rb trunk/benchmark/bm_so_pidigits.rb trunk/benchmark/bm_so_random.rb trunk/benchmark/bm_so_sieve.rb trunk/benchmark/bm_so_spectralnorm.rb trunk/benchmark/bm_string_index.rb trunk/benchmark/bm_string_scan_re.rb trunk/benchmark/bm_string_scan_str.rb trunk/benchmark/bm_time_subsec.rb trunk/benchmark/bm_vm3_backtrace.rb trunk/benchmark/bm_vm3_clearmethodcache.rb trunk/benchmark/bm_vm3_gc.rb trunk/benchmark/bm_vm3_gc_old_full.rb trunk/benchmark/bm_vm3_gc_old_immediate.rb trunk/benchmark/bm_vm3_gc_old_lazy.rb trunk/benchmark/bm_vm_symbol_block_pass.rb trunk/benchmark/bm_vm_thread_alive_check1.rb trunk/benchmark/bm_vm_thread_close.rb trunk/benchmark/bm_vm_thread_condvar1.rb trunk/benchmark/bm_vm_thread_condvar2.rb trunk/benchmark/bm_vm_thread_create_join.rb trunk/benchmark/bm_vm_thread_mutex1.rb trunk/benchmark/bm_vm_thread_mutex2.rb trunk/benchmark/bm_vm_thread_mutex3.rb trunk/benchmark/bm_vm_thread_pass.rb trunk/benchmark/bm_vm_thread_pass_flood.rb trunk/benchmark/bm_vm_thread_pipe.rb trunk/benchmark/bm_vm_thread_queue.rb trunk/benchmark/bm_vm_thread_sized_queue.rb trunk/benchmark/bm_vm_thread_sized_queue2.rb trunk/benchmark/bm_vm_thread_sized_queue3.rb trunk/benchmark/bm_vm_thread_sized_queue4.rb Removed files: trunk/benchmark/app_answer.yml trunk/benchmark/app_aobench.yml trunk/benchmark/app_erb.yml trunk/benchmark/app_factorial.yml trunk/benchmark/app_fib.yml trunk/benchmark/app_lc_fizzbuzz.yml trunk/benchmark/app_mandelbrot.yml trunk/benchmark/app_pentomino.yml trunk/benchmark/app_raise.yml trunk/benchmark/app_strconcat.yml trunk/benchmark/app_tak.yml trunk/benchmark/app_tarai.yml trunk/benchmark/app_uri.yml trunk/benchmark/array_sample_100k_10.yml trunk/benchmark/array_sample_100k_11.yml trunk/benchmark/array_sample_100k__100.yml trunk/benchmark/array_sample_100k__1k.yml trunk/benchmark/array_sample_100k__6k.yml trunk/benchmark/array_sample_100k___10k.yml trunk/benchmark/array_sample_100k___50k.yml trunk/benchmark/array_shift.yml trunk/benchmark/array_small_and.yml trunk/benchmark/array_small_diff.yml trunk/benchmark/array_small_or.yml trunk/benchmark/array_sort_block.yml trunk/benchmark/array_sort_float.yml trunk/benchmark/array_values_at_int.yml trunk/benchmark/array_values_at_range.yml trunk/benchmark/bighash.yml trunk/benchmark/dir_empty_p.yml trunk/benchmark/erb_render.yml trunk/benchmark/file_chmod.yml trunk/benchmark/file_rename.yml trunk/benchmark/hash_aref_dsym.yml trunk/benchmark/hash_aref_dsym_long.yml trunk/benchmark/hash_aref_fix.yml trunk/benchmark/hash_aref_flo.yml trunk/benchmark/hash_aref_miss.yml trunk/benchmark/hash_aref_str.yml trunk/benchmark/hash_aref_sym.yml trunk/benchmark/hash_aref_sym_long.yml trunk/benchmark/hash_flatten.yml trunk/benchmark/hash_ident_flo.yml trunk/benchmark/hash_ident_num.yml trunk/benchmark/hash_ident_obj.yml trunk/benchmark/hash_ident_str.yml trunk/benchmark/hash_ident_sym.yml trunk/benchmark/hash_keys.yml trunk/benchmark/hash_long.yml trunk/benchmark/hash_shift.yml trunk/benchmark/hash_shift_u16.yml trunk/benchmark/hash_shift_u24.yml trunk/benchmark/hash_shift_u32.yml trunk/benchmark/hash_small2.yml trunk/benchmark/hash_small4.yml trunk/benchmark/hash_small8.yml trunk/benchmark/hash_to_proc.yml trunk/benchmark/hash_values.yml trunk/benchmark/int_quo.yml trunk/benchmark/io_copy_stream_write.yml trunk/benchmark/io_copy_stream_write_socket.yml trunk/benchmark/io_file_create.yml trunk/benchmark/io_file_read.yml trunk/benchmark/io_file_write.yml trunk/benchmark/io_nonblock_noex.yml trunk/benchmark/io_nonblock_noex2.yml trunk/benchmark/io_pipe_rw.yml trunk/benchmark/io_select.yml trunk/benchmark/io_select2.yml trunk/benchmark/io_select3.yml trunk/benchmark/loop_for.yml trunk/benchmark/loop_generator.yml trunk/benchmark/loop_times.yml trunk/benchmark/loop_whileloop.yml trunk/benchmark/loop_whileloop2.yml trunk/benchmark/marshal_dump_flo.yml trunk/benchmark/marshal_dump_load_geniv.yml trunk/benchmark/marshal_dump_load_time.yml trunk/benchmark/securerandom.yml trunk/benchmark/so_ackermann.yml trunk/benchmark/so_array.yml trunk/benchmark/so_binary_trees.yml trunk/benchmark/so_concatenate.yml trunk/benchmark/so_exception.yml trunk/benchmark/so_fannkuch.yml trunk/benchmark/so_fasta.yml trunk/benchmark/so_lists.yml trunk/benchmark/so_mandelbrot.yml trunk/benchmark/so_matrix.yml trunk/benchmark/so_meteor_contest.yml trunk/benchmark/so_nbody.yml trunk/benchmark/so_nested_loop.yml trunk/benchmark/so_nsieve.yml trunk/benchmark/so_nsieve_bits.yml trunk/benchmark/so_object.yml trunk/benchmark/so_partial_sums.yml trunk/benchmark/so_pidigits.yml trunk/benchmark/so_random.yml trunk/benchmark/so_sieve.yml trunk/benchmark/so_spectralnorm.yml trunk/benchmark/string_index.yml trunk/benchmark/string_scan_re.yml trunk/benchmark/string_scan_str.yml trunk/benchmark/time_subsec.yml trunk/benchmark/vm3_backtrace.yml trunk/benchmark/vm3_clearmethodcache.yml trunk/benchmark/vm3_gc.yml trunk/benchmark/vm3_gc_old_full.yml trunk/benchmark/vm3_gc_old_immediate.yml trunk/benchmark/vm3_gc_old_lazy.yml trunk/benchmark/vm_symbol_block_pass.yml trunk/benchmark/vm_thread_alive_check1.yml trunk/benchmark/vm_thread_close.yml trunk/benchmark/vm_thread_condvar1.yml trunk/benchmark/vm_thread_condvar2.yml trunk/benchmark/vm_thread_create_join.yml trunk/benchmark/vm_thread_mutex1.yml trunk/benchmark/vm_thread_mutex2.yml trunk/benchmark/vm_thread_mutex3.yml trunk/benchmark/vm_thread_pass.yml trunk/benchmark/vm_thread_pass_flood.yml trunk/benchmark/vm_thread_pipe.yml trunk/benchmark/vm_thread_queue.yml trunk/benchmark/vm_thread_sized_queue.yml trunk/benchmark/vm_thread_sized_queue2.yml trunk/benchmark/vm_thread_sized_queue3.yml trunk/benchmark/vm_thread_sized_queue4.yml Modified files: trunk/benchmark/README.md trunk/common.mk Index: benchmark/vm_thread_sized_queue3.yml =================================================================== --- benchmark/vm_thread_sized_queue3.yml (revision 63925) +++ benchmark/vm_thread_sized_queue3.yml (nonexistent) @@ -1,25 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/vm_thread_sized_queue3.yml#L0 -benchmark: - vm_thread_sized_queue3: | - require 'thread' - # many producers, one consumer - n = 1_000_000 - m = 10 - q = Thread::SizedQueue.new(100) - consumer = Thread.new do - while q.pop - # consuming - end - end - - producers = m.times.map do - Thread.new do - while n > 0 - q.push true - n -= 1 - end - end - end - producers.each(&:join) - q.push nil - consumer.join -loop_count: 1 Index: benchmark/hash_ident_str.yml =================================================================== --- benchmark/hash_ident_str.yml (revision 63925) +++ benchmark/hash_ident_str.yml (nonexistent) @@ -1,7 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/hash_ident_str.yml#L0 -benchmark: - hash_ident_str: | - h = {}.compare_by_identity - strs = ('a'..'z').to_a - strs.each { |s| h[s] = s } - 200_000.times { strs.each { |s| h[s] } } -loop_count: 1 Index: benchmark/app_strconcat.yml =================================================================== --- benchmark/app_strconcat.yml (revision 63925) +++ benchmark/app_strconcat.yml (nonexistent) @@ -1,8 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/app_strconcat.yml#L0 -benchmark: - app_strconcat: | - i = 0 - while i<2_000_000 - "#{1+1} #{1+1} #{1+1}" - i += 1 - end -loop_count: 1 Index: benchmark/hash_values.yml =================================================================== --- benchmark/hash_values.yml (revision 63925) +++ benchmark/hash_values.yml (nonexistent) @@ -1,12 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/hash_values.yml#L0 -benchmark: - hash_values: | - h = {} - - 10000.times do |i| - h[i] = nil - end - - 5000.times do - h.values - end -loop_count: 1 Index: benchmark/file_rename.yml =================================================================== --- benchmark/file_rename.yml (revision 63925) +++ benchmark/file_rename.yml (nonexistent) @@ -1,15 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/file_rename.yml#L0 -prelude: | - # rename file -benchmark: - file_rename: | - require 'tempfile' - - max = 100_000 - tmp = [ Tempfile.new('rename-a'), Tempfile.new('rename-b') ] - a, b = tmp.map { |x| x.path } - tmp.each { |t| t.close } # Windows can't rename files without closing them - max.times do - File.rename(a, b) - File.rename(b, a) - end -loop_count: 1 Index: benchmark/vm_thread_alive_check1.yml =================================================================== --- benchmark/vm_thread_alive_check1.yml (revision 63925) +++ benchmark/vm_thread_alive_check1.yml (nonexistent) @@ -1,9 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/vm_thread_alive_check1.yml#L0 -benchmark: - vm_thread_alive_check1: | - 5_000.times{ - t = Thread.new{} - while t.alive? - Thread.pass - end - } -loop_count: 1 Index: benchmark/vm_symbol_block_pass.yml =================================================================== --- benchmark/vm_symbol_block_pass.yml (revision 63925) +++ benchmark/vm_symbol_block_pass.yml (nonexistent) @@ -1,16 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/vm_symbol_block_pass.yml#L0 -benchmark: - vm_symbol_block_pass: | - class C - 1000.times {|i| - eval("def i#{i};end") - } - end - - c = C.new - m = C.instance_methods(false) - 5_000.times do - m.each do |n| - c.tap(&n) - end - end -loop_count: 1 Index: benchmark/so_spectralnorm.yml =================================================================== --- benchmark/so_spectralnorm.yml (revision 63925) +++ benchmark/so_spectralnorm.yml (nonexistent) @@ -1,54 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/so_spectralnorm.yml#L0 -prelude: | - # The Computer Language Shootout - # http://shootout.alioth.debian.org/ - # Contributed by Sokolov Yura -benchmark: - so_spectralnorm: | - - def eval_A(i,j) - return 1.0/((i+j)*(i+j+1)/2+i+1) - end - - def eval_A_times_u(u) - v, i = nil, nil - (0..u.length-1).collect { |i| - v = 0 - for j in 0..u.length-1 - v += eval_A(i,j)*u[j] - end - v - } - end - - def eval_At_times_u(u) - v, i = nil, nil - (0..u.length-1).collect{|i| - v = 0 - for j in 0..u.length-1 - v += eval_A(j,i)*u[j] - end - v - } - end - - def eval_AtA_times_u(u) - return eval_At_times_u(eval_A_times_u(u)) - end - - n = 500 # ARGV[0].to_i - - u=[1]*n - for i in 1..10 - v=eval_AtA_times_u(u) - u=eval_AtA_times_u(v) - end - vBv=0 - vv=0 - for i in 0..n-1 - vBv += u[i]*v[i] - vv += v[i]*v[i] - end - - str = "%0.9f" % (Math.sqrt(vBv/vv)), "\n" - # print str -loop_count: 1 Index: benchmark/so_nsieve_bits.yml =================================================================== --- benchmark/so_nsieve_bits.yml (revision 63925) +++ benchmark/so_nsieve_bits.yml (nonexistent) @@ -1,46 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/so_nsieve_bits.yml#L0 -prelude: | - #!/usr/bin/ruby - #coding: us-ascii -benchmark: - so_nsieve_bits: | - # - # The Great Computer Language Shootout - # http://shootout.alioth.debian.org/ - # - # nsieve-bits in Ruby - # Contributed by Glenn Parker, March 2005 - - CharExponent = 3 - BitsPerChar = 1 << CharExponent - LowMask = BitsPerChar - 1 - - def sieve(m) - items = "\xFF" * ((m / BitsPerChar) + 1) - masks = "" - BitsPerChar.times do |b| - masks << (1 << b).chr - end - - count = 0 - pmax = m - 1 - 2.step(pmax, 1) do |p| - if items[p >> CharExponent][p & LowMask] == 1 - count += 1 - p.step(pmax, p) do |mult| - a = mult >> CharExponent - b = mult & LowMask - items[a] -= masks[b] if items[a][b] != 0 - end - end - end - count - end - - n = 9 # (ARGV[0] || 2).to_i - n.step(n - 2, -1) do |exponent| - break if exponent < 0 - m = 2 ** exponent * 10_000 - count = sieve(m) - printf "Primes up to %8d %8d\n", m, count - end -loop_count: 1 Index: benchmark/array_sample_100k_11.yml =================================================================== --- benchmark/array_sample_100k_11.yml (revision 63925) +++ benchmark/array_sample_100k_11.yml (nonexistent) @@ -1,5 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/array_sample_100k_11.yml#L0 -benchmark: - array_sample_100k_11: | - arr = [*0...100000] - 10_000.times {arr.sample 11} -loop_count: 1 Index: benchmark/app_lc_fizzbuzz.yml =================================================================== --- benchmark/app_lc_fizzbuzz.yml (revision 63925) +++ benchmark/app_lc_fizzbuzz.yml (nonexistent) @@ -1,55 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/app_lc_fizzbuzz.yml#L0 -benchmark: - app_lc_fizzbuzz: | - # - # FizzBuzz program using only lambda calculus - # - # This program is quoted from - # "Understanding Computation" by Tom Stuart - # http://computationbook.com/ - # - # You can understand why this program works fine by reading this book. - # - - solution = -> k { -> f { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[-> x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][k][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> l { -> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[l][f[x]] } }] } }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[m][n]][-> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[f[-> n { -> p { -> x { p[n[p][x]] } } }[m]][n]][m][x] }][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]] } } }][-> p { -> x { p[x] } }][-> p { -> x { p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] } }]][-> n { -> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[ -> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }] [-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[x]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][ l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][- > p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> n { -> l { -> x { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[-> x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][l][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][x]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }] } }[-> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n] (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/