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,34 @@
1
+ module AmberVM
2
+ module Functions
3
+ class Regmatch < AmberVM::Functions::Function
4
+ class << self
5
+ def execute params, env
6
+ if params.length == 2
7
+ str = params[0]
8
+ regexp = params[1].to_s
9
+ begin
10
+ regexp = Regexp.new(regexp)
11
+ rescue
12
+ return AmberVM::Classes[:error].new(1,"INVALID REGULAR EXPRESSION")
13
+ end
14
+ if regexp.match(str)
15
+ AmberVM::Classes::Boolean.new(true)
16
+ else
17
+ AmberVM::Classes::Boolean.new(false)
18
+ end
19
+ else
20
+ AmberVM::Classes[:error].new(1,"FUNCTION (#{self.class.to_s}) EXPECTS 2 ARGUMENTS BUT GOT #{params.length}")
21
+ end
22
+ end
23
+ def signature
24
+ [AmberVM::Classes::String, AmberVM::Classes::String] # adjust the signature here
25
+ end
26
+
27
+ def data_type
28
+ :boolean
29
+ end
30
+ end
31
+ register_for :regmatch
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module AmberVM
2
+ module Functions
3
+ class Rjust < Function
4
+ class << self
5
+ def execute params, env
6
+ if params.length == 2
7
+ params[0].rjust params[1]
8
+ elsif params.length == 3
9
+ params[0].rjust params[1], params[2]
10
+ else
11
+ AmberVM::Classes[:error].new(1,"#-1 FUNCTION (#{self.class.to_s}) EXPECTS 2 OR 3 ARGUMENTS BUT GOT #{params.length}")
12
+ end
13
+ end
14
+
15
+ def signature
16
+ [AmberVM::Classes::String, AmberVM::Classes::Number, AmberVM::Classes::String]
17
+ end
18
+
19
+ def data_type
20
+ :string
21
+ end
22
+ end
23
+ register_for :rjust
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ Dir[File.dirname(__FILE__) + '/string/*.rb'].each do |c|
2
+ require c
3
+ end
@@ -0,0 +1,103 @@
1
+ require 'amber/plugin'
2
+ module AmberVM
3
+ # This module holds all the functions laded for the rVM to to keep them
4
+ # organized and handle which are accassabel and which not.
5
+ module Functions
6
+ extend AmberVM::PluginHost
7
+ # Basic Parent for every function defined, it registers it to the
8
+ # PluginHost and sets up some basic functionality.
9
+ # Just parent a class to this and define +execute+ as a class function
10
+ # and it can be handled.
11
+ class Function
12
+
13
+ # Registers this as plugin and sets up the PluginHost
14
+ extend AmberVM::Plugin
15
+ plugin_host Functions
16
+
17
+ class << self
18
+ # By default every function should have a universal return value,
19
+ # this make sure it is not refused if it isn't defined correctly.
20
+ def data_type
21
+ :any
22
+ end
23
+
24
+ # We want to allow functions to call other functions without going
25
+ # through explic calls.
26
+ # Again it isn't exactly encuraged but possible if needed to.
27
+ def method_missing(m, *args, &block)
28
+ # First we check if a function with the name given is defined vor rVM
29
+ if (AmberVM::Functions::has? m)
30
+ # if so we call it with the given arguments
31
+ AmberVM::Functions[m].execute args, @env
32
+ else
33
+ # If not we let ruby do it's magic.
34
+ super(m, *args, &block)
35
+ end
36
+ end
37
+
38
+ #This is for letting he itnerpreter know that it shall interprete the arguments
39
+ #and not let the function do it itself (this is needed for logical functions)
40
+ def execargs
41
+ true
42
+ end
43
+
44
+
45
+ # Call is used to call the function it handles translating the passed
46
+ # parameters to the correct types or throw a exception if AmberVM::strict
47
+ # is set.
48
+ # This is what you want if you call a function to ensure all parameters
49
+ # are passed correctly.
50
+ def call params, env, pos = []
51
+ i = 0
52
+ pos ||= []
53
+ # We want to make sure that if we don't have signatures from the
54
+ # function we have a default signature of any to prevent automatic
55
+ # type castng in that case
56
+ sig = :any
57
+ params = params.map do |p|
58
+ # We try to get the next signature if we don't have any further we
59
+ # take the last one used so [:number, :number, :number] behaves the
60
+ # same as just [:number] as it will be repeated
61
+ sig = signature[i] || sig
62
+ # Now we check if the expected type is not ':any' nor the current
63
+ # argument has the right type.
64
+ if sig != :any and not p.is_a?(sig)
65
+ # Okay if we have AmberVM::strict set we don't allow auto type
66
+ # casting so we throw a Exception
67
+ raise "TYPE MISMATCH! expected #{sig} got #{p.class}(#{pos.join(':')}) at " if AmberVM::strict
68
+ # Otherwise we try to typecast the parameter.
69
+ p = sig.new(p)
70
+ end
71
+ # Go to the next parameter in the list
72
+ i+=1
73
+ # and make sure the former one is replaced (value of the block)
74
+ p
75
+ end if not signature.empty?
76
+ # Now we execute the function code and cache the esult
77
+ begin
78
+ r = execute(params, env)
79
+ rescue Exception => e
80
+ raise e
81
+ raise "#{e} at #{pos.join(':')}"
82
+ end
83
+ # print a debug message if needed
84
+ AmberVM::debug "#{self.inspect}: #{signature.inspect} = '#{r}'" if $DEBUG
85
+ r
86
+ end
87
+
88
+ def signature
89
+ []
90
+ end
91
+
92
+
93
+ # This executes the function code and returns the result.
94
+ #
95
+ # It must be implemented for every function used otherwise it will
96
+ # end up without doing anything.
97
+ def execute params, env
98
+ AmberVM::Classes[:error].new(1,"Function code for #{self} not implemented.")
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end