fancy 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. data/README.md +38 -86
  2. data/bin/fdoc +2 -22
  3. data/bin/fspec +8 -3
  4. data/bin/ifancy +1 -1
  5. data/boot/fancy_ext.rb +1 -0
  6. data/boot/fancy_ext/array.rb +19 -0
  7. data/boot/fancy_ext/class.rb +2 -4
  8. data/boot/fancy_ext/module.rb +2 -0
  9. data/boot/fancy_ext/object.rb +0 -17
  10. data/boot/rbx-compiler/compiler/ast/method_def.rb +0 -4
  11. data/boot/rbx-compiler/compiler/ast/singleton_method_def.rb +0 -7
  12. data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
  13. data/boot/rbx-compiler/parser/fancy_parser.c +1 -0
  14. data/doc/api/fancy.css +10 -1
  15. data/doc/api/fancy.jsonp +1 -1
  16. data/doc/api/fdoc.js +22 -9
  17. data/doc/api/octocat.png +0 -0
  18. data/doc/features.md +1 -2
  19. data/examples/actors.fy +1 -2
  20. data/examples/armstrong_numbers.fy +7 -3
  21. data/examples/blocks.fy +3 -3
  22. data/examples/distributing_proxy.fy +31 -0
  23. data/examples/future_sends.fy +15 -0
  24. data/examples/person.fy +1 -2
  25. data/lib/argv.fy +1 -7
  26. data/lib/array.fy +7 -11
  27. data/lib/block.fy +15 -0
  28. data/lib/boot.fy +4 -3
  29. data/lib/class.fy +354 -10
  30. data/lib/compiler.fy +1 -1
  31. data/lib/compiler/ast/assign.fy +4 -8
  32. data/lib/compiler/ast/async_send.fy +1 -2
  33. data/lib/compiler/ast/block.fy +5 -0
  34. data/lib/compiler/ast/class_def.fy +2 -1
  35. data/lib/compiler/ast/expression_list.fy +1 -2
  36. data/lib/compiler/ast/future_send.fy +1 -2
  37. data/lib/compiler/ast/identifier.fy +34 -17
  38. data/lib/compiler/ast/literals.fy +31 -19
  39. data/lib/compiler/ast/match.fy +5 -4
  40. data/lib/compiler/ast/message_send.fy +3 -5
  41. data/lib/compiler/ast/method_def.fy +0 -3
  42. data/lib/compiler/ast/range.fy +2 -4
  43. data/lib/compiler/ast/return.fy +2 -4
  44. data/lib/compiler/ast/script.fy +2 -4
  45. data/lib/compiler/ast/singleton_method_def.fy +0 -3
  46. data/lib/compiler/ast/string_interpolation.fy +2 -2
  47. data/lib/compiler/ast/super.fy +2 -4
  48. data/lib/compiler/ast/try_catch.fy +13 -9
  49. data/lib/compiler/ast/tuple_literal.fy +1 -2
  50. data/lib/compiler/compiler.fy +2 -2
  51. data/lib/compiler/stages.fy +3 -6
  52. data/lib/contracts.fy +89 -57
  53. data/lib/dynamic_slot_object.fy +21 -3
  54. data/lib/enumerable.fy +140 -4
  55. data/lib/enumerator.fy +1 -1
  56. data/lib/eval.fy +23 -9
  57. data/lib/exception.fy +16 -0
  58. data/lib/false_class.fy +36 -5
  59. data/lib/fancy_spec.fy +64 -34
  60. data/lib/fdoc.fy +85 -24
  61. data/lib/file.fy +19 -0
  62. data/lib/future.fy +4 -46
  63. data/lib/hash.fy +113 -0
  64. data/lib/integer.fy +25 -6
  65. data/lib/iteration.fy +3 -3
  66. data/lib/main.fy +5 -0
  67. data/lib/matchers.fy +79 -0
  68. data/lib/nil_class.fy +8 -0
  69. data/lib/object.fy +109 -18
  70. data/lib/option_parser.fy +118 -0
  71. data/lib/package/dependency.fy +4 -8
  72. data/lib/package/dependency_installer.fy +1 -1
  73. data/lib/package/handler.fy +6 -0
  74. data/lib/package/installer.fy +43 -16
  75. data/lib/package/list.fy +1 -2
  76. data/lib/package/specification.fy +5 -5
  77. data/lib/package/uninstaller.fy +9 -2
  78. data/lib/parser.fy +1 -3
  79. data/lib/parser/ext/ext.c +1 -0
  80. data/lib/parser/ext/lexer.lex +5 -0
  81. data/lib/parser/methods.fy +48 -46
  82. data/lib/proxies.fy +151 -0
  83. data/lib/rbx.fy +1 -0
  84. data/lib/rbx/actor.fy +16 -18
  85. data/lib/rbx/array.fy +18 -3
  86. data/lib/rbx/block.fy +1 -7
  87. data/lib/rbx/class.fy +54 -9
  88. data/lib/rbx/code_loader.fy +2 -5
  89. data/lib/rbx/compiled_method.fy +31 -0
  90. data/lib/rbx/debugger.fy +66 -0
  91. data/lib/rbx/directory.fy +8 -3
  92. data/lib/rbx/documentation.fy +1 -1
  93. data/lib/rbx/file.fy +22 -0
  94. data/lib/rbx/integer.fy +1 -1
  95. data/lib/rbx/match_data.fy +2 -1
  96. data/lib/rbx/method.fy +26 -0
  97. data/lib/rbx/object.fy +8 -3
  98. data/lib/rbx/regexp.fy +6 -3
  99. data/lib/rbx/string.fy +9 -1
  100. data/lib/rbx/stringio.fy +12 -0
  101. data/lib/rbx/symbol.fy +4 -0
  102. data/lib/stack.fy +1 -1
  103. data/lib/string.fy +34 -0
  104. data/lib/stringio.fy +1 -1
  105. data/lib/symbol.fy +6 -2
  106. data/lib/system.fy +15 -1
  107. data/lib/tuple.fy +5 -2
  108. data/lib/version.fy +1 -1
  109. data/ruby_lib/fdoc +2 -22
  110. data/tests/array.fy +3 -17
  111. data/tests/class.fy +312 -10
  112. data/tests/contracts.fy +51 -0
  113. data/tests/distributing_proxy.fy +28 -0
  114. data/tests/enumerable.fy +104 -1
  115. data/tests/exception.fy +35 -0
  116. data/tests/fixnum.fy +1 -1
  117. data/tests/hash.fy +81 -1
  118. data/tests/integer.fy +9 -0
  119. data/tests/matchers.fy +18 -0
  120. data/tests/method.fy +8 -14
  121. data/tests/object.fy +76 -2
  122. data/tests/option_parser.fy +80 -0
  123. data/tests/string.fy +21 -0
  124. data/tests/stringio.fy +1 -1
  125. data/tests/tuple.fy +1 -1
  126. metadata +21 -44
  127. data/examples/arithmetic.fy +0 -7
  128. data/examples/array.fy +0 -50
  129. data/examples/boolean.fy +0 -24
  130. data/examples/class.fy +0 -68
  131. data/examples/constant_access.fy +0 -15
  132. data/examples/default_args.fy +0 -20
  133. data/examples/define_methods.fy +0 -15
  134. data/examples/dynamic_output.fy +0 -15
  135. data/examples/empty_catch.fy +0 -4
  136. data/examples/exception.fy +0 -9
  137. data/examples/files.fy +0 -23
  138. data/examples/finally.fy +0 -5
  139. data/examples/future.fy +0 -30
  140. data/examples/future_composition.fy +0 -20
  141. data/examples/futures.fy +0 -9
  142. data/examples/game_of_life.fy +0 -148
  143. data/examples/html_generator.fy +0 -84
  144. data/examples/implicit_return.fy +0 -3
  145. data/examples/matchers.fy +0 -6
  146. data/examples/nested_try.fy +0 -9
  147. data/examples/numbers.fy +0 -12
  148. data/examples/rbx/and_or.fy +0 -7
  149. data/examples/rbx/blocks.fy +0 -22
  150. data/examples/rbx/classes.fy +0 -32
  151. data/examples/rbx/hello.fy +0 -8
  152. data/examples/rbx/include.fy +0 -12
  153. data/examples/rbx/inherit.fy +0 -11
  154. data/examples/rbx/methods.fy +0 -15
  155. data/examples/rbx/nested_classes.fy +0 -9
  156. data/examples/rbx/require.fy +0 -3
  157. data/examples/rbx/strings.fy +0 -5
  158. data/examples/require.fy +0 -7
  159. data/examples/return.fy +0 -13
  160. data/examples/singleton_methods.fy +0 -21
  161. data/examples/threads.fy +0 -18
  162. data/examples/tuple.fy +0 -8
  163. data/examples/webserver/webserver.fy +0 -15
  164. data/lib/proxy.fy +0 -86
  165. data/lib/thread_pool.fy +0 -102
@@ -0,0 +1,151 @@
1
+ class Proxies {
2
+ class ProxyReceiver : Fancy BasicObject {
3
+ """
4
+ A ProxyReceiver is an object which proxies all message sends to it to 2 other objects.
5
+ It will send each message first to its @proxy instance variable and then to the @obj instance variable.
6
+ """
7
+
8
+ def initialize: @proxy for: @obj {
9
+ """
10
+ @proxy Proxy receiver for @obj.
11
+ @obj Original receiver object.
12
+
13
+ Initializes a new ProxyReceiver with @proxy for @obj.
14
+ """
15
+
16
+ self
17
+ }
18
+
19
+ def unknown_message: msg with_params: params {
20
+ """
21
+ @msg Incoming message name.
22
+ @params Paremeters of incoming message send.
23
+
24
+ Forwards all incoming messages to @self to @@proxy and then @@obj.
25
+ """
26
+
27
+ @proxy receive_message: msg with_params: params
28
+ @obj receive_message: msg with_params: params
29
+ }
30
+ }
31
+
32
+ Proxy = ProxyReceiver
33
+
34
+ class RespondsToProxy : Fancy BasicObject {
35
+ """
36
+ A RespondsToProxy is a Proxy that forwards any message sent to it to it's @target instance variable
37
+ only if it responds to that message. Any messages that @target doesn't respond to simply won't be sent
38
+ and @nil will be returned.
39
+ """
40
+
41
+ def initialize: @target {
42
+ """
43
+ @target Target receiver object.
44
+
45
+ Initializes a new RespondsToProxy for @target.
46
+ """
47
+
48
+ self
49
+ }
50
+
51
+ def unknown_message: msg with_params: params {
52
+ """
53
+ @msg Incoming message name.
54
+ @params Paremeters of incoming message send.
55
+
56
+ Forwards all incoming message to @self to @@target
57
+ only if @@target responds to them.
58
+ """
59
+
60
+ if: (@target responds_to?: msg) then: {
61
+ @target receive_message: msg with_params: params
62
+ }
63
+ }
64
+ }
65
+
66
+ class ActorProxy : Fancy BasicObject {
67
+ """
68
+ An ActorProxy is a Proxy that forwards any message sent to it to
69
+ it's @target object as a future send by default. If explicitly sent
70
+ an async message, it will forward the async send to @target,
71
+ returning @nil instead of a @FutureSend@, as expected.
72
+
73
+ Example:
74
+ ap = ActorProxy new: target_actor
75
+
76
+ # this:
77
+ f = ap some_future_send: an_arg
78
+ # is the same as:
79
+ f = target_actor @ some_future_send: an_arg
80
+
81
+ # and this:
82
+ ap @@ some_async_send: another_arg
83
+ # is the same as:
84
+ target_actor @@ some_async_send: another_arg
85
+ """
86
+
87
+ def initialize: @target
88
+
89
+ def send_future: m with_params: p {
90
+ @target send_future: m with_params: p
91
+ }
92
+
93
+ def send_async: m with_params: p {
94
+ @target send_async: m with_params: p
95
+ }
96
+
97
+ def unknown_message: m with_params: p {
98
+ @target send_future: m with_params: p
99
+ }
100
+ }
101
+
102
+ class DistributingProxy : Fancy BasicObject {
103
+ """
104
+ DistributingProxy is a Proxy that round-robin distributes messages to objects
105
+ in a @Fancy::Enumerable@ specified upon creation.
106
+
107
+ Example:
108
+ p = DistributingProxy new: [worker1, worker2, worker3, worker4]
109
+ loop: {
110
+ req = @input receive_request
111
+ p handle_request: req # will be forwarded to worker1-4
112
+ }
113
+ """
114
+
115
+ def initialize {
116
+ ArgumentError raise: "Missing list of proxy targets"
117
+ }
118
+
119
+ def initialize: @targets {
120
+ @free = @targets to_a dup
121
+ @mutex = Mutex new
122
+ @waiting = ConditionVariable new
123
+ }
124
+
125
+ def __with_target__: block {
126
+ t = @mutex synchronize: {
127
+ { @waiting wait: @mutex } until: { @free empty? not }
128
+ @free shift
129
+ }
130
+ val = block call: [t]
131
+ @mutex synchronize: { @free << t; @waiting broadcast }
132
+ val
133
+ }
134
+
135
+ instance_methods reject: /^(:initialize|initialize:|__with_target__:|unknown_message:with_params:|send_async:with_params:|send_future:with_params:|__send__)$/ . each: |m| {
136
+ undef_method(m)
137
+ }
138
+
139
+ def unknown_message: m with_params: p {
140
+ __with_target__: @{ receive_message: m with_params: p }
141
+ }
142
+
143
+ def send_async: m with_params: p {
144
+ __with_target__: @{ send_async: m with_params: p }
145
+ }
146
+
147
+ def send_future: m with_params: p {
148
+ __with_target__: @{ send_future: m with_params: p }
149
+ }
150
+ }
151
+ }
data/lib/rbx.fy CHANGED
@@ -42,3 +42,4 @@ require: "rbx/actor"
42
42
  require: "rbx/mutex"
43
43
  require: "rbx/module"
44
44
  require: "rbx/proc"
45
+ require: "rbx/compiled_method"
@@ -8,25 +8,24 @@ class Actor {
8
8
  first-come, first-serve manner.
9
9
 
10
10
  Actors are used to implement asynchronous and future message sends in Fancy
11
- using the @@ and @@@ syntax.
12
-
13
- Example usage:
14
-
15
- a = Actor spawn: {
16
- loop: {
17
- match Actor receive {
18
- case 'hello -> \"Hello World\" println
19
- case 'quit ->
20
- \"OK, done!\" println
21
- break # Quit loop and let actor die
11
+ using the @ and @@ syntax.
12
+
13
+ Example:
14
+ a = Actor spawn: {
15
+ loop: {
16
+ match Actor receive {
17
+ case 'hello -> \"Hello World\" println
18
+ case 'quit ->
19
+ \"OK, done!\" println
20
+ break # Quit loop and let actor die
21
+ }
22
22
  }
23
23
  }
24
- }
25
24
 
26
- 10 times: {
27
- a ! 'hello # send 'hello to actor asynchronously
28
- }
29
- a ! 'quit
25
+ 10 times: {
26
+ a ! 'hello # send 'hello to actor asynchronously
27
+ }
28
+ a ! 'quit
30
29
  """
31
30
 
32
31
  alias_method(':!, '<<)
@@ -39,8 +38,7 @@ class Actor {
39
38
  @block @Block@ that represents the @Actor@'s code body to be executed in a new @Thread@.
40
39
  @return A new @Actor@ running @block in a seperate @Thread@.
41
40
 
42
- Example usage:
43
-
41
+ Example:
44
42
  Actor spawn: {
45
43
  loop: {
46
44
  Actor receive println # print all incoming messages
@@ -5,8 +5,18 @@ class Array {
5
5
 
6
6
  def Array new: size with: default {
7
7
  """
8
+ @size Initial size of @Array@.
9
+ @default Default value of new @Array@. Inserted @size times.
10
+ @return New @Array@ with @size values of @default in it.
11
+
8
12
  Creates a new Array with a given size and default-value.
9
- If @default is a @Block@, call that block for each element instead.
13
+ If @default is a @Block@, call it with each index instead and
14
+ store the return value.
15
+
16
+ Example:
17
+ Array new: 3 with: 'hello # => ['hello, 'hello, 'hello]
18
+ # default can also be a block, taking the current index.
19
+ Array new: 3 with: @{ * 2 } # => [0, 2, 4]
10
20
  """
11
21
 
12
22
  match default {
@@ -67,7 +77,7 @@ class Array {
67
77
  """
68
78
  @idx Index to set a value for.
69
79
  @obj Value (object) to be set at the given index.
70
- @return @obj
80
+ @return @obj.
71
81
 
72
82
  Inserts a given object at a given index (position) in the Array.
73
83
  """
@@ -83,8 +93,13 @@ class Array {
83
93
  @return Index of the value passed in within the @Array@, or @nil, if value not present.
84
94
 
85
95
  Returns the index of an item (or nil, if it isn't in the @Array@).
96
+ If @item is a @Block@, it will return the index of an element for which it yields @true.
86
97
  """
87
- index(item)
98
+
99
+ match item {
100
+ case Block -> index(&item)
101
+ case _ -> index(item)
102
+ }
88
103
  }
89
104
 
90
105
  def last: count {
@@ -47,8 +47,6 @@ class Block {
47
47
  @top_scope receiver: recv
48
48
  }
49
49
 
50
- # Ugh. HACK.
51
- # Use try/catch to deal with older and latest version of rbx (method got changed)
52
50
  def call_with_receiver: receiver {
53
51
  """
54
52
  @receiver Receiver (value of @self) when calling the @Block@.
@@ -63,11 +61,7 @@ class Block {
63
61
  b call_with_receiver: r2 # => String
64
62
  """
65
63
 
66
- try {
67
- return call_under(receiver, method() scope())
68
- } catch {
69
- return call_on_instance(receiver)
70
- }
64
+ call_on_instance(receiver)
71
65
  }
72
66
 
73
67
  def call: args with_receiver: receiver {
@@ -3,9 +3,9 @@ class Class {
3
3
 
4
4
  def new {
5
5
  """
6
- @return A new @Class@ subclassed from @Object@.
6
+ @return A new instance of @Class@ @self.
7
7
 
8
- Creates a new @Class@ instance by subclassing @Object@.
8
+ Creates a new instance of @self calling @initialize.
9
9
  """
10
10
 
11
11
  obj = allocate()
@@ -14,16 +14,16 @@ class Class {
14
14
  }
15
15
 
16
16
  # calls initialize:, if defined
17
- def new: superclass {
17
+ def new: arg {
18
18
  """
19
- @superclass The superclass to inherit from.
20
- @return A new @Class@ inherited from @superclass.
19
+ @arg Argument to @initialize:.
20
+ @return A new instance of @Class@ @self.
21
21
 
22
- Creates a new @Class@ instance by subclassing @superclass.
22
+ Creates a new instance of @self calling @initialize:.
23
23
  """
24
24
 
25
25
  obj = allocate()
26
- obj initialize: superclass
26
+ obj initialize: arg
27
27
  obj
28
28
  }
29
29
 
@@ -63,7 +63,10 @@ class Class {
63
63
  body.
64
64
  """
65
65
 
66
- define_method(name message_name, &block)
66
+ match block {
67
+ case Block -> define_method(name message_name, &block)
68
+ case _ -> define_method(name message_name, block)
69
+ }
67
70
  }
68
71
 
69
72
  def undefine_method: name {
@@ -130,6 +133,10 @@ class Class {
130
133
  instance_method(name message_name)
131
134
  }
132
135
 
136
+ def has_method?: method_name {
137
+ lookup_method(method_name message_name) nil? not
138
+ }
139
+
133
140
  def alias_method_rbx: new_method_name for: old_method_name {
134
141
  """
135
142
  Rbx specific version of alias_method:for: due to bootstrap order
@@ -215,9 +222,47 @@ class Class {
215
222
  }
216
223
 
217
224
  def class_eval: str_or_block {
225
+ """
226
+ @str_or_block @String@ or @Block@ to be evaluated in the context of this @Class@.
227
+
228
+ Evaluates a given @String@ of Fancy code or a @Block@ in the class context of @self.
229
+ Useful for dynamically defining methods on a class etc.
230
+
231
+ Example:
232
+ Array class_eval: \"def foo { 'foo println }\"
233
+ [1,2,3] foo # => prints 'foo
234
+ """
235
+
218
236
  match str_or_block {
219
237
  case Block -> class_eval(&str_or_block)
220
- case _ -> class_eval(str_or_block)
238
+ case _ -> class_eval: { str_or_block to_s eval }
239
+ }
240
+ }
241
+
242
+ def expose_to_ruby: method_name as: ruby_method_name (nil) {
243
+ """
244
+ @method_name Fancy method name to be exposed.
245
+ @ruby_method_name Name of method exposed to Ruby (optional).
246
+
247
+ Explicitly exposes a Fancy method to Ruby. If @ruby_method_name is
248
+ passed, use that name explicitly, otherwise uses @method_name.
249
+
250
+ Example:
251
+ class Foo {
252
+ def === other {
253
+ # ...
254
+ }
255
+
256
+ expose_to_ruby: '===
257
+
258
+ # if you don't want to expose it as :=== in Ruby:
259
+ expose_to_ruby: '=== as: 'some_other_name_for_ruby
260
+ }
261
+ """
262
+
263
+ match ruby_method_name {
264
+ case nil -> alias_method(method_name, method_name message_name)
265
+ case _ -> alias_method(ruby_method_name, method_name message_name)
221
266
  }
222
267
  }
223
268
  }
@@ -77,11 +77,8 @@ class Fancy {
77
77
  }
78
78
  }
79
79
  @@load_path each: |p| {
80
- try {
81
- if: (find_file: filename in_path: p) then: |f| {
82
- return f
83
- }
84
- } catch {
80
+ if: (find_file: filename in_path: p) then: |f| {
81
+ return f
85
82
  }
86
83
  }
87
84
  }
@@ -0,0 +1,31 @@
1
+ class Rubinius CompiledMethod {
2
+ forwards_unary_ruby_methods
3
+
4
+ def selectors_with_args {
5
+ local_names = local_names to_a
6
+ if: (required_args > 0) then: {
7
+ name to_s split: ":" . map_with_index: |sel i| {
8
+ "#{sel}: #{local_names[i]}"
9
+ } . join: " "
10
+ } else: {
11
+ name to_s rest
12
+ }
13
+ }
14
+
15
+ def definition_line {
16
+ # don't use documentation#to_s since we need original docstring as written in source file to calculate the correct lines#
17
+ docstring = ""
18
+ if: documentation then: {
19
+ docstring = documentation docs join: "\n"
20
+ }
21
+ if: (lines size > 3) then: {
22
+ lines[3] - (docstring lines size)
23
+ } else: {
24
+ 0 # UNKNOWN?
25
+ }
26
+ }
27
+
28
+ def last_line {
29
+ defined_line
30
+ }
31
+ }
@@ -0,0 +1,66 @@
1
+ require("rubinius/debugger")
2
+
3
+ class Rubinius Debugger {
4
+ forwards_unary_ruby_methods
5
+ metaclass forwards_unary_ruby_methods
6
+ }
7
+
8
+ class Rubinius Debugger Command SetBreakPoint {
9
+ def match_method: method_identifier {
10
+ match method_identifier {
11
+ case /##/ ->
12
+ class_name, method_name = method_identifier split: "##"
13
+ method_identifier = "#{class_name}::#{method_name message_name}"
14
+ case /#/ ->
15
+ class_name, method_name = method_identifier split: "#"
16
+ method_identifier = "#{class_name}##{method_name message_name}"
17
+ }
18
+
19
+ /([A-Z]\w*(?:::[A-Z]\w*)*)([.#]|::)([a-zA-Z0-9_\[\]:]+[!?=]?)(?:[:](\d+))?/ match: method_identifier
20
+ }
21
+
22
+ alias_method('match_method, 'match_method:)
23
+ }
24
+
25
+ class Rubinius Location {
26
+ forwards_unary_ruby_methods
27
+ }
28
+
29
+ class Rubinius Debugger Frame {
30
+ forwards_unary_ruby_methods
31
+
32
+ def describe {
33
+ arg_str = ""
34
+ recv = nil
35
+ loc = @location
36
+
37
+ if: (loc is_block) then: {
38
+ if: (method required_args == 0) then: {
39
+ recv = "{ } in #{loc describe_receiver}#{loc name}"
40
+ } else: {
41
+ block_args = method local_names join: ", "
42
+ recv = "|#{block_args}| { } in #{loc describe_receiver}#{loc name}"
43
+ }
44
+ } else: {
45
+ recv = loc describe
46
+ }
47
+
48
+ recv = recv replace: "#:" with: "#"
49
+ recv = recv replace: ".:" with: "##"
50
+ recv = recv replace: "." with: "##"
51
+
52
+ str = "#{recv} at #{loc method active_path}:#{loc line} (#{loc ip})"
53
+ { str << " (+#{loc ip})" } if: $ @debugger variables['show_ip]
54
+ str
55
+ }
56
+
57
+ alias_method('describe, ':describe)
58
+
59
+ def run: code {
60
+ Fancy eval: (code to_s) binding: binding
61
+ }
62
+
63
+ alias_method('run, 'run:)
64
+ }
65
+
66
+ Rubinius Debugger start