summaryrefslogtreecommitdiff
path: root/jni/ruby/golf_prelude.c
blob: efc7c8f2fbdb0060c2f4c63cb57060ad7a54a4ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* -*-c-*-
 THIS FILE WAS AUTOGENERATED BY template/prelude.c.tmpl. DO NOT EDIT.

 sources: golf_prelude
*/
#include "ruby/ruby.h"
#include "internal.h"
#include "vm_core.h"


static const char prelude_name0[] = "<internal:golf_prelude>";
static const char prelude_code0[] =
"class Object\n"
"  @@golf_hash = {}\n"
"\n"
"  def method_missing m, *a, &b\n"
"    t = @@golf_hash[ [m, self.class] ] ||= matching_methods(m)[0]\n"
"    if t && b\n"
"      __send__(t, *a) {|*args|\n"
"        b.binding.eval(\"proc{|golf_matchdata| $~ = golf_matchdata }\").call($~) if $~\n"
"        b.call(*args)\n"
"      }\n"
"    else\n"
"      t ? __send__(t, *a, &b) : super\n"
"    end\n"
"  end\n"
"\n"
"  def matching_methods(s = '', m = callable_methods)\n"
"    r = /^#{s.to_s.gsub(/./){\"(.*?)\" + Regexp.escape($&)}}/\n"
"    m.grep(r).sort_by do |i|\n"
"      i.to_s.match(r).captures.map(&:size) << i\n"
"    end\n"
"  end\n"
"\n"
"  def self.const_missing c\n"
"    t = @@golf_hash[ [c,self.class] ] ||= matching_methods(c, constants)[0]\n"
"    t and return const_get(t)\n"
"    raise NameError, \"uninitialized constant #{c}\", caller(1)\n"
"  end\n"
"\n"
"  def shortest_abbreviation(s = '', m = callable_methods)\n"
"    s = s.to_s\n"
"    our_case = (?A..?Z) === s[0]\n"
"    if m.index(s.to_sym)\n"
"      1.upto(s.size){|z| s.scan(/./).combination(z).map{|trial|\n"
"        next unless ((?A..?Z) === trial[0]) == our_case\n"
"        trial *= ''\n"
"        return trial if matching_methods(trial, m)[0].to_s == s\n"
"      }}\n"
"    else\n"
"      nil\n"
"    end\n"
"  end\n"
"\n"
"  def callable_methods\n"
"    self.class == Object ? methods + private_methods : methods\n"
"  end\n"
"\n"
"  private\n"
"\n"
"  def h(a = 'H', b = 'w', c = '!')\n"
"    puts \"#{a}ello, #{b}orld#{c}\"\n"
"  end\n"
"\n"
"  alias say puts\n"
"\n"
"  def do_while\n"
"    0 while yield\n"
"  end\n"
"\n"
"  def do_until\n"
"    0 until yield\n"
"  end\n"
"end\n"
"\n"
"class Array\n"
"  alias old_to_s to_s\n"
"  alias to_s join\n"
"end\n"
"\n"
"class FalseClass\n"
"  alias old_to_s to_s\n"
"  def to_s\n"
"    \"\"\n"
"  end\n"
"end\n"
"\n"
"class Integer\n"
"  alias each times\n"
"  include Enumerable\n"
"end\n"
"\n"
"class String\n"
"  alias / split\n"
"\n"
"  def to_a\n"
"    split('')\n"
"  end\n"
"\n"
"  (Array.instance_methods - instance_methods - [:to_ary, :transpose, :flatten, :flatten!, :compact, :compact!, :assoc, :rassoc]).each{|meth|\n"
"    eval \"\n"
"    def #{meth}(*args, &block)\n"
"      a = to_a\n"
"      result = a.#{meth}(*args, &block)\n"
"      replace(a.join)\n"
"      if result.class == Array\n"
"        Integer === result[0] ? result.pack('c*') : result.join\n"
"      elsif result.class == Enumerator\n"
"        result.map(&:join).to_enum\n"
"      else\n"
"        result\n"
"      end\n"
"    end\"\n"
"  }\n"
"end\n"
"\n"
"class Enumerator\n"
"  alias old_to_s to_s\n"
"  (Array.instance_methods - instance_methods - [:replace] + [:to_s]).each{|meth|\n"
"    eval \"\n"
"    def #{meth}(*args, &block)\n"
"      to_a.#{meth}(*args, &block)\n"
"    end\"\n"
"  }\n"
"  alias old_inspect inspect\n"
"  alias inspect old_to_s\n"
"end\n"
"\n"
"class Symbol\n"
"  def call(*args, &block)\n"
"    proc do |recv|\n"
"      recv.__send__(self, *args, &block)\n"
"    end\n"
"  end\n"
"end\n"
;


static void
prelude_eval(VALUE code, VALUE name, VALUE line)
{
    rb_iseq_eval(rb_iseq_compile_with_option(code, name, Qnil, line, 0, Qtrue));
}

void
Init_golf(void)
{
    prelude_eval(
      rb_usascii_str_new(prelude_code0, sizeof(prelude_code0) - 1),
      rb_usascii_str_new(prelude_name0, sizeof(prelude_name0) - 1),
      INT2FIX(1));

#if 0
    puts(prelude_code0);
#endif
}