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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b389376d6b760755d71c21358f5f83ddd6d1df68
4
- data.tar.gz: 237dbdbc6e4c7d828533854c89c5e6bf0b70e950
3
+ metadata.gz: 3cb1ebbd98b6434ccb190f60658378512af2518c
4
+ data.tar.gz: fef85a1f7e2f7d3ec4b981efff27d35ce24d0f1e
5
5
  SHA512:
6
- metadata.gz: 50c4993924720018db462009faa0e377a8bbfac7578a8507d5b9cead320f1be75856362692eb18c90a8fe377a6f84a5ecd5bbd0f693180e8b9bd625808ce5faa
7
- data.tar.gz: 80045fa7aebe6fc5bc389e08891549b47a4cc16aeeff652b932877d616d15fc27ff7f344914aefcee3f9fdf066caaf15dd4a6d349efcddc71718cf2a14f7c173
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
- to_ruby_value(@interpreter.eval(code))
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(method, *args)
17
- # TODO: Finish
18
- to_ruby_value(@interpreter.eval("#{method.to_s}"))
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
@@ -0,0 +1,5 @@
1
+ module EleetScript
2
+ class RubyLambda < Proc
3
+ attr_accessor :es_lambda
4
+ end
5
+ end
@@ -6,7 +6,9 @@ module EleetScript
6
6
  end
7
7
 
8
8
  def call(method_name, args)
9
- binding.pry
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?(Array)
25
- eleet_arr = ruby_obj.map { |v| to_eleet_value(v, memory) }
26
- memory.root_namespace["List"].new_with_value(eleet_arr)
27
- elsif ruby_obj.kind_of?(Hash)
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
@@ -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.current_class.methods[method_name] = method_obj
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
- if ns_ctx
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 = @runtime_class.instance_lookup(method_name.to_s)
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)
@@ -174,7 +174,9 @@ module EleetScript
174
174
  end
175
175
 
176
176
  def new_namespace_context
177
- ctx = NamespaceContext.new(@current_self, @current_class, @root_ns)
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.3a
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