eleetscript 0.0.3a → 0.0.4a
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.
- checksums.yaml +4 -4
- data/lib/engine/eleet_to_ruby_wrapper.rb +9 -4
- data/lib/engine/engine.rb +24 -4
- data/lib/engine/esproc.rb +17 -0
- data/lib/engine/ruby_lambda.rb +5 -0
- data/lib/engine/ruby_to_eleet_wrapper.rb +3 -1
- data/lib/engine/values.rb +19 -8
- data/lib/lang/interpreter.rb +7 -5
- data/lib/lang/runtime/class_instance.rb +6 -2
- data/lib/lang/runtime/context.rb +3 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3cb1ebbd98b6434ccb190f60658378512af2518c
|
4
|
+
data.tar.gz: fef85a1f7e2f7d3ec4b981efff27d35ce24d0f1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 471e214d21923f796f4c002564eb84f2bfcefead0c2ad66f471a546262bee9e070efb4cd71a8e4b96c126d47818daceeb7dce511e25245ec1c5271a2e3f7abeb
|
7
|
+
data.tar.gz: 020541f88cd22b0d6fded353b322aa26e298a2a56b7c2683a3b43b075fa0e0bd09e0deabef92890307c2085a429da8a34ea4cb86d285a6da95ecb05335962735
|
@@ -5,21 +5,26 @@ module EleetScript
|
|
5
5
|
@engine = engine
|
6
6
|
end
|
7
7
|
|
8
|
-
def call(method, *args)
|
8
|
+
def call(method, *args, &block)
|
9
9
|
eleet_args = args.map { |a| Values.to_eleet_value(a, @engine) }
|
10
|
+
eleet_args << Values.to_eleet_value(block, @engine) if block_given?
|
10
11
|
Values.to_ruby_value(@eleet_obj.call(method, eleet_args), @engine)
|
11
12
|
end
|
12
13
|
|
13
|
-
def method_missing(name, *args)
|
14
|
+
def method_missing(name, *args, &block)
|
14
15
|
if args && args.length > 0
|
15
|
-
call(name, *args)
|
16
|
+
call(name, *args, &block)
|
16
17
|
else
|
17
|
-
call(name)
|
18
|
+
call(name, &block)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
def raw
|
22
23
|
@eleet_obj
|
23
24
|
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
Values.to_ruby_value(@eleet_obj.call(:to_string), @engine)
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
data/lib/engine/engine.rb
CHANGED
@@ -3,6 +3,9 @@ require "lang/interpreter"
|
|
3
3
|
require "engine/values"
|
4
4
|
|
5
5
|
module EleetScript
|
6
|
+
class CannotCallInstanceOrClassMethodsExcpetion < Exception
|
7
|
+
end
|
8
|
+
|
6
9
|
class Engine
|
7
10
|
def initialize
|
8
11
|
@memory = Memory.new
|
@@ -10,12 +13,29 @@ module EleetScript
|
|
10
13
|
end
|
11
14
|
|
12
15
|
def execute(code)
|
13
|
-
|
16
|
+
begin
|
17
|
+
to_ruby_value(@interpreter.eval(code))
|
18
|
+
true
|
19
|
+
rescue Exception => e
|
20
|
+
false
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
16
|
-
def call(
|
17
|
-
|
18
|
-
|
24
|
+
def call(method_name, *args)
|
25
|
+
method_name = method_name.to_s
|
26
|
+
if method_name =~ /\./
|
27
|
+
throw CannotCallInstanceOrClassMethodsException.new("You cannot call a class or instance method using EleetScript::Engine.call")
|
28
|
+
end
|
29
|
+
nesting = method_name.split("::")
|
30
|
+
ns = @memory.root_namespace
|
31
|
+
method_name = nesting.pop
|
32
|
+
nesting.each do |new_ns|
|
33
|
+
ns = ns.namespace(new_ns)
|
34
|
+
end
|
35
|
+
eleet_args = args.each do |arg|
|
36
|
+
to_eleet_value(arg, self)
|
37
|
+
end
|
38
|
+
to_ruby_value(ns.current_self.call(method_name, eleet_args))
|
19
39
|
end
|
20
40
|
|
21
41
|
def get(var, raw = false)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module EleetScript
|
2
|
+
class ESProc
|
3
|
+
attr_accessor :proc
|
4
|
+
|
5
|
+
def initialize(proc, engine)
|
6
|
+
@proc = proc
|
7
|
+
@engine = engine
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(receiver, args, context)
|
11
|
+
ruby_args = args.map do |arg|
|
12
|
+
Values.to_ruby_value(arg, @engine)
|
13
|
+
end
|
14
|
+
Values.to_eleet_value(proc.call(*ruby_args), @engine)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -6,7 +6,9 @@ module EleetScript
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def call(method_name, args)
|
9
|
-
|
9
|
+
if method_name.to_sym == :to_string
|
10
|
+
method_name = :to_s
|
11
|
+
end
|
10
12
|
ruby_args = args.map { |arg| Values.to_ruby_value(arg, @engine) }
|
11
13
|
if @ruby_obj.respond_to?(method_name)
|
12
14
|
Values.to_eleet_value(@ruby_obj.send(method_name, *ruby_args), @engine)
|
data/lib/engine/values.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "bigdecimal"
|
2
2
|
require "engine/eleet_to_ruby_wrapper"
|
3
3
|
require "engine/ruby_to_eleet_wrapper"
|
4
|
+
require "engine/esproc"
|
5
|
+
require "engine/ruby_lambda"
|
4
6
|
|
5
7
|
module EleetScript
|
6
8
|
module Values
|
@@ -21,14 +23,10 @@ module EleetScript
|
|
21
23
|
memory.root_namespace["Float"].new_with_value(ruby_obj)
|
22
24
|
elsif ruby_obj.kind_of?(BigDecimal)
|
23
25
|
memory.root_namespace["Integer"].new_with_value(ruby_obj.to_i)
|
24
|
-
elsif ruby_obj.kind_of?(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
eleet_arr = ruby_obj.map do |k, v|
|
29
|
-
memory.root_namespace["Pair"].call(:new, to_eleet_value(k, memory), to_eleet_value(v, memory))
|
30
|
-
end
|
31
|
-
memory.root_namespace["List"].new_with_value(eleet_arr)
|
26
|
+
elsif ruby_obj.kind_of?(Proc)
|
27
|
+
memory.root_namespace["Lambda"].new_with_value(ESProc.new(ruby_obj, engine))
|
28
|
+
elsif ruby_obj.kind_of?(RubyLambda)
|
29
|
+
ruby_obj.es_lambda
|
32
30
|
elsif ruby_obj.nil?
|
33
31
|
memory.root_namespace["nil"]
|
34
32
|
elsif ruby_obj == true
|
@@ -44,6 +42,19 @@ module EleetScript
|
|
44
42
|
ruby_values = ["TrueClass", "FalseClass", "NilClass", "String", "Integer", "Float"]
|
45
43
|
if eleet_obj.kind_of?(RubyToEleetWrapper)
|
46
44
|
eleet_obj.instance_variable_get("@ruby_obj")
|
45
|
+
elsif eleet_obj.class_name == "Lambda"
|
46
|
+
if eleet_obj.ruby_value.is_a?(ESProc)
|
47
|
+
eleet_obj.ruby_value.proc
|
48
|
+
else
|
49
|
+
proc = RubyLambda.new do |*args|
|
50
|
+
eleet_args = args.map do |arg|
|
51
|
+
to_eleet_value(arg, engine)
|
52
|
+
end
|
53
|
+
to_ruby_value(eleet_obj.call(:call, eleet_args), engine)
|
54
|
+
end
|
55
|
+
proc.es_lambda = eleet_obj
|
56
|
+
proc
|
57
|
+
end
|
47
58
|
elsif ruby_values.include?(eleet_obj.class_name)
|
48
59
|
eleet_obj.ruby_value
|
49
60
|
else
|
data/lib/lang/interpreter.rb
CHANGED
@@ -274,7 +274,11 @@ module EleetScript
|
|
274
274
|
class DefMethodNode
|
275
275
|
def eval(context)
|
276
276
|
method_obj = EleetScriptMethod.new(method.params, method.body)
|
277
|
-
context.
|
277
|
+
if context.is_a?(ClassContext)
|
278
|
+
context.current_class.methods[method_name] = method_obj
|
279
|
+
else
|
280
|
+
context.current_self.methods[method_name] = method_obj
|
281
|
+
end
|
278
282
|
context.es_nil
|
279
283
|
end
|
280
284
|
end
|
@@ -373,13 +377,11 @@ module EleetScript
|
|
373
377
|
class NamespaceNode
|
374
378
|
def eval(context)
|
375
379
|
ns_ctx = context.namespace(name)
|
376
|
-
|
377
|
-
body.eval(ns_ctx)
|
378
|
-
else
|
380
|
+
unless ns_ctx
|
379
381
|
ns_ctx = context.new_namespace_context
|
380
382
|
context.add_namespace(name, ns_ctx)
|
381
|
-
body.eval(ns_ctx)
|
382
383
|
end
|
384
|
+
body.eval(ns_ctx)
|
383
385
|
end
|
384
386
|
end
|
385
387
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module EleetScript
|
2
2
|
class EleetScriptClassInstance < EleetScriptClassSkeleton
|
3
|
-
attr_accessor :instance_vars, :runtime_class, :context
|
3
|
+
attr_accessor :instance_vars, :runtime_class, :context, :methods
|
4
4
|
set_is_instance
|
5
5
|
|
6
6
|
def initialize(class_context, runtime_class)
|
7
|
+
@methods = MethodHash.new
|
7
8
|
@instance_vars = ProcessedKeyHash.new
|
8
9
|
@instance_vars.set_key_preprocessor do |key|
|
9
10
|
key[0] == "@" ? key[1..-1] : key
|
@@ -15,7 +16,10 @@ module EleetScript
|
|
15
16
|
|
16
17
|
def call(method_name, arguments = [])
|
17
18
|
# puts "Calling #{method_name} on #{self}"
|
18
|
-
method = @
|
19
|
+
method = @methods[method_name]
|
20
|
+
if method.nil?
|
21
|
+
method = @runtime_class.instance_lookup(method_name.to_s)
|
22
|
+
end
|
19
23
|
if method
|
20
24
|
if method.arity == 3
|
21
25
|
method.call(self, arguments, @context)
|
data/lib/lang/runtime/context.rb
CHANGED
@@ -174,7 +174,9 @@ module EleetScript
|
|
174
174
|
end
|
175
175
|
|
176
176
|
def new_namespace_context
|
177
|
-
|
177
|
+
current_self = @root_ns["Object"].new
|
178
|
+
current_class = current_self.runtime_class
|
179
|
+
ctx = NamespaceContext.new(current_self, current_class, @root_ns)
|
178
180
|
ctx.parent_context = self
|
179
181
|
ctx
|
180
182
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eleetscript
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4a
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Buck
|
@@ -20,6 +20,8 @@ files:
|
|
20
20
|
- lib/eleetscript.rb
|
21
21
|
- lib/engine/eleet_to_ruby_wrapper.rb
|
22
22
|
- lib/engine/engine.rb
|
23
|
+
- lib/engine/esproc.rb
|
24
|
+
- lib/engine/ruby_lambda.rb
|
23
25
|
- lib/engine/ruby_to_eleet_wrapper.rb
|
24
26
|
- lib/engine/values.rb
|
25
27
|
- lib/lang/grammar.y
|