Ruby 1.9.3p327(2012-11-10revision37606)
golf_prelude.c
Go to the documentation of this file.
00001 /* -*-c-*-
00002  THIS FILE WAS AUTOGENERATED BY tool/compile_prelude.rb. DO NOT EDIT.
00003 
00004  sources: golf_prelude
00005 */
00006 #include "ruby/ruby.h"
00007 #include "internal.h"
00008 #include "vm_core.h"
00009 
00010 
00011 static const char prelude_name0[] = "<internal:golf_prelude>";
00012 static const char prelude_code0[] =
00013 "class Object\n"
00014 "  @@golf_hash = {}\n"
00015 "  def method_missing m, *a, &b\n"
00016 "    t = @@golf_hash[ [m,self.class] ] ||= matching_methods(m)[0]\n"
00017 "    if t && b\n"
00018 "      __send__(t, *a) {|*args|\n"
00019 "        b.binding.eval(\"proc{|golf_matchdata| $~ = golf_matchdata }\").call($~) if $~\n"
00020 "        b.call(*args)\n"
00021 "      }\n"
00022 "    else\n"
00023 "      t ? __send__(t, *a, &b) : super\n"
00024 "    end\n"
00025 "  end\n"
00026 "\n"
00027 "  def matching_methods(s='', m=callable_methods)\n"
00028 "    r=/^#{s.to_s.gsub(/./){\"(.*?)\"+Regexp.escape($&)}}/\n"
00029 "    m.grep(r).sort_by do |i|\n"
00030 "      i.to_s.match(r).captures.map(&:size) << i\n"
00031 "    end\n"
00032 "  end\n"
00033 "\n"
00034 "  def self.const_missing c\n"
00035 "    t = @@golf_hash[ [c,self.class] ] ||= matching_methods(c,constants)[0]\n"
00036 "    t and return const_get(t)\n"
00037 "    raise NameError, \"uninitialized constant #{c}\", caller(1)\n"
00038 "  end\n"
00039 "\n"
00040 "  def shortest_abbreviation(s='', m=callable_methods)\n"
00041 "    s=s.to_s\n"
00042 "    our_case = (?A..?Z)===s[0]\n"
00043 "    if m.index(s.to_sym)\n"
00044 "      1.upto(s.size){|z|s.scan(/./).combination(z).map{|trial|\n"
00045 "        next unless ((?A..?Z)===trial[0]) == our_case\n"
00046 "        trial*=''\n"
00047 "        return trial if matching_methods(trial,m)[0].to_s==s\n"
00048 "      }}\n"
00049 "    else\n"
00050 "      nil\n"
00051 "    end\n"
00052 "  end\n"
00053 "\n"
00054 "  def callable_methods\n"
00055 "    self.class == Object ? methods + private_methods : methods\n"
00056 "  end\n"
00057 "\n"
00058 "  private\n"
00059 "\n"
00060 "  def h(a='H', b='w', c='!')\n"
00061 "    puts \"#{a}ello, #{b}orld#{c}\"\n"
00062 "  end\n"
00063 "\n"
00064 "  alias say puts\n"
00065 "\n"
00066 "  def do_while\n"
00067 "    0 while yield\n"
00068 "  end\n"
00069 "\n"
00070 "  def do_until\n"
00071 "    0 until yield\n"
00072 "  end\n"
00073 "end\n"
00074 "\n"
00075 "class Array\n"
00076 "  alias old_to_s to_s\n"
00077 "  alias to_s join\n"
00078 "end\n"
00079 "\n"
00080 "class FalseClass\n"
00081 "  alias old_to_s to_s\n"
00082 "  def to_s\n"
00083 "    \"\"\n"
00084 "  end\n"
00085 "end\n"
00086 "\n"
00087 "class Integer\n"
00088 "  alias each times\n"
00089 "  include Enumerable\n"
00090 "end\n"
00091 "\n"
00092 "class String\n"
00093 "  alias / split\n"
00094 "\n"
00095 "  def to_a\n"
00096 "    split('')\n"
00097 "  end\n"
00098 "\n"
00099 "  (Array.instance_methods-instance_methods-[:to_ary,:transpose,:flatten,:flatten!,:compact,:compact!,:assoc,:rassoc]).each{|meth|\n"
00100 "    eval\"\n"
00101 "    def #{meth}(*args, &block)\n"
00102 "      a=to_a\n"
00103 "      result = a.#{meth}(*args, &block)\n"
00104 "      replace(a.join)\n"
00105 "      if result.class == Array\n"
00106 "        Integer===result[0] ? result.pack('c*') : result.join\n"
00107 "      elsif result.class == Enumerator\n"
00108 "        result.map(&:join).to_enum\n"
00109 "      else\n"
00110 "        result\n"
00111 "      end\n"
00112 "    end\"\n"
00113 "  }\n"
00114 "end\n"
00115 "\n"
00116 "class Enumerator\n"
00117 "  alias old_to_s to_s\n"
00118 "  (Array.instance_methods-instance_methods-[:replace]+[:to_s]).each{|meth|\n"
00119 "    eval\"\n"
00120 "    def #{meth}(*args, &block)\n"
00121 "      to_a.#{meth}(*args, &block)\n"
00122 "    end\"\n"
00123 "  }\n"
00124 "  alias old_inspect inspect\n"
00125 "  alias inspect old_to_s\n"
00126 "end\n"
00127 "\n"
00128 "class Symbol\n"
00129 "  def call(*args, &block)\n"
00130 "    proc do |recv|\n"
00131 "      recv.__send__(self, *args, &block)\n"
00132 "    end\n"
00133 "  end\n"
00134 "end\n"
00135 ;
00136 
00137 #define PRELUDE_COUNT 0
00138 
00139 
00140 static void
00141 prelude_eval(VALUE code, VALUE name, VALUE line)
00142 {
00143     rb_iseq_eval(rb_iseq_compile_with_option(code, name, Qnil, line, Qtrue));
00144 }
00145 
00146 void
00147 Init_golf(void)
00148 {
00149     prelude_eval(
00150       rb_usascii_str_new(prelude_code0, sizeof(prelude_code0) - 1),
00151       rb_usascii_str_new(prelude_name0, sizeof(prelude_name0) - 1),
00152       INT2FIX(1));
00153 
00154 #if 0
00155     puts(prelude_code0);
00156 #endif
00157 }
00158