AmberVM 0.0.19

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 (158) hide show
  1. data/README +38 -0
  2. data/bin/ambervm +278 -0
  3. data/lib/amber/acts_as_rvm_type.rb +157 -0
  4. data/lib/amber/classes/association.rb +36 -0
  5. data/lib/amber/classes/block.rb +52 -0
  6. data/lib/amber/classes/boolean.rb +40 -0
  7. data/lib/amber/classes/class.rb +50 -0
  8. data/lib/amber/classes/error.rb +22 -0
  9. data/lib/amber/classes/list.rb +96 -0
  10. data/lib/amber/classes/null.rb +35 -0
  11. data/lib/amber/classes/number.rb +95 -0
  12. data/lib/amber/classes/object.rb +56 -0
  13. data/lib/amber/classes/string.rb +79 -0
  14. data/lib/amber/classes.rb +113 -0
  15. data/lib/amber/environment.rb +251 -0
  16. data/lib/amber/fukubukuro/ecma_core.rb +409 -0
  17. data/lib/amber/fukubukuro.rb +866 -0
  18. data/lib/amber/functions/all.rb +3 -0
  19. data/lib/amber/functions/array/append.rb +50 -0
  20. data/lib/amber/functions/array/at.rb +50 -0
  21. data/lib/amber/functions/array/set_at.rb +50 -0
  22. data/lib/amber/functions/array.rb +30 -0
  23. data/lib/amber/functions/association/assoc_get.rb +55 -0
  24. data/lib/amber/functions/association/assoc_set.rb +56 -0
  25. data/lib/amber/functions/bitwise/bitwise_and.rb +41 -0
  26. data/lib/amber/functions/bitwise/bitwise_not.rb +41 -0
  27. data/lib/amber/functions/bitwise/bitwise_or.rb +41 -0
  28. data/lib/amber/functions/bitwise/bitwise_xor.rb +41 -0
  29. data/lib/amber/functions/bitwise.rb +3 -0
  30. data/lib/amber/functions/collection/get.rb +66 -0
  31. data/lib/amber/functions/collection/set.rb +67 -0
  32. data/lib/amber/functions/collection/size.rb +54 -0
  33. data/lib/amber/functions/general/cmp.rb +43 -0
  34. data/lib/amber/functions/general/eq.rb +45 -0
  35. data/lib/amber/functions/general/gt.rb +45 -0
  36. data/lib/amber/functions/general/gte.rb +45 -0
  37. data/lib/amber/functions/general/lt.rb +45 -0
  38. data/lib/amber/functions/general/lte.rb +45 -0
  39. data/lib/amber/functions/general/neq.rb +45 -0
  40. data/lib/amber/functions/general/type.rb +43 -0
  41. data/lib/amber/functions/general.rb +3 -0
  42. data/lib/amber/functions/io/print.rb +45 -0
  43. data/lib/amber/functions/io.rb +3 -0
  44. data/lib/amber/functions/list/align.rb +73 -0
  45. data/lib/amber/functions/list/join.rb +45 -0
  46. data/lib/amber/functions/list/map.rb +58 -0
  47. data/lib/amber/functions/list/split.rb +55 -0
  48. data/lib/amber/functions/list.rb +3 -0
  49. data/lib/amber/functions/logic/and.rb +55 -0
  50. data/lib/amber/functions/logic/not.rb +40 -0
  51. data/lib/amber/functions/logic/or.rb +50 -0
  52. data/lib/amber/functions/logic.rb +3 -0
  53. data/lib/amber/functions/math/abs.rb +39 -0
  54. data/lib/amber/functions/math/acos.rb +39 -0
  55. data/lib/amber/functions/math/add.rb +40 -0
  56. data/lib/amber/functions/math/asin.rb +39 -0
  57. data/lib/amber/functions/math/atan.rb +39 -0
  58. data/lib/amber/functions/math/ceil.rb +39 -0
  59. data/lib/amber/functions/math/cos.rb +39 -0
  60. data/lib/amber/functions/math/dec.rb +39 -0
  61. data/lib/amber/functions/math/div.rb +44 -0
  62. data/lib/amber/functions/math/exp.rb +39 -0
  63. data/lib/amber/functions/math/floor.rb +39 -0
  64. data/lib/amber/functions/math/inc.rb +39 -0
  65. data/lib/amber/functions/math/log.rb +39 -0
  66. data/lib/amber/functions/math/mod.rb +41 -0
  67. data/lib/amber/functions/math/mul.rb +43 -0
  68. data/lib/amber/functions/math/neg.rb +43 -0
  69. data/lib/amber/functions/math/power.rb +43 -0
  70. data/lib/amber/functions/math/rand.rb +36 -0
  71. data/lib/amber/functions/math/round.rb +39 -0
  72. data/lib/amber/functions/math/shl.rb +41 -0
  73. data/lib/amber/functions/math/shr.rb +41 -0
  74. data/lib/amber/functions/math/sin.rb +39 -0
  75. data/lib/amber/functions/math/sub.rb +43 -0
  76. data/lib/amber/functions/math/tan.rb +39 -0
  77. data/lib/amber/functions/math.rb +3 -0
  78. data/lib/amber/functions/objects/send.rb +22 -0
  79. data/lib/amber/functions/rails/print.rb +44 -0
  80. data/lib/amber/functions/rails.rb +3 -0
  81. data/lib/amber/functions/string/ansi.rb +24 -0
  82. data/lib/amber/functions/string/capstr.rb +23 -0
  83. data/lib/amber/functions/string/center.rb +25 -0
  84. data/lib/amber/functions/string/chr.rb +16 -0
  85. data/lib/amber/functions/string/ljust.rb +26 -0
  86. data/lib/amber/functions/string/regmatch.rb +34 -0
  87. data/lib/amber/functions/string/rjust.rb +26 -0
  88. data/lib/amber/functions/string.rb +3 -0
  89. data/lib/amber/functions.rb +103 -0
  90. data/lib/amber/interpreter.rb +1380 -0
  91. data/lib/amber/languages/brainfuck.rb +153 -0
  92. data/lib/amber/languages/ecma/compiler.rb +1661 -0
  93. data/lib/amber/languages/ecma/core-math.js +67 -0
  94. data/lib/amber/languages/ecma/core-objects.js +57 -0
  95. data/lib/amber/languages/ecma.rb +9 -0
  96. data/lib/amber/languages/ecma_fuku/compiler.rb +1622 -0
  97. data/lib/amber/languages/ecma_fuku/core-math.js +67 -0
  98. data/lib/amber/languages/ecma_fuku/core-objects.js +56 -0
  99. data/lib/amber/languages/ecma_fuku.rb +13 -0
  100. data/lib/amber/languages/math/compiler.rb +70 -0
  101. data/lib/amber/languages/math/tokenizer.rb +69 -0
  102. data/lib/amber/languages/math/tree.rb +110 -0
  103. data/lib/amber/languages/math.rb +26 -0
  104. data/lib/amber/languages.rb +99 -0
  105. data/lib/amber/library.rb +79 -0
  106. data/lib/amber/optimisation.rb +299 -0
  107. data/lib/amber/plugin.rb +337 -0
  108. data/lib/amber/rails.rb +90 -0
  109. data/lib/amber.rb +106 -0
  110. data/spec/amber/class_spec.rb +27 -0
  111. data/spec/amber/enviroment_spec.rb +61 -0
  112. data/spec/amber/function_spec.rb +25 -0
  113. data/spec/amber/functions/association/assoc_get_spec.rb +41 -0
  114. data/spec/amber/functions/association/assoc_set_spec.rb +43 -0
  115. data/spec/amber/functions/collection/get_spec.rb +12 -0
  116. data/spec/amber/functions/collection/set_spec.rb +10 -0
  117. data/spec/amber/functions/collection/size_spec.rb +10 -0
  118. data/spec/amber/functions/list/split_spec.rb +47 -0
  119. data/spec/amber/functions/string/ansi_spec.rb +44 -0
  120. data/spec/amber/functions/string/capstr_spec.rb +42 -0
  121. data/spec/amber/functions/string/center_spec.rb +49 -0
  122. data/spec/amber/functions/string/ljust_spec.rb +49 -0
  123. data/spec/amber/functions/string/regmatch_spec.rb +52 -0
  124. data/spec/amber/functions/string/rjust_spec.rb +49 -0
  125. data/spec/amber/interpreter/assignment_spec.rb +22 -0
  126. data/spec/amber/interpreter/condition_spec.rb +103 -0
  127. data/spec/amber/interpreter/constant_spec.rb +31 -0
  128. data/spec/amber/interpreter/core_call_spec.rb +72 -0
  129. data/spec/amber/interpreter/interpreter_spec.rb +11 -0
  130. data/spec/amber/interpreter/parameter_spec.rb +24 -0
  131. data/spec/amber/interpreter/sequence_spec.rb +47 -0
  132. data/spec/amber/interpreter/variable_spec.rb +24 -0
  133. data/spec/amber/plugin_spec.rb +10 -0
  134. data/spec/classes/atom/association_spec.rb +39 -0
  135. data/spec/classes/atom/block_spec.rb +25 -0
  136. data/spec/classes/atom/boolean_spec.rb +67 -0
  137. data/spec/classes/atom/error_spec.rb +43 -0
  138. data/spec/classes/atom/list_spec.rb +68 -0
  139. data/spec/classes/atom/number_spec.rb +132 -0
  140. data/spec/classes/atom/string_spec.rb +175 -0
  141. data/spec/languages/ecma/ecma_array_spec.rb +79 -0
  142. data/spec/languages/ecma/ecma_closure_spec.rb +38 -0
  143. data/spec/languages/ecma/ecma_literals_spec.rb +71 -0
  144. data/spec/languages/ecma/ecma_objects_spec.rb +165 -0
  145. data/spec/languages/ecma/ecma_old_spec.rb +540 -0
  146. data/spec/languages/ecma/ecma_spec.rb +64 -0
  147. data/spec/languages/ecma_fuku/ecma_array_spec.rb +61 -0
  148. data/spec/languages/ecma_fuku/ecma_closure_spec.rb +33 -0
  149. data/spec/languages/ecma_fuku/ecma_function_spec.rb +84 -0
  150. data/spec/languages/ecma_fuku/ecma_literals_spec.rb +55 -0
  151. data/spec/languages/ecma_fuku/ecma_objects_spec.rb +133 -0
  152. data/spec/languages/ecma_fuku/ecma_old_spec.rb +415 -0
  153. data/spec/languages/ecma_fuku/ecma_operator_spec.rb +33 -0
  154. data/spec/languages/ecma_fuku/ecma_spec.rb +52 -0
  155. data/spec/languages/math/compiler_spec.rb +49 -0
  156. data/spec/languages/math/tokenizer_spec.rb +73 -0
  157. data/spec/languages/math/tree_spec.rb +153 -0
  158. metadata +225 -0
@@ -0,0 +1,96 @@
1
+ module AmberVM
2
+ module Classes
3
+ class List < AmberVM::Classes::Class
4
+ plugin_host Classes
5
+ register_for :list
6
+ @@type = :list
7
+ attr_reader :sepperator
8
+
9
+ def [] i
10
+ if not @array[i]
11
+ @array[i] = AmberVM::Interpreter::VariableStorage.new(nil)
12
+ end
13
+ @array[i]
14
+ end
15
+
16
+ def []= i,v
17
+ v = v.val if v.is_a? AmberVM::Interpreter::VariableStorage
18
+ if not @array[i]
19
+ @array[i] = AmberVM::Interpreter::VariableStorage.new(v)
20
+ else
21
+ @array[i].val = v
22
+ end
23
+ @array[i]
24
+ end
25
+
26
+ def data_type
27
+ :list
28
+ end
29
+
30
+ def array
31
+ @array
32
+ end
33
+
34
+ def variables
35
+ @variables ||= super.merge({
36
+ 'size' => AmberVM::Interpreter::VariableStorageCallback.new(self,:size,false),
37
+ 'length' => AmberVM::Interpreter::VariableStorageCallback.new(self,:size,false)
38
+ })
39
+ end
40
+
41
+ def initialize source = [], sepperator = ' '
42
+ super()
43
+ @array = Array.new()
44
+ if source.is_a?(::String) # Okay we've to hack here to get sure we get the /real/ String
45
+ source = source.split sepperator
46
+ elsif !source.is_a?(Array)
47
+ source = [source]
48
+ end
49
+ source.map! {|i| AmberVM::Interpreter::makevs(i)}
50
+ @array.concat source
51
+ @sepperator = sepperator.to_s
52
+ end
53
+
54
+ def resplit(sep)
55
+ sep = sep.to_s
56
+ if sep != @sepperator
57
+ t = @array.map{|i| i.val}.join(@sepperator)
58
+ @sepperator = sep
59
+ @array.clear
60
+ @array.concat(t.split(sep).map{|i| AmberVM::Interpreter::makevs(i)})
61
+ end
62
+ end
63
+
64
+ def == v
65
+ if v.is_a? List
66
+ @array == v.array and @sepperator == v.sepperator
67
+ else
68
+ @array.map{|i| i.val} == v
69
+ end
70
+ end
71
+
72
+ def + v
73
+ if v.is_a? List
74
+ @array + v.array
75
+ else
76
+ @array + v
77
+ end
78
+ end
79
+
80
+ def size
81
+ @array.size
82
+ end
83
+
84
+ def sepperator= sep
85
+ @sepperator = sep.to_s
86
+ end
87
+
88
+ def to_s
89
+ if @sepperator
90
+ @array.map{|i| i.val.to_s}.join(@sepperator)
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,35 @@
1
+ module AmberVM
2
+ module Classes
3
+ class Null < AmberVM::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?(AmberVM::Classes::Null)
16
+ true
17
+ else
18
+ false
19
+ end
20
+ end
21
+
22
+ def initialize value
23
+ super()
24
+ end
25
+
26
+ def to_s
27
+ 'null'
28
+ end
29
+
30
+ def is_true?
31
+ false
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,95 @@
1
+ module AmberVM
2
+ module Classes
3
+ class Number < Class
4
+ register_for :number
5
+ @@type = :number
6
+
7
+ # Fix for comparing numbers.
8
+ # We need to have the values hash here.
9
+ def hash
10
+ @value.hash
11
+ end
12
+
13
+ def eql?(o)
14
+ if o.is_a?(AmberVM::Classes::Number)
15
+ @value == o.value
16
+ elsif o.is_a?(@value.class)
17
+ @value == o
18
+ else
19
+ false
20
+ end
21
+ end
22
+
23
+
24
+
25
+ def initialize value
26
+ super()
27
+ if value.is_a? Numeric
28
+ @value = value
29
+ elsif value.respond_to?(:to_f) and ((v = value.to_f) != value.to_i)
30
+ @value = v
31
+ elsif value.respond_to?(:to_i)
32
+ @value = value.to_i
33
+ else
34
+ @value = "#{value}".to_f
35
+ if @value == @value.to_i
36
+ @value = @value.to_i
37
+ end
38
+ end
39
+ end
40
+
41
+ def == v
42
+ @value == v
43
+ end
44
+
45
+ def to_s
46
+ @value.to_s
47
+ end
48
+
49
+ def to_i
50
+ @value.to_i
51
+ end
52
+
53
+ def to_f
54
+ @value.to_f
55
+ end
56
+
57
+ def is_true?
58
+ @value != 0
59
+ end
60
+
61
+ def value
62
+ @value
63
+ end
64
+
65
+ def pretty_print(q)
66
+ q.text @value.to_s
67
+ end
68
+
69
+ #alias :respond_to_number :respond_to?
70
+ #def respond_to?(symbol,include_private = false)
71
+ # respond_to_number(symbol,include_private)
72
+ #end
73
+
74
+ alias :method_missing_number :method_missing
75
+
76
+ def method_missing m, *args, &block
77
+ if @value.respond_to? m
78
+ args.map! do |a|
79
+ if a.is_a? Number
80
+ a.value
81
+ else
82
+ Number.new(a).value
83
+ end
84
+ end
85
+ r = @value.send(m,*args)
86
+ r = Number.new(r) if r.is_a? Numeric
87
+ r
88
+ else
89
+ #raise "beep!#{m}, #{args}, #{block}"
90
+ super(m, *args, &block)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,56 @@
1
+ module AmberVM
2
+ module Classes
3
+ class Object < AmberVM::Classes::Class
4
+ register_for :object
5
+ attr_reader :variables
6
+ attr_reader :object_class
7
+
8
+ def env
9
+ @env
10
+ end
11
+
12
+ class VariableProxy
13
+ def initialize env
14
+ @env = env
15
+ end
16
+ def [] n
17
+ @env[n]
18
+ end
19
+
20
+ def []= n,v
21
+ @env[n] = v
22
+ end
23
+
24
+ def each &block
25
+ @env.data[:locals].each(&block)
26
+ end
27
+
28
+ def keys
29
+ @env.data[:locals].keys
30
+ end
31
+ end
32
+
33
+
34
+ def initialize objectClass, parent_env = nil
35
+ super()
36
+ @object_class = objectClass
37
+ @env = AmberVM::Interpreter::Environment.new({:locals => {:self => self}}, parent_env)
38
+ @variables = VariableProxy.new(@env)
39
+ end
40
+
41
+
42
+ def obj_send(method, params, env)
43
+ m = @variables[method] || @object_class.variables[method]
44
+ raise "Unknown method #{method} for object #{self}" if not m or not m.respond_to?(:call)
45
+ AmberVM::debug "Calling object function method #{method}." if $DEBUG
46
+ env = AmberVM::Interpreter::Environment.new({:params => params||[], :locals => @variables}, env)
47
+ m.call(params, env)
48
+ end
49
+
50
+ def data_type
51
+ :object
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,79 @@
1
+ module AmberVM
2
+ module Classes
3
+ class String < ::String
4
+ extend Plugin
5
+ plugin_host Classes
6
+ register_for :string
7
+ @@type = :string
8
+ ANSI_MAP = {
9
+ 'h' => 1, 'H' => 22,
10
+ 'u' => 4, 'U' => 24,
11
+ 'f' => 5, 'f' => 25,
12
+ 'i' => 7, 'I' => 27,
13
+ 'n' => 0,
14
+ 'x' => 30, 'X' => 40,
15
+ 'r' => 31, 'R' => 41,
16
+ 'g' => 32, 'G' => 42,
17
+ 'y' => 33, 'Y' => 42,
18
+ 'b' => 34, 'B' => 44,
19
+ 'm' => 35, 'M' => 45,
20
+ 'c' => 36, 'C' => 45,
21
+ 'w' => 37, 'W' => 47,
22
+ } unless defined?(ANSI_MAP)
23
+
24
+ def initialize val = ""
25
+ super val.to_s
26
+ end
27
+
28
+ def is_true?
29
+ not empty?
30
+ end
31
+
32
+ def data_type
33
+ :string
34
+ end
35
+
36
+ def center width, char = " "
37
+ c = char[0..0]
38
+ c = ' ' if c.empty?
39
+ width = width.to_i - self.length
40
+ width = 0 if width < 0
41
+ l = width / 2
42
+ r = width - l
43
+ self.class.new((c*l) + self + (c*r))
44
+ end
45
+
46
+ def ljust width, char = " "
47
+ c = char[0..0]
48
+ c = ' ' if c.empty?
49
+ width = width.to_i - self.length
50
+ width = 0 if width < 0
51
+ self.class.new(self + (c*width))
52
+ end
53
+
54
+ def rjust width, char = " "
55
+ c = char[0..0]
56
+ c = ' ' if c.empty?
57
+ width = width.to_i - self.length
58
+ width = 0 if width < 0
59
+ self.class.new((c*width) + self)
60
+ end
61
+
62
+ def + v
63
+ v = v.to_s if not v.is_a?(String)
64
+ self.class.new(super(v))
65
+ end
66
+
67
+ def ansi colorset
68
+ colorset.gsub!(/[^#{ANSI_MAP.keys.join('')}]/,'')
69
+ colorcode = colorset.split('').map { |c| ANSI_MAP[c].to_s}.join(';')
70
+ c = "\e[#{colorcode}m"
71
+ self.class.new("#{c}#{self.gsub("\e[0m",c)}\e[0m")
72
+ end
73
+
74
+ def value
75
+ to_s
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,113 @@
1
+ # = classes.rb - Class Plugin Library
2
+ #
3
+ # Copyright (C) 2008 Heinz N. Gies (heinz@licenser.net)
4
+ #
5
+ # This file is published under the MIT Licenser, see LICENSE for details.
6
+ #
7
+
8
+ require 'amber/plugin'
9
+ require 'amber/functions'
10
+ module AmberVM
11
+ # This module is the basic class container, classes are supposed to be
12
+ # used by this as in: AmberVM::Classes[<class id>] this guarnatees that,
13
+ # in the case of overwriting a standard class the code still works.
14
+ #
15
+ # == Example
16
+ #
17
+ # === Creating a string calss
18
+ #
19
+ # require 'amber/classes'
20
+ # string = AmberVM::Classes[:string].new
21
+ module Classes
22
+ extend AmberVM::PluginHost
23
+ default :string
24
+
25
+ # The Parent for new classes, meant never to be used alone.
26
+ # It takes care of registering the calss to the PluginHost,
27
+ # as well of basic functionality.
28
+ #
29
+ # Also it offers access to the function plugins to be used
30
+ # as functions within the commands.
31
+ #
32
+ # == Examples
33
+ #
34
+ # === COMPLEX NUMBERS
35
+ #
36
+ # # file: amber/classes/math/complex.rb
37
+ # require 'amber/classes'
38
+ # module AmberVM
39
+ # module Classes
40
+ # class Complex < AmberVM::Classes::Class
41
+ # def initialize i, n
42
+ # @i = i
43
+ # @j = j
44
+ # end
45
+ # #...
46
+ # end
47
+ # end
48
+ # end
49
+ class Class
50
+
51
+ # We make classes a Plugin and set the plugin host to Classes s it can
52
+ # handle the details for it.
53
+ extend AmberVM::Plugin
54
+ plugin_host Classes
55
+
56
+ # Basic functions hash for classes so every class at least can respond
57
+ # to a +functions+ call.
58
+ def functions
59
+ @functions ||= {}
60
+ end
61
+
62
+ # Basic variables hash for classes so every class at least can respond
63
+ # to a +variables+ call.
64
+ def variables
65
+ @variables ||= {:self => self}
66
+ end
67
+
68
+
69
+ # Every class is by default treated as beeing true when not defined
70
+ # otherwise.
71
+ # This makes sure that calling boolean functions on classes will always
72
+ # return a usefull result.
73
+ # So it can be redefinde to say, have 0 act as false if this is wanted.
74
+ def is_true?
75
+ true
76
+ end
77
+
78
+ # This defines the type of the class, it defaults to :any
79
+ # it is important for tying and type conversion, as long as it
80
+ # behaves like a string, it can look like a sting ;)
81
+ def data_type
82
+ :any
83
+ end
84
+
85
+ def obj_send(method, params, env)
86
+ @env ||= AmberVM::Interpreter::Environment.new({:params => params||[], :locals => variables, :functions => functions}, env)
87
+ m = @functions[method]
88
+ raise "Unknown method #{method} for object #{self}" if not m
89
+ AmberVM::debug "Calling object function method #{method}."
90
+ m.call(params, @env)
91
+ end
92
+
93
+ # Redefinding the method to allow using self defined functions
94
+ # within classes - while this is discuraged it still is possible.
95
+ def method_missing(m, *args, &block)
96
+ # Check if the functions PluginHost knwos about the called function
97
+ if (AmberVM::Functions::has? m)
98
+ # Calls the function with given args and environment that is,
99
+ # hopefully defiend in the calling class.
100
+ AmberVM::Functions[m].execute args, @env
101
+ else
102
+ # If the function is not known we call the usual method missing
103
+ # method.
104
+ super(m, *args, &block)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ Dir[File.dirname(__FILE__) + '/classes/*.rb'].each do |c|
112
+ require 'amber/classes/' + File.basename(c)
113
+ end