rVM 0.0.14 → 0.0.17
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.
- data/README +4 -4
- data/bin/rvm +229 -0
- data/lib/rvm.rb +6 -6
- data/lib/rvm/acts_as_rvm_type.rb +26 -3
- data/lib/rvm/classes.rb +9 -15
- data/lib/rvm/classes/block.rb +8 -3
- data/lib/rvm/classes/class.rb +2 -2
- data/lib/rvm/classes/list.rb +1 -1
- data/lib/rvm/classes/null.rb +31 -0
- data/lib/rvm/classes/number.rb +4 -0
- data/lib/rvm/classes/object.rb +1 -1
- data/lib/rvm/classes/string.rb +6 -1
- data/lib/rvm/environment.rb +256 -0
- data/lib/rvm/functions.rb +9 -4
- data/lib/rvm/functions/array.rb +26 -2
- data/lib/rvm/functions/array/append.rb +31 -1
- data/lib/rvm/functions/array/at.rb +29 -1
- data/lib/rvm/functions/array/set_at.rb +29 -0
- data/lib/rvm/functions/association/assoc_get.rb +34 -0
- data/lib/rvm/functions/association/assoc_set.rb +32 -0
- data/lib/rvm/functions/bitwise.rb +3 -0
- data/lib/rvm/functions/bitwise/bitwise_and.rb +41 -0
- data/lib/rvm/functions/bitwise/bitwise_or.rb +41 -0
- data/lib/rvm/functions/bitwise/bitwise_xor.rb +41 -0
- data/lib/rvm/functions/collection/get.rb +37 -4
- data/lib/rvm/functions/collection/set.rb +37 -3
- data/lib/rvm/functions/collection/size.rb +33 -1
- data/lib/rvm/functions/general/cmp.rb +35 -7
- data/lib/rvm/functions/general/eq.rb +29 -0
- data/lib/rvm/functions/general/gt.rb +29 -0
- data/lib/rvm/functions/general/gte.rb +29 -0
- data/lib/rvm/functions/general/lt.rb +29 -0
- data/lib/rvm/functions/general/lte.rb +29 -0
- data/lib/rvm/functions/general/neq.rb +5 -0
- data/lib/rvm/functions/io/print.rb +38 -8
- data/lib/rvm/functions/list/align.rb +25 -1
- data/lib/rvm/functions/list/join.rb +27 -0
- data/lib/rvm/functions/list/map.rb +34 -0
- data/lib/rvm/functions/list/split.rb +31 -0
- data/lib/rvm/functions/logic/and.rb +36 -2
- data/lib/rvm/functions/logic/not.rb +27 -0
- data/lib/rvm/functions/logic/or.rb +32 -2
- data/lib/rvm/functions/math/add.rb +25 -0
- data/lib/rvm/functions/math/cos.rb +39 -0
- data/lib/rvm/functions/math/div.rb +25 -0
- data/lib/rvm/functions/math/mod.rb +41 -0
- data/lib/rvm/functions/math/mul.rb +25 -0
- data/lib/rvm/functions/math/neg.rb +25 -0
- data/lib/rvm/functions/math/power.rb +25 -0
- data/lib/rvm/functions/math/shl.rb +41 -0
- data/lib/rvm/functions/math/shr.rb +41 -0
- data/lib/rvm/functions/math/sin.rb +39 -0
- data/lib/rvm/functions/math/sub.rb +25 -0
- data/lib/rvm/functions/math/tan.rb +39 -0
- data/lib/rvm/functions/rails/print.rb +33 -3
- data/lib/rvm/interpreter.rb +405 -272
- data/lib/rvm/languages.rb +45 -11
- data/lib/rvm/languages/brainfuck.rb +15 -16
- data/lib/rvm/languages/ecma.rb +4 -1257
- data/lib/rvm/languages/ecma/compiler.rb +1353 -0
- data/lib/rvm/languages/ecma/core-math.js +84 -0
- data/lib/rvm/languages/math.rb +9 -16
- data/lib/rvm/languages/math/compiler.rb +9 -9
- data/lib/rvm/languages/math/tokenizer.rb +1 -1
- data/lib/rvm/languages/math/tree.rb +14 -14
- data/lib/rvm/library.rb +26 -18
- data/lib/rvm/optimisation.rb +109 -0
- data/lib/rvm/plugin.rb +109 -45
- data/lib/rvm/rails.rb +79 -54
- data/spec/classes/atom/association_spec.rb +8 -8
- data/spec/classes/atom/block_spec.rb +8 -5
- data/spec/classes/atom/boolean_spec.rb +1 -1
- data/spec/classes/atom/error_spec.rb +1 -1
- data/spec/classes/atom/list_spec.rb +1 -1
- data/spec/classes/atom/number_spec.rb +2 -2
- data/spec/classes/atom/string_spec.rb +1 -1
- data/spec/languages/ecma/ecma_spec.rb +94 -38
- data/spec/languages/ecma/json_spec.rb +4 -4
- data/spec/languages/math/compiler_spec.rb +5 -5
- data/spec/languages/math/tokenizer_spec.rb +1 -1
- data/spec/languages/math/tree_spec.rb +1 -1
- data/spec/{base → rvm}/class_spec.rb +2 -2
- data/spec/{base/interpreter → rvm}/enviroment_spec.rb +19 -9
- data/spec/{base → rvm}/function_spec.rb +2 -2
- data/spec/{functions → rvm/functions}/association/assoc_get_spec.rb +2 -2
- data/spec/{functions → rvm/functions}/association/assoc_set_spec.rb +2 -2
- data/spec/rvm/functions/collection/get_spec.rb +12 -0
- data/spec/rvm/functions/collection/set_spec.rb +10 -0
- data/spec/rvm/functions/collection/size_spec.rb +10 -0
- data/spec/{functions → rvm/functions}/list/split_spec.rb +3 -3
- data/spec/{functions → rvm/functions}/string/ansi_spec.rb +3 -3
- data/spec/{functions → rvm/functions}/string/capstr_spec.rb +3 -3
- data/spec/{functions → rvm/functions}/string/center_spec.rb +3 -3
- data/spec/{functions → rvm/functions}/string/ljust_spec.rb +3 -3
- data/spec/{functions → rvm/functions}/string/regmatch_spec.rb +3 -3
- data/spec/{functions → rvm/functions}/string/rjust_spec.rb +3 -3
- data/spec/{base → rvm}/interpreter/assignment_spec.rb +1 -1
- data/spec/rvm/interpreter/condition_spec.rb +103 -0
- data/spec/{base → rvm}/interpreter/constant_spec.rb +1 -1
- data/spec/rvm/interpreter/core_call_spec.rb +72 -0
- data/spec/{base → rvm}/interpreter/interpreter_spec.rb +1 -1
- data/spec/{base → rvm}/interpreter/parameter_spec.rb +1 -1
- data/spec/rvm/interpreter/sequence_spec.rb +47 -0
- data/spec/{base → rvm}/interpreter/variable_spec.rb +1 -1
- data/spec/{base → rvm}/plugin_spec.rb +2 -2
- metadata +66 -35
- data/lib/rake/helpers/code_statistics.rb +0 -167
- data/spec/base/interpreter/condition_spec.rb +0 -47
- data/spec/base/interpreter/function_call_spec.rb +0 -72
- data/spec/base/interpreter/sequence_spec.rb +0 -20
- data/spec/functions/collection/get_spec.rb +0 -12
- data/spec/functions/collection/set_spec.rb +0 -10
- data/spec/functions/collection/size_spec.rb +0 -10
data/README
CHANGED
@@ -21,18 +21,18 @@ The following example implements a pretty easy calculator using the the math lan
|
|
21
21
|
compiler = RVM::Languages[:math].new #Lets get us the compiler
|
22
22
|
while s!= 'QUIT'
|
23
23
|
s=gets.chomp
|
24
|
-
puts compiler.compile(s).execute(
|
24
|
+
puts compiler.compile(s).execute(compiler.env) # We pass an fresh environment as we don't need an environment.
|
25
25
|
end
|
26
26
|
|
27
|
-
Here one example that keeps set variables due to using one
|
27
|
+
Here one example that keeps set variables due to using one environment for all the calls.
|
28
28
|
|
29
29
|
require 'rubygems'
|
30
30
|
require 'rvm' # This loads the rVM gem
|
31
31
|
require 'rvm/languages/math' #This loads the math plugin as well as the math function library
|
32
32
|
s =''
|
33
33
|
compiler = RVM::Languages[:math].new #Lets get us the compiler
|
34
|
-
env =
|
34
|
+
env = compiler.env
|
35
35
|
while s!= 'QUIT'
|
36
36
|
s=gets.chomp
|
37
|
-
puts compiler.compile(s).execute(env) # We pass an fresh
|
37
|
+
puts compiler.compile(s).execute(env) # We pass an fresh environment as we don't need an environment.
|
38
38
|
end
|
data/bin/rvm
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$: << "lib"
|
4
|
+
require 'optparse'
|
5
|
+
require 'ostruct'
|
6
|
+
require 'pp'
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rvm'
|
9
|
+
|
10
|
+
rcfile = File.expand_path('~/.rvmrc')
|
11
|
+
if File.exist?(rcfile)
|
12
|
+
File.new(rcfile).each do |line|
|
13
|
+
line.chomp!
|
14
|
+
ARGV << line.gsub(/\s.*$/,'')
|
15
|
+
ARGV << line.gsub(/^.*?\s/,'')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class RVMOptParser
|
20
|
+
#
|
21
|
+
# Return a structure describing the options.
|
22
|
+
#
|
23
|
+
LANGUAGES = %w[ecma bf math]
|
24
|
+
LANGUAGES_ALIASES = { "js" => "ecma", "javascript" => "ecma" }
|
25
|
+
def self.parse(args)
|
26
|
+
# The options specified on the command line will be collected in *options*.
|
27
|
+
# We set default values here.
|
28
|
+
options = OpenStruct.new
|
29
|
+
options.library = []
|
30
|
+
options.rvm_library = []
|
31
|
+
options.core_library = []
|
32
|
+
options.verbose = false
|
33
|
+
options.language = :ecma
|
34
|
+
options.code = nil
|
35
|
+
options.use_default_core_libs = true
|
36
|
+
|
37
|
+
o = OptionParser.new do |opts|
|
38
|
+
opts.banner = "Usage: rvm [options]"
|
39
|
+
|
40
|
+
opts.separator ""
|
41
|
+
opts.separator "Specific options:"
|
42
|
+
|
43
|
+
# Mandatory argument.
|
44
|
+
opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script. This is for own libraries.") do |lib|
|
45
|
+
options.library << lib;
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on("-i", "--rvm-require RVM_LIBRARY", "Require the RVM_LIBRARY before executing your script. This is for rvm internal libraries.") do |lib|
|
49
|
+
options.rvm_library << "rvm/#{lib}"
|
50
|
+
end
|
51
|
+
|
52
|
+
opts.on("-b", "--no-corelibs", "Used to disable standard core libraries to be imported automatically") do |b|
|
53
|
+
options.use_default_core_libs = !b
|
54
|
+
end
|
55
|
+
opts.on("-c", "--core-require CORE_LIBRARY", "Require an additional CORE_LIBRARY before executing your script. This is for libraries that allow access to RVM library functions.") do |lib|
|
56
|
+
options.core_library << "#{lib}"
|
57
|
+
end
|
58
|
+
|
59
|
+
opts.on("-f", "--function NAMESPACE/FUNCTION", "Require the function before executing your script. This is for rvm internal functions.") do |lib|
|
60
|
+
options.rvm_library << "rvm/functions/#{lib}"
|
61
|
+
end
|
62
|
+
|
63
|
+
language_list = (LANGUAGES_ALIASES.keys + LANGUAGES).join(',')
|
64
|
+
opts.on("-l", "--language LANGUAGE", LANGUAGES, LANGUAGES_ALIASES, "Select interpreter language", " (#{language_list})") do |language|
|
65
|
+
options.language = language
|
66
|
+
end
|
67
|
+
|
68
|
+
# Boolean switch.
|
69
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
70
|
+
options.verbose = v
|
71
|
+
end
|
72
|
+
|
73
|
+
opts.on("-d", "--[no-]debug", "Run in debug mode (attention spammy! Implies -v") do |d|
|
74
|
+
options.verbose = true if $DEBUG = options.debug = d
|
75
|
+
end
|
76
|
+
|
77
|
+
opts.on("-e", "--execute CODE", "Executes CODE directly.") do |code|
|
78
|
+
options.code = code
|
79
|
+
end
|
80
|
+
|
81
|
+
opts.on("-o", "--optimize", "Optimizes the code prior to execution") do
|
82
|
+
options.optimize
|
83
|
+
end
|
84
|
+
|
85
|
+
opts.separator ""
|
86
|
+
opts.separator "Common options:"
|
87
|
+
|
88
|
+
# No argument, shows at tail. This will print an options summary.
|
89
|
+
# Try it and see!
|
90
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
91
|
+
puts opts
|
92
|
+
exit
|
93
|
+
end
|
94
|
+
|
95
|
+
# Another typical switch to print the version.
|
96
|
+
opts.on_tail("--version", "Show version") do
|
97
|
+
puts OptionParser::Version.join('.')
|
98
|
+
exit
|
99
|
+
end
|
100
|
+
end
|
101
|
+
o.parse!(args)
|
102
|
+
options
|
103
|
+
end # parse()
|
104
|
+
|
105
|
+
end # class OptparseExample
|
106
|
+
|
107
|
+
@options = RVMOptParser.parse(ARGV)
|
108
|
+
@compiler = nil
|
109
|
+
|
110
|
+
def v text
|
111
|
+
puts text if @options.verbose
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
v "Initializing environment."
|
116
|
+
|
117
|
+
@options.rvm_library.each do |lib|
|
118
|
+
v "Loading RVM Library: #{lib}."
|
119
|
+
unless require(lib)
|
120
|
+
puts "ERROR: could not require internal library: #{lib}"
|
121
|
+
exit 1
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
begin
|
126
|
+
if require("rvm/languages/#{@options.language}")
|
127
|
+
v "Loading Compiler: #{@options.language}"
|
128
|
+
@compiler = RVM::Languages[@options.language].new
|
129
|
+
else
|
130
|
+
puts "ERROR: could not find compiler: #{@options.language}"
|
131
|
+
exit 2
|
132
|
+
end
|
133
|
+
rescue Exception => e
|
134
|
+
puts "ERROR: could not load compiler for: #{@options.language} #=> #{e}"
|
135
|
+
exit 3
|
136
|
+
end
|
137
|
+
|
138
|
+
if @options.use_default_core_libs
|
139
|
+
@env = @compiler.env
|
140
|
+
else
|
141
|
+
@env = RVM::Initerpreter.env
|
142
|
+
end
|
143
|
+
|
144
|
+
@options.core_library.each do |lib|
|
145
|
+
v "Loading core library #{lib}."
|
146
|
+
if File.exist?(lib)
|
147
|
+
begin
|
148
|
+
v "Compiling core library #{lib}."
|
149
|
+
code = @compiler.compile(File.read(lib), true)
|
150
|
+
v "Optimizing library #{lib}" if @options.optimize
|
151
|
+
code = code.optimize if @options.optimize
|
152
|
+
begin
|
153
|
+
v "Executing library #{lib}."
|
154
|
+
code.execute(@env)
|
155
|
+
rescue Exception => e
|
156
|
+
puts "ERROR: could not execute core library: #{lib} #=> #{e}"
|
157
|
+
exit 4
|
158
|
+
end
|
159
|
+
rescue Exception => e
|
160
|
+
puts "ERROR: could not compile core library: #{lib} #=> #{e}"
|
161
|
+
exit 5
|
162
|
+
end
|
163
|
+
else
|
164
|
+
puts "ERROR: Could not load core library: #{lib}"
|
165
|
+
exit 6
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
@options.library.each do |lib|
|
170
|
+
v "Loading library #{lib}."
|
171
|
+
if File.exist?(lib)
|
172
|
+
begin
|
173
|
+
v "Compiling library #{lib}."
|
174
|
+
code = @compiler.compile(File.read(lib))
|
175
|
+
v "Optimizing library #{lib}" if @options.optimize
|
176
|
+
code = code.optimize if @options.optimize
|
177
|
+
begin
|
178
|
+
v "Executing library #{lib}."
|
179
|
+
code.execute(@env)
|
180
|
+
rescue Exception => e
|
181
|
+
puts "ERROR: could not execute library: #{lib} #=> #{e}"
|
182
|
+
exit 4
|
183
|
+
end
|
184
|
+
rescue Exception => e
|
185
|
+
puts "ERROR: could not compile library: #{lib} #=> #{e}"
|
186
|
+
exit 5
|
187
|
+
end
|
188
|
+
else
|
189
|
+
puts "ERROR: Could not load library: #{lib}"
|
190
|
+
exit 6
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
if @options.code
|
195
|
+
v "Executing: #{@options.code}."
|
196
|
+
@source = @options.code
|
197
|
+
else
|
198
|
+
if file = ARGV.first
|
199
|
+
if File.exist?(file)
|
200
|
+
@source = File.read(file)
|
201
|
+
else
|
202
|
+
puts "ERROR: Could not load source file: #{file}"
|
203
|
+
exit 7
|
204
|
+
end
|
205
|
+
else
|
206
|
+
puts "No files passed."
|
207
|
+
puts `#{$0} -h`
|
208
|
+
exit 8
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
|
213
|
+
begin
|
214
|
+
v "Compiling program code."
|
215
|
+
code = @compiler.compile(@source)
|
216
|
+
# p code
|
217
|
+
v "Optimizing library #{lib}" if @options.optimize
|
218
|
+
code = code.optimize if @options.optimize
|
219
|
+
begin
|
220
|
+
v "Executing program code."
|
221
|
+
code.execute(@env)
|
222
|
+
rescue Exception => e
|
223
|
+
puts "ERROR: could not execute program code #=> #{e}"
|
224
|
+
raise e
|
225
|
+
end
|
226
|
+
rescue Exception => e
|
227
|
+
puts "ERROR: could not compile program code #=> #{e}"
|
228
|
+
raise e
|
229
|
+
end
|
data/lib/rvm.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'rvm/interpreter'
|
2
|
+
require 'rvm/classes'
|
3
|
+
require 'rvm/functions'
|
4
|
+
require 'rvm/languages'
|
5
5
|
require 'timeout'
|
6
6
|
|
7
7
|
# This is the rVM library. Including it loads the very basic functionalites rVM offers.
|
@@ -15,7 +15,7 @@ require 'timeout'
|
|
15
15
|
#
|
16
16
|
# It also contains some usefull functions that wil allow to make the usuage easyer.
|
17
17
|
module RVM
|
18
|
-
|
18
|
+
VERSION = "0.0.16" unless defined?(VERSION)
|
19
19
|
# This class is designed to allow execting code more safely
|
20
20
|
#
|
21
21
|
# It allows to limit executin in multiple ways to prevent all sorty of runaway code.
|
@@ -88,7 +88,7 @@ module RVM
|
|
88
88
|
|
89
89
|
# A utility function to give debug output based on weather $DEBUG is set or not
|
90
90
|
def debug text
|
91
|
-
puts text if $DEBUG
|
91
|
+
puts ">>> #{text}" if $DEBUG
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
data/lib/rvm/acts_as_rvm_type.rb
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
=begin
|
2
|
+
The MIT License
|
3
|
+
|
4
|
+
Copyright (c) 2007 Heinz N. 'Licenser' Gies
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
of this software and associated documentation files (the "Ruby Mush"), to deal
|
8
|
+
in the Software without restriction, including without limitation the rights
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
11
|
+
furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
14
|
+
all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
THE SOFTWARE.
|
23
|
+
=end
|
24
|
+
|
1
25
|
|
2
26
|
# RVM::ActsAsRVMType is a mixin that allows to quickly publish classes and types
|
3
27
|
# to the rVM interpreter without going through the hassle of defining each
|
@@ -14,7 +38,6 @@
|
|
14
38
|
# register_variable :var
|
15
39
|
# register_function :to_s
|
16
40
|
# end
|
17
|
-
|
18
41
|
module RVM::ActsAsRVMType
|
19
42
|
|
20
43
|
# Called when included, loads the class methods and the instance methods needed.
|
@@ -52,8 +75,8 @@ module RVM::ActsAsRVMType
|
|
52
75
|
puts self.class
|
53
76
|
@variables = {}
|
54
77
|
#gets the variables hash from the Test class and maps it to a getter/setter Class
|
55
|
-
self.class.object_variables.each do |
|
56
|
-
|
78
|
+
self.class.object_variables.each do |published_as, data|
|
79
|
+
name, writable = data
|
57
80
|
@variables[published_as.to_s] = RVM::Interpreter::VariableStorageCallback.new(self, name, writable)
|
58
81
|
end
|
59
82
|
#redefinces the variables method to remove overhead from mapping
|
data/lib/rvm/classes.rb
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
# This file is published under the MIT Licenser, see LICENSE for details.
|
6
6
|
#
|
7
7
|
|
8
|
-
require
|
9
|
-
require
|
8
|
+
require 'rvm/plugin'
|
9
|
+
require 'rvm/functions'
|
10
10
|
module RVM
|
11
11
|
# This module is the basic class container, classes are supposed to be
|
12
12
|
# used by this as in: RVM::Classes[<class id>] this guarnatees that,
|
@@ -16,11 +16,12 @@ module RVM
|
|
16
16
|
#
|
17
17
|
# === Creating a string calss
|
18
18
|
#
|
19
|
-
# require '
|
19
|
+
# require 'rvm/classes'
|
20
20
|
# string = RVM::Classes[:string].new
|
21
21
|
module Classes
|
22
22
|
extend RVM::PluginHost
|
23
23
|
default :string
|
24
|
+
|
24
25
|
# The Parent for new classes, meant never to be used alone.
|
25
26
|
# It takes care of registering the calss to the PluginHost,
|
26
27
|
# as well of basic functionality.
|
@@ -30,10 +31,10 @@ module RVM
|
|
30
31
|
#
|
31
32
|
# == Examples
|
32
33
|
#
|
33
|
-
# ===
|
34
|
+
# === COMPLEX NUMBERS
|
34
35
|
#
|
35
|
-
# # file:
|
36
|
-
# require '
|
36
|
+
# # file: rvm/classes/math/complex.rb
|
37
|
+
# require 'rvm/classes'
|
37
38
|
# module RVM
|
38
39
|
# module Classes
|
39
40
|
# class Complex < RVM::Classes::Class
|
@@ -81,19 +82,12 @@ module RVM
|
|
81
82
|
:any
|
82
83
|
end
|
83
84
|
|
84
|
-
# Returns if the objects is true or not,
|
85
|
-
# this is interesting for things like errors overwrite it if your
|
86
|
-
# class is not always true.
|
87
|
-
def is_true?
|
88
|
-
true
|
89
|
-
end
|
90
|
-
|
91
85
|
# Redefinding the method to allow using self defined functions
|
92
86
|
# within classes - while this is discuraged it still is possible.
|
93
87
|
def method_missing(m, *args, &block)
|
94
88
|
# Check if the functions PluginHost knwos about the called function
|
95
89
|
if (RVM::Functions::has? m)
|
96
|
-
# Calls the function with given args and
|
90
|
+
# Calls the function with given args and environment that is,
|
97
91
|
# hopefully defiend in the calling class.
|
98
92
|
RVM::Functions[m].execute args, @env
|
99
93
|
else
|
@@ -107,5 +101,5 @@ module RVM
|
|
107
101
|
end
|
108
102
|
|
109
103
|
Dir[File.dirname(__FILE__) + '/classes/*.rb'].each do |c|
|
110
|
-
require c
|
104
|
+
require 'rvm/classes/' + File.basename(c)
|
111
105
|
end
|
data/lib/rvm/classes/block.rb
CHANGED
@@ -16,13 +16,18 @@ module RVM
|
|
16
16
|
true
|
17
17
|
end
|
18
18
|
|
19
|
+
def optimize
|
20
|
+
@code = @code.optimize
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
19
24
|
def call params, env, pos = nil
|
20
|
-
RVM::debug "Calling Block at #{pos}...(#{env}
|
21
|
-
env = RVM::Interpreter::
|
25
|
+
RVM::debug "Calling Block at #{pos}...(evn: #{env}, params: #{params})" if $DEBUG
|
26
|
+
env = RVM::Interpreter::Environment .new({:params => params||[]}, env)
|
22
27
|
begin
|
23
28
|
@code.execute(env)
|
24
29
|
rescue RVM::Interpreter::ReturnException => e
|
25
|
-
RVM::debug "yuck,
|
30
|
+
RVM::debug "yuck, caught a result!" if $DEBUG
|
26
31
|
pp e if $DEBUG
|
27
32
|
return e.val
|
28
33
|
end
|
data/lib/rvm/classes/class.rb
CHANGED
@@ -31,14 +31,14 @@ module RVM
|
|
31
31
|
m = @parent.functions(method) if not m and @parent
|
32
32
|
raise "Unknown method #{method} for object #{self}" if not m
|
33
33
|
params.unshift self
|
34
|
-
env = RVM::Interpreter::
|
34
|
+
env = RVM::Interpreter::Environment.new({:params => params||[], :locals => @variables, :functions => @functions}, env)
|
35
35
|
m.call(params, env)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def instance params, env
|
40
40
|
o = RVM::Classes::Object.new self
|
41
|
-
env = RVM::Interpreter::
|
41
|
+
env = RVM::Interpreter::Environment.new({:params => params||[], :locals => @variables, :functions => @functions}, env)
|
42
42
|
o.obj_send(@initializer, [], env) if @object_functions[@initializer]
|
43
43
|
o
|
44
44
|
end
|
data/lib/rvm/classes/list.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module RVM
|
2
|
+
module Classes
|
3
|
+
class Null < RVM::Classes::Class
|
4
|
+
register_for :null
|
5
|
+
|
6
|
+
def data_type
|
7
|
+
:null
|
8
|
+
end
|
9
|
+
|
10
|
+
def hash
|
11
|
+
nil.hash
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(o)
|
15
|
+
if o.nil? and o.is_a?(RVM::Classes::Null)
|
16
|
+
true
|
17
|
+
else
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize value
|
23
|
+
super()
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_true?
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|