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.
- data/README +38 -0
- data/bin/ambervm +278 -0
- data/lib/amber/acts_as_rvm_type.rb +157 -0
- data/lib/amber/classes/association.rb +36 -0
- data/lib/amber/classes/block.rb +52 -0
- data/lib/amber/classes/boolean.rb +40 -0
- data/lib/amber/classes/class.rb +50 -0
- data/lib/amber/classes/error.rb +22 -0
- data/lib/amber/classes/list.rb +96 -0
- data/lib/amber/classes/null.rb +35 -0
- data/lib/amber/classes/number.rb +95 -0
- data/lib/amber/classes/object.rb +56 -0
- data/lib/amber/classes/string.rb +79 -0
- data/lib/amber/classes.rb +113 -0
- data/lib/amber/environment.rb +251 -0
- data/lib/amber/fukubukuro/ecma_core.rb +409 -0
- data/lib/amber/fukubukuro.rb +866 -0
- data/lib/amber/functions/all.rb +3 -0
- data/lib/amber/functions/array/append.rb +50 -0
- data/lib/amber/functions/array/at.rb +50 -0
- data/lib/amber/functions/array/set_at.rb +50 -0
- data/lib/amber/functions/array.rb +30 -0
- data/lib/amber/functions/association/assoc_get.rb +55 -0
- data/lib/amber/functions/association/assoc_set.rb +56 -0
- data/lib/amber/functions/bitwise/bitwise_and.rb +41 -0
- data/lib/amber/functions/bitwise/bitwise_not.rb +41 -0
- data/lib/amber/functions/bitwise/bitwise_or.rb +41 -0
- data/lib/amber/functions/bitwise/bitwise_xor.rb +41 -0
- data/lib/amber/functions/bitwise.rb +3 -0
- data/lib/amber/functions/collection/get.rb +66 -0
- data/lib/amber/functions/collection/set.rb +67 -0
- data/lib/amber/functions/collection/size.rb +54 -0
- data/lib/amber/functions/general/cmp.rb +43 -0
- data/lib/amber/functions/general/eq.rb +45 -0
- data/lib/amber/functions/general/gt.rb +45 -0
- data/lib/amber/functions/general/gte.rb +45 -0
- data/lib/amber/functions/general/lt.rb +45 -0
- data/lib/amber/functions/general/lte.rb +45 -0
- data/lib/amber/functions/general/neq.rb +45 -0
- data/lib/amber/functions/general/type.rb +43 -0
- data/lib/amber/functions/general.rb +3 -0
- data/lib/amber/functions/io/print.rb +45 -0
- data/lib/amber/functions/io.rb +3 -0
- data/lib/amber/functions/list/align.rb +73 -0
- data/lib/amber/functions/list/join.rb +45 -0
- data/lib/amber/functions/list/map.rb +58 -0
- data/lib/amber/functions/list/split.rb +55 -0
- data/lib/amber/functions/list.rb +3 -0
- data/lib/amber/functions/logic/and.rb +55 -0
- data/lib/amber/functions/logic/not.rb +40 -0
- data/lib/amber/functions/logic/or.rb +50 -0
- data/lib/amber/functions/logic.rb +3 -0
- data/lib/amber/functions/math/abs.rb +39 -0
- data/lib/amber/functions/math/acos.rb +39 -0
- data/lib/amber/functions/math/add.rb +40 -0
- data/lib/amber/functions/math/asin.rb +39 -0
- data/lib/amber/functions/math/atan.rb +39 -0
- data/lib/amber/functions/math/ceil.rb +39 -0
- data/lib/amber/functions/math/cos.rb +39 -0
- data/lib/amber/functions/math/dec.rb +39 -0
- data/lib/amber/functions/math/div.rb +44 -0
- data/lib/amber/functions/math/exp.rb +39 -0
- data/lib/amber/functions/math/floor.rb +39 -0
- data/lib/amber/functions/math/inc.rb +39 -0
- data/lib/amber/functions/math/log.rb +39 -0
- data/lib/amber/functions/math/mod.rb +41 -0
- data/lib/amber/functions/math/mul.rb +43 -0
- data/lib/amber/functions/math/neg.rb +43 -0
- data/lib/amber/functions/math/power.rb +43 -0
- data/lib/amber/functions/math/rand.rb +36 -0
- data/lib/amber/functions/math/round.rb +39 -0
- data/lib/amber/functions/math/shl.rb +41 -0
- data/lib/amber/functions/math/shr.rb +41 -0
- data/lib/amber/functions/math/sin.rb +39 -0
- data/lib/amber/functions/math/sub.rb +43 -0
- data/lib/amber/functions/math/tan.rb +39 -0
- data/lib/amber/functions/math.rb +3 -0
- data/lib/amber/functions/objects/send.rb +22 -0
- data/lib/amber/functions/rails/print.rb +44 -0
- data/lib/amber/functions/rails.rb +3 -0
- data/lib/amber/functions/string/ansi.rb +24 -0
- data/lib/amber/functions/string/capstr.rb +23 -0
- data/lib/amber/functions/string/center.rb +25 -0
- data/lib/amber/functions/string/chr.rb +16 -0
- data/lib/amber/functions/string/ljust.rb +26 -0
- data/lib/amber/functions/string/regmatch.rb +34 -0
- data/lib/amber/functions/string/rjust.rb +26 -0
- data/lib/amber/functions/string.rb +3 -0
- data/lib/amber/functions.rb +103 -0
- data/lib/amber/interpreter.rb +1380 -0
- data/lib/amber/languages/brainfuck.rb +153 -0
- data/lib/amber/languages/ecma/compiler.rb +1661 -0
- data/lib/amber/languages/ecma/core-math.js +67 -0
- data/lib/amber/languages/ecma/core-objects.js +57 -0
- data/lib/amber/languages/ecma.rb +9 -0
- data/lib/amber/languages/ecma_fuku/compiler.rb +1622 -0
- data/lib/amber/languages/ecma_fuku/core-math.js +67 -0
- data/lib/amber/languages/ecma_fuku/core-objects.js +56 -0
- data/lib/amber/languages/ecma_fuku.rb +13 -0
- data/lib/amber/languages/math/compiler.rb +70 -0
- data/lib/amber/languages/math/tokenizer.rb +69 -0
- data/lib/amber/languages/math/tree.rb +110 -0
- data/lib/amber/languages/math.rb +26 -0
- data/lib/amber/languages.rb +99 -0
- data/lib/amber/library.rb +79 -0
- data/lib/amber/optimisation.rb +299 -0
- data/lib/amber/plugin.rb +337 -0
- data/lib/amber/rails.rb +90 -0
- data/lib/amber.rb +106 -0
- data/spec/amber/class_spec.rb +27 -0
- data/spec/amber/enviroment_spec.rb +61 -0
- data/spec/amber/function_spec.rb +25 -0
- data/spec/amber/functions/association/assoc_get_spec.rb +41 -0
- data/spec/amber/functions/association/assoc_set_spec.rb +43 -0
- data/spec/amber/functions/collection/get_spec.rb +12 -0
- data/spec/amber/functions/collection/set_spec.rb +10 -0
- data/spec/amber/functions/collection/size_spec.rb +10 -0
- data/spec/amber/functions/list/split_spec.rb +47 -0
- data/spec/amber/functions/string/ansi_spec.rb +44 -0
- data/spec/amber/functions/string/capstr_spec.rb +42 -0
- data/spec/amber/functions/string/center_spec.rb +49 -0
- data/spec/amber/functions/string/ljust_spec.rb +49 -0
- data/spec/amber/functions/string/regmatch_spec.rb +52 -0
- data/spec/amber/functions/string/rjust_spec.rb +49 -0
- data/spec/amber/interpreter/assignment_spec.rb +22 -0
- data/spec/amber/interpreter/condition_spec.rb +103 -0
- data/spec/amber/interpreter/constant_spec.rb +31 -0
- data/spec/amber/interpreter/core_call_spec.rb +72 -0
- data/spec/amber/interpreter/interpreter_spec.rb +11 -0
- data/spec/amber/interpreter/parameter_spec.rb +24 -0
- data/spec/amber/interpreter/sequence_spec.rb +47 -0
- data/spec/amber/interpreter/variable_spec.rb +24 -0
- data/spec/amber/plugin_spec.rb +10 -0
- data/spec/classes/atom/association_spec.rb +39 -0
- data/spec/classes/atom/block_spec.rb +25 -0
- data/spec/classes/atom/boolean_spec.rb +67 -0
- data/spec/classes/atom/error_spec.rb +43 -0
- data/spec/classes/atom/list_spec.rb +68 -0
- data/spec/classes/atom/number_spec.rb +132 -0
- data/spec/classes/atom/string_spec.rb +175 -0
- data/spec/languages/ecma/ecma_array_spec.rb +79 -0
- data/spec/languages/ecma/ecma_closure_spec.rb +38 -0
- data/spec/languages/ecma/ecma_literals_spec.rb +71 -0
- data/spec/languages/ecma/ecma_objects_spec.rb +165 -0
- data/spec/languages/ecma/ecma_old_spec.rb +540 -0
- data/spec/languages/ecma/ecma_spec.rb +64 -0
- data/spec/languages/ecma_fuku/ecma_array_spec.rb +61 -0
- data/spec/languages/ecma_fuku/ecma_closure_spec.rb +33 -0
- data/spec/languages/ecma_fuku/ecma_function_spec.rb +84 -0
- data/spec/languages/ecma_fuku/ecma_literals_spec.rb +55 -0
- data/spec/languages/ecma_fuku/ecma_objects_spec.rb +133 -0
- data/spec/languages/ecma_fuku/ecma_old_spec.rb +415 -0
- data/spec/languages/ecma_fuku/ecma_operator_spec.rb +33 -0
- data/spec/languages/ecma_fuku/ecma_spec.rb +52 -0
- data/spec/languages/math/compiler_spec.rb +49 -0
- data/spec/languages/math/tokenizer_spec.rb +73 -0
- data/spec/languages/math/tree_spec.rb +153 -0
- 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,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
|