nydp 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +77 -56
- data/lib/lisp/core-000.nydp +1 -1
- data/lib/lisp/core-010-precompile.nydp +49 -29
- data/lib/lisp/core-012-utils.nydp +12 -8
- data/lib/lisp/core-015-documentation.nydp +41 -15
- data/lib/lisp/core-017-builtin-dox.nydp +621 -100
- data/lib/lisp/core-020-utils.nydp +33 -6
- data/lib/lisp/core-025-warnings.nydp +1 -1
- data/lib/lisp/core-030-syntax.nydp +64 -48
- data/lib/lisp/core-035-flow-control.nydp +20 -28
- data/lib/lisp/core-037-list-utils.nydp +84 -21
- data/lib/lisp/core-040-utils.nydp +8 -5
- data/lib/lisp/core-041-string-utils.nydp +17 -11
- data/lib/lisp/core-043-list-utils.nydp +140 -77
- data/lib/lisp/core-045-dox-utils.nydp +1 -0
- data/lib/lisp/core-050-test-runner.nydp +8 -12
- data/lib/lisp/core-070-prefix-list.nydp +19 -15
- data/lib/lisp/core-080-pretty-print.nydp +13 -5
- data/lib/lisp/core-090-hook.nydp +11 -11
- data/lib/lisp/core-100-utils.nydp +51 -66
- data/lib/lisp/core-110-hash-utils.nydp +34 -7
- data/lib/lisp/core-120-settings.nydp +14 -9
- data/lib/lisp/core-130-validations.nydp +28 -13
- data/lib/lisp/core-900-benchmarking.nydp +420 -47
- data/lib/lisp/tests/000-empty-args-examples.nydp +5 -0
- data/lib/lisp/tests/andify-examples.nydp +1 -1
- data/lib/lisp/tests/auto-hash-examples.nydp +6 -1
- data/lib/lisp/tests/best-examples.nydp +1 -1
- data/lib/lisp/tests/boot-tests.nydp +1 -1
- data/lib/lisp/tests/date-examples.nydp +129 -102
- data/lib/lisp/tests/destructuring-examples.nydp +1 -1
- data/lib/lisp/tests/dox-tests.nydp +2 -2
- data/lib/lisp/tests/hash-examples.nydp +58 -33
- data/lib/lisp/tests/list-tests.nydp +137 -1
- data/lib/lisp/tests/pretty-print-tests.nydp +12 -0
- data/lib/lisp/tests/rotate-2d-array-examples.nydp +26 -0
- data/lib/lisp/tests/sort-examples.nydp +5 -5
- data/lib/lisp/tests/string-tests.nydp +30 -5
- data/lib/lisp/tests/syntax-tests.nydp +10 -2
- data/lib/lisp/tests/time-examples.nydp +8 -1
- data/lib/lisp/tests/unparse-tests.nydp +13 -7
- data/lib/nydp/assignment.rb +15 -28
- data/lib/nydp/builtin/abs.rb +4 -3
- data/lib/nydp/builtin/apply.rb +8 -10
- data/lib/nydp/builtin/cdr_set.rb +1 -1
- data/lib/nydp/builtin/comment.rb +1 -3
- data/lib/nydp/builtin/date.rb +11 -28
- data/lib/nydp/builtin/divide.rb +3 -10
- data/lib/nydp/builtin/ensuring.rb +6 -21
- data/lib/nydp/builtin/error.rb +2 -4
- data/lib/nydp/builtin/eval.rb +9 -4
- data/lib/nydp/builtin/greater_than.rb +7 -8
- data/lib/nydp/builtin/handle_error.rb +10 -34
- data/lib/nydp/builtin/hash.rb +24 -45
- data/lib/nydp/builtin/inspect.rb +1 -3
- data/lib/nydp/builtin/is_equal.rb +4 -7
- data/lib/nydp/builtin/less_than.rb +6 -7
- data/lib/nydp/builtin/log.rb +7 -0
- data/lib/nydp/builtin/math_ceiling.rb +1 -3
- data/lib/nydp/builtin/math_floor.rb +1 -3
- data/lib/nydp/builtin/math_power.rb +1 -3
- data/lib/nydp/builtin/math_round.rb +2 -2
- data/lib/nydp/builtin/minus.rb +7 -14
- data/lib/nydp/builtin/parse.rb +5 -5
- data/lib/nydp/builtin/parse_in_string.rb +5 -7
- data/lib/nydp/builtin/plus.rb +14 -31
- data/lib/nydp/builtin/pre_compile.rb +1 -3
- data/lib/nydp/builtin/puts.rb +4 -8
- data/lib/nydp/builtin/quit.rb +1 -1
- data/lib/nydp/builtin/rand.rb +6 -11
- data/lib/nydp/builtin/random_string.rb +2 -4
- data/lib/nydp/builtin/rng.rb +25 -0
- data/lib/nydp/builtin/ruby_wrap.rb +27 -14
- data/lib/nydp/builtin/script_run.rb +1 -3
- data/lib/nydp/builtin/set_intersection.rb +3 -4
- data/lib/nydp/builtin/set_union.rb +3 -4
- data/lib/nydp/builtin/sort.rb +2 -7
- data/lib/nydp/builtin/string_match.rb +5 -13
- data/lib/nydp/builtin/string_replace.rb +2 -7
- data/lib/nydp/builtin/string_split.rb +3 -8
- data/lib/nydp/builtin/sym.rb +2 -9
- data/lib/nydp/builtin/thread_locals.rb +2 -2
- data/lib/nydp/builtin/time.rb +38 -44
- data/lib/nydp/builtin/times.rb +6 -15
- data/lib/nydp/builtin/to_integer.rb +8 -14
- data/lib/nydp/builtin/to_string.rb +2 -13
- data/lib/nydp/builtin/type_of.rb +10 -16
- data/lib/nydp/builtin/vm_info.rb +2 -10
- data/lib/nydp/builtin.rb +15 -37
- data/lib/nydp/compiler.rb +29 -19
- data/lib/nydp/cond.rb +95 -88
- data/lib/nydp/context_symbol.rb +11 -9
- data/lib/nydp/core.rb +74 -73
- data/lib/nydp/core_ext.rb +88 -24
- data/lib/nydp/date.rb +22 -19
- data/lib/nydp/error.rb +2 -3
- data/lib/nydp/function_invocation.rb +76 -289
- data/lib/nydp/helper.rb +18 -9
- data/lib/nydp/interpreted_function.rb +159 -25
- data/lib/nydp/lexical_context.rb +9 -8
- data/lib/nydp/lexical_context_builder.rb +1 -1
- data/lib/nydp/literal.rb +3 -7
- data/lib/nydp/loop.rb +72 -0
- data/lib/nydp/namespace.rb +52 -0
- data/lib/nydp/pair.rb +146 -50
- data/lib/nydp/parser.rb +9 -11
- data/lib/nydp/plugin.rb +88 -19
- data/lib/nydp/runner.rb +141 -23
- data/lib/nydp/symbol.rb +16 -26
- data/lib/nydp/symbol_lookup.rb +3 -2
- data/lib/nydp/tokeniser.rb +1 -1
- data/lib/nydp/truth.rb +2 -37
- data/lib/nydp/version.rb +1 -1
- data/lib/nydp.rb +33 -44
- data/nydp.gemspec +2 -1
- data/spec/date_spec.rb +26 -32
- data/spec/embedded_spec.rb +22 -22
- data/spec/error_spec.rb +12 -16
- data/spec/foreign_hash_spec.rb +21 -36
- data/spec/hash_non_hash_behaviour_spec.rb +12 -29
- data/spec/hash_spec.rb +36 -49
- data/spec/literal_spec.rb +6 -6
- data/spec/nydp_spec.rb +14 -14
- data/spec/pair_spec.rb +8 -8
- data/spec/parser_spec.rb +41 -37
- data/spec/rand_spec.rb +1 -4
- data/spec/spec_helper.rb +3 -3
- data/spec/string_atom_spec.rb +15 -16
- data/spec/symbol_spec.rb +27 -52
- data/spec/thread_local_spec.rb +23 -8
- data/spec/time_spec.rb +4 -10
- data/spec/tokeniser_spec.rb +10 -10
- metadata +25 -13
- data/lib/nydp/builtin/modulo.rb +0 -11
- data/lib/nydp/builtin/regexp.rb +0 -7
- data/lib/nydp/builtin/sqrt.rb +0 -7
- data/lib/nydp/builtin/string_pad_left.rb +0 -7
- data/lib/nydp/builtin/string_pad_right.rb +0 -7
- data/lib/nydp/hash.rb +0 -9
- data/lib/nydp/image_store.rb +0 -21
- data/lib/nydp/vm.rb +0 -129
@@ -1,14 +1,12 @@
|
|
1
1
|
class Nydp::Builtin::ParseInString
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
parser = Nydp.new_parser
|
6
|
-
|
7
|
-
tokens
|
8
|
-
expr = parser.embedded(tokens)
|
9
|
-
vm.push_arg expr
|
4
|
+
def builtin_call arg
|
5
|
+
parser = Nydp.new_parser
|
6
|
+
tokens = Nydp.new_tokeniser Nydp::StringReader.new "parse-in-string", arg.to_s
|
7
|
+
parser.embedded(tokens)
|
10
8
|
rescue StandardError => e
|
11
|
-
new_msg = "parse error: #{e.message.
|
9
|
+
new_msg = "parse error: #{e.message._nydp_inspect} in\n#{Nydp.indent_text arg.to_s}"
|
12
10
|
raise Nydp::Error.new new_msg
|
13
11
|
end
|
14
12
|
end
|
data/lib/nydp/builtin/plus.rb
CHANGED
@@ -1,37 +1,20 @@
|
|
1
1
|
class Nydp::Builtin::Plus
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
def builtin_invoke_2 vm, a ; vm.push_arg a ; end
|
6
|
-
def builtin_invoke_3 vm, a0, a1 ; vm.push_arg(a0 + a1) ; end
|
7
|
-
def builtin_invoke_4 vm, a0, a1, a2 ; vm.push_arg(a0 + a1 + a2) ; end
|
8
|
-
|
9
|
-
def builtin_invoke vm, args
|
10
|
-
vm.push_arg case args.car
|
11
|
-
when Nydp::Pair
|
12
|
-
sum(args, Nydp::NIL)
|
13
|
-
when String
|
14
|
-
string_concat("", args)
|
15
|
-
else
|
16
|
-
sum(args.cdr, args.car)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def string_concat init, others
|
21
|
-
while others && !Nydp::NIL.is?(others)
|
22
|
-
init << others.car.to_s
|
23
|
-
others = others.cdr
|
24
|
-
end
|
25
|
-
init
|
26
|
-
end
|
4
|
+
def name ; "+" ; end
|
27
5
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
6
|
+
def builtin_call *args
|
7
|
+
if args.empty?
|
8
|
+
0
|
9
|
+
else
|
10
|
+
case args.first
|
11
|
+
when String
|
12
|
+
args.each_with_object("") { |str, res| res << str.to_s }
|
13
|
+
when Date
|
14
|
+
(args.shift._nydp_date + builtin_call(*args)).to_ruby
|
15
|
+
else
|
16
|
+
args.reduce &:+
|
17
|
+
end
|
18
|
+
end._nydp_wrapper
|
34
19
|
end
|
35
|
-
|
36
|
-
def name ; "+" ; end
|
37
20
|
end
|
data/lib/nydp/builtin/puts.rb
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
class Nydp::Builtin::Puts
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
s = args.map { |a| a.to_s }
|
9
|
-
puts s.join ' '
|
10
|
-
end
|
11
|
-
vm.push_arg args.car
|
4
|
+
def builtin_call *args
|
5
|
+
s = args.map { |a| a.to_s }
|
6
|
+
puts s.join ' '
|
7
|
+
args.first
|
12
8
|
end
|
13
9
|
|
14
10
|
def name ; "p" ; end
|
data/lib/nydp/builtin/quit.rb
CHANGED
data/lib/nydp/builtin/rand.rb
CHANGED
@@ -1,18 +1,13 @@
|
|
1
1
|
class Nydp::Builtin::Rand
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
builtin_invoke_1 vm
|
4
|
+
def builtin_call a0=nil, a1=nil
|
5
|
+
if a0 == nil
|
6
|
+
rand
|
7
|
+
elsif a1 == nil
|
8
|
+
rand(a0)
|
10
9
|
else
|
11
|
-
|
12
|
-
when 1 ; builtin_invoke_2 vm, args.car
|
13
|
-
when 2 ; builtin_invoke_3 vm, args.car, args.cadr
|
14
|
-
else ; raise "rand: 0, 1 or 2 args expected, got #{args.length}"
|
15
|
-
end
|
10
|
+
(a0 + rand(a1 - a0))
|
16
11
|
end
|
17
12
|
end
|
18
13
|
end
|
@@ -3,9 +3,7 @@ class Nydp::Builtin::RandomString
|
|
3
3
|
|
4
4
|
RANDOM_CHARS = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","2","3","4","5","6","7","8","9"]
|
5
5
|
|
6
|
-
def
|
7
|
-
length
|
8
|
-
s = (0...(length || 10)).inject("") {|a,i| a << RANDOM_CHARS[rand(RANDOM_CHARS.size)] }
|
9
|
-
vm.push_arg s
|
6
|
+
def builtin_call length=nil
|
7
|
+
(0...(length || 10)).inject("") {|a,i| a << RANDOM_CHARS[rand(RANDOM_CHARS.size)] }
|
10
8
|
end
|
11
9
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Nydp::Builtin::RNG
|
2
|
+
include Nydp::Builtin::Base, Singleton
|
3
|
+
|
4
|
+
def builtin_call a0=nil
|
5
|
+
if a0 == nil
|
6
|
+
Random.new
|
7
|
+
else
|
8
|
+
Random.new(a0)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class ::Random
|
14
|
+
include Nydp::Builtin::Base
|
15
|
+
|
16
|
+
def builtin_call a0=nil, a1=nil
|
17
|
+
if a0 == nil
|
18
|
+
self.rand
|
19
|
+
elsif a1 == nil
|
20
|
+
self.rand(a0)
|
21
|
+
else
|
22
|
+
(a0 + self.rand(a1 - a0))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -8,14 +8,14 @@ class Nydp::Builtin::RubyWrap
|
|
8
8
|
class Coder < Struct.new(:name, :size, :code, :helpers)
|
9
9
|
def msize ; size + 1 ; end
|
10
10
|
|
11
|
-
def
|
11
|
+
def arg_mapper_novm
|
12
12
|
case size
|
13
13
|
when 0 ; ""
|
14
|
-
when 1 ; "
|
15
|
-
when 2 ; "
|
16
|
-
when 3 ; "
|
17
|
-
when 4 ; "
|
18
|
-
when 5 ; "
|
14
|
+
when 1 ; "a0=nil"
|
15
|
+
when 2 ; "a0=nil, a1=nil"
|
16
|
+
when 3 ; "a0=nil, a1=nil, a2=nil"
|
17
|
+
when 4 ; "a0=nil, a1=nil, a2=nil, a3=nil"
|
18
|
+
when 5 ; "a0=nil, a1=nil, a2=nil, a3=nil, a4=nil"
|
19
19
|
else ; raise "maximum 5 arguments!"
|
20
20
|
end
|
21
21
|
end
|
@@ -31,12 +31,18 @@ class Nydp::Builtin::RubyWrap
|
|
31
31
|
class #{name}
|
32
32
|
include Nydp::Builtin::Base, Singleton#{helpers}
|
33
33
|
|
34
|
-
def
|
35
|
-
|
34
|
+
def builtin_call #{ arg_mapper_novm }
|
35
|
+
(#{code})
|
36
36
|
end
|
37
37
|
|
38
|
-
|
39
|
-
|
38
|
+
# return the ruby equivalent of this code if it was inlined inside another builtin
|
39
|
+
def inline_code arg_expressions
|
40
|
+
#{code.inspect}.
|
41
|
+
gsub(/a0/, arg_expressions[0]).
|
42
|
+
gsub(/a1/, arg_expressions[1]).
|
43
|
+
gsub(/a2/, arg_expressions[2]).
|
44
|
+
gsub(/a3/, arg_expressions[3]).
|
45
|
+
gsub(/a4/, arg_expressions[4])
|
40
46
|
end
|
41
47
|
end
|
42
48
|
CODE
|
@@ -65,8 +71,15 @@ CODE
|
|
65
71
|
end
|
66
72
|
|
67
73
|
core_builder = builder ""
|
68
|
-
core_builder.build(:Cons, 2, %{ Nydp::Pair.new(a0, a1) } )
|
69
|
-
core_builder.build(:Car
|
70
|
-
core_builder.build(:Cdr
|
71
|
-
core_builder.build(:
|
74
|
+
core_builder.build(:Cons , 2, %{ Nydp::Pair.new(a0, a1) } )
|
75
|
+
core_builder.build(:Car , 1, %{ a0.car } )
|
76
|
+
core_builder.build(:Cdr , 1, %{ a0.cdr } )
|
77
|
+
core_builder.build(:Ln , 1, %{ Math.log(a0) } )
|
78
|
+
core_builder.build(:Modulo , 2, %{ a0 % a1 } )
|
79
|
+
core_builder.build(:Sqrt , 1, %{ Math.sqrt a0 } )
|
80
|
+
core_builder.build(:Regexp , 1, %{ ::Regexp.compile(a0) } )
|
81
|
+
core_builder.build(:StringPadLeft , 3, %{ a0.to_s.rjust(a1, a2.to_s) } )
|
82
|
+
core_builder.build(:StringPadRight, 3, %{ a0.to_s.ljust(a1, a2.to_s) } )
|
83
|
+
core_builder.build(:ToList , 1, %{ a0.to_a._nydp_wrapper } )
|
84
|
+
core_builder.build(:StringForceEncoding, 2, %{ a0.to_s.force_encoding(a1)._nydp_wrapper } )
|
72
85
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
class Nydp::Builtin::SetIntersection
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
def builtin_invoke vm, args ; vm.push_arg args.reduce &:& ; end
|
4
|
+
def builtin_call *args
|
5
|
+
args.reduce(&:&)._nydp_wrapper
|
6
|
+
end
|
8
7
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
class Nydp::Builtin::SetUnion
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
def builtin_invoke vm, args ; vm.push_arg args.reduce &:| ; end
|
4
|
+
def builtin_call *args
|
5
|
+
args.reduce(&:|)._nydp_wrapper
|
6
|
+
end
|
8
7
|
end
|
data/lib/nydp/builtin/sort.rb
CHANGED
@@ -2,14 +2,9 @@ module Nydp
|
|
2
2
|
class Builtin::Sort
|
3
3
|
include Builtin::Base, Singleton
|
4
4
|
|
5
|
-
def
|
6
|
-
|
5
|
+
def builtin_call arg
|
6
|
+
arg.to_a.sort._nydp_wrapper
|
7
7
|
end
|
8
8
|
|
9
|
-
private
|
10
|
-
|
11
|
-
def to_array pair, list
|
12
|
-
pair.is_a?(Pair) ? to_array(pair.cdr, (list << pair.car)) : list
|
13
|
-
end
|
14
9
|
end
|
15
10
|
end
|
@@ -1,21 +1,13 @@
|
|
1
1
|
class Nydp::Builtin::StringMatch
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
pattern = Regexp.new(args.cdr.car.to_s)
|
9
|
-
match = pattern.match target
|
4
|
+
def builtin_call target, pattern
|
5
|
+
target = target.to_s
|
6
|
+
pattern = Regexp.new(pattern.to_s) unless pattern.is_a? Regexp
|
7
|
+
match = pattern.match target
|
10
8
|
|
11
9
|
if match
|
12
|
-
|
13
|
-
result[kmatch] = match.to_s
|
14
|
-
result[kcaptures] = Nydp::Pair.from_list match.captures.map { |cap| cap.to_s }
|
15
|
-
else
|
16
|
-
result = Nydp::NIL
|
10
|
+
{ match: match.to_s, captures: (match.captures.map(&:to_s)._nydp_wrapper) }
|
17
11
|
end
|
18
|
-
|
19
|
-
vm.push_arg result
|
20
12
|
end
|
21
13
|
end
|
@@ -1,12 +1,7 @@
|
|
1
1
|
class Nydp::Builtin::StringReplace
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
to_insert = args.cdr.car.to_s
|
7
|
-
target = args.cdr.cdr.car.to_s
|
8
|
-
result = target.to_s.gsub to_remove, to_insert
|
9
|
-
|
10
|
-
vm.push_arg result
|
4
|
+
def builtin_call remove, insert, str
|
5
|
+
str.to_s.to_s.gsub Regexp.new(remove.to_ruby), insert.to_ruby
|
11
6
|
end
|
12
7
|
end
|
@@ -1,13 +1,8 @@
|
|
1
1
|
class Nydp::Builtin::StringSplit
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
separator = separator.to_s unless separator.is_a? Regexp
|
8
|
-
|
9
|
-
result = target.split separator, -1
|
10
|
-
|
11
|
-
vm.push_arg Nydp::Pair.from_list result
|
4
|
+
def builtin_call str, sep=nil
|
5
|
+
sep = sep.to_s unless sep.is_a? Regexp
|
6
|
+
Nydp::Pair.from_list str.to_s.split(sep, -1)
|
12
7
|
end
|
13
8
|
end
|
data/lib/nydp/builtin/sym.rb
CHANGED
@@ -1,14 +1,7 @@
|
|
1
1
|
class Nydp::Builtin::Sym
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
val = case arg.class
|
7
|
-
when Nydp::Symbol
|
8
|
-
arg
|
9
|
-
else
|
10
|
-
Nydp::Symbol.mk arg.to_s.to_sym, vm.ns
|
11
|
-
end
|
12
|
-
vm.push_arg val
|
4
|
+
def builtin_call s
|
5
|
+
s.to_s.to_sym
|
13
6
|
end
|
14
7
|
end
|
data/lib/nydp/builtin/time.rb
CHANGED
@@ -2,51 +2,45 @@
|
|
2
2
|
class Nydp::Builtin::Time
|
3
3
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# when
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
5
|
+
# when 0 arguments:
|
6
|
+
# return Time.now
|
7
|
+
# when 1 argument:
|
8
|
+
# either an offset in seconds from now, or a Date to convert to a time, or a Time to subtract and return offset in seconds from now
|
9
|
+
# when Numeric : return now + offset in seconds from now
|
10
|
+
# when Nydp::Date : convert date to time
|
11
|
+
# when Time : calculate and return now - Time offset in seconds
|
12
|
+
# when 2 arguments:
|
13
|
+
# first arg is a Time
|
14
|
+
# if second arg is numeric, add to first arg
|
15
|
+
# if second arg is a Time, subtract from first arg
|
16
|
+
def builtin_call y=:unset, mo=:unset, d=:unset, h=nil, mi=nil, s=nil, ms=nil
|
17
|
+
if y == :unset
|
18
|
+
::Time.now
|
19
|
+
elsif mo == :unset
|
20
|
+
case y
|
21
|
+
when Numeric # relative time in seconds
|
22
|
+
(Time.now + y)
|
23
|
+
when ::Date
|
24
|
+
y.to_time
|
25
|
+
when ::Time
|
26
|
+
::Time.now - y
|
27
|
+
else
|
28
|
+
puts
|
29
|
+
puts y.class
|
30
|
+
raise Nydp::Error.new "time : expected a number or a date or a time, got #{y._nydp_inspect}"
|
31
|
+
end
|
32
|
+
elsif d == :unset
|
33
|
+
# y is a date or time, mo is a number or time
|
34
|
+
case mo
|
35
|
+
when Numeric # relative time in seconds
|
36
|
+
(y + mo)
|
37
|
+
when ::Time
|
38
|
+
y - mo
|
39
|
+
else
|
40
|
+
raise Nydp::Error.new "time : expected a number or a date, got #{mo._nydp_inspect}"
|
41
|
+
end
|
21
42
|
else
|
22
|
-
|
43
|
+
Time.new(y,mo,d,h,mi,s,ms)
|
23
44
|
end
|
24
45
|
end
|
25
|
-
|
26
|
-
# first arg is a Time
|
27
|
-
# if second arg is numeric, add to first arg
|
28
|
-
# if second arg is a Time, subtract from first arg
|
29
|
-
def builtin_invoke_3 vm, a0, a1
|
30
|
-
case a1
|
31
|
-
when Numeric # relative time in seconds
|
32
|
-
vm.push_arg(a0 + a1)
|
33
|
-
when ::Time
|
34
|
-
vm.push_arg a0 - a1
|
35
|
-
else
|
36
|
-
raise Nydp::Error.new "time : expected a number or a date, got #{a1.inspect}"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def builtin_invoke vm, args
|
41
|
-
# assume ruby Time constructor args y mo d h mi s ms
|
42
|
-
y = args.car
|
43
|
-
mo = args.cdr.car
|
44
|
-
d = args.cdr.cdr.car
|
45
|
-
h = args.cdr.cdr.cdr.car if args.size > 3
|
46
|
-
mi = args.cdr.cdr.cdr.cdr.car if args.size > 4
|
47
|
-
s = args.cdr.cdr.cdr.cdr.cdr.car if args.size > 5
|
48
|
-
ms = args.cdr.cdr.cdr.cdr.cdr.cdr.car if args.size > 6
|
49
|
-
|
50
|
-
vm.push_arg(Time.new(y,mo,d,h,mi,s,ms))
|
51
|
-
end
|
52
46
|
end
|
data/lib/nydp/builtin/times.rb
CHANGED
@@ -1,22 +1,13 @@
|
|
1
1
|
class Nydp::Builtin::Times
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
def invoke_2 vm, a ; vm.push_arg a ; end
|
6
|
-
def invoke_3 vm, a0, a1 ; vm.push_arg(a0 * a1) ; end
|
7
|
-
def invoke_4 vm, a0, a1, a2 ; vm.push_arg(a0 * a1 * a2) ; end
|
8
|
-
|
9
|
-
def builtin_invoke vm, args
|
10
|
-
vm.push_arg multiply(args, 1)
|
11
|
-
end
|
4
|
+
def name ; "*" ; end
|
12
5
|
|
13
|
-
def
|
14
|
-
if
|
15
|
-
|
6
|
+
def builtin_call *args
|
7
|
+
if args.empty?
|
8
|
+
1
|
16
9
|
else
|
17
|
-
|
18
|
-
end
|
10
|
+
args.reduce(&:*)
|
11
|
+
end._nydp_wrapper
|
19
12
|
end
|
20
|
-
|
21
|
-
def name ; "*" ; end
|
22
13
|
end
|
@@ -2,22 +2,16 @@ module Nydp::Builtin
|
|
2
2
|
class ToInteger
|
3
3
|
include Nydp::Builtin::Base, Singleton
|
4
4
|
|
5
|
-
def
|
5
|
+
def builtin_call arg
|
6
6
|
arg = n2r arg
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
vm.push_arg r2n i
|
17
|
-
end
|
18
|
-
|
19
|
-
def builtin_invoke vm, args
|
20
|
-
builtin_invoke_2 vm, args.car
|
8
|
+
if arg.respond_to? :to_i
|
9
|
+
arg.to_i
|
10
|
+
elsif arg.respond_to? :to_time
|
11
|
+
arg.to_time.to_i
|
12
|
+
else
|
13
|
+
arg.to_s.to_i
|
14
|
+
end
|
21
15
|
end
|
22
16
|
end
|
23
17
|
end
|
@@ -2,23 +2,12 @@ module Nydp::Builtin
|
|
2
2
|
class ToString
|
3
3
|
include Nydp::Builtin::Base, Singleton
|
4
4
|
|
5
|
-
def
|
6
|
-
vm.push_arg args.car.to_s
|
7
|
-
end
|
5
|
+
def builtin_call arg=nil ; arg._nydp_to_s ; end
|
8
6
|
end
|
9
7
|
|
10
8
|
class StringLength
|
11
9
|
include Nydp::Builtin::Base, Singleton
|
12
10
|
|
13
|
-
def
|
14
|
-
arg = args.car
|
15
|
-
val = case arg
|
16
|
-
when String
|
17
|
-
arg.length
|
18
|
-
else
|
19
|
-
0
|
20
|
-
end
|
21
|
-
vm.push_arg val
|
22
|
-
end
|
11
|
+
def builtin_call arg ; arg._nydp_to_s.length ; end
|
23
12
|
end
|
24
13
|
end
|
data/lib/nydp/builtin/type_of.rb
CHANGED
@@ -1,21 +1,15 @@
|
|
1
1
|
class Nydp::Builtin::TypeOf
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
vm.push_arg(type || Nydp::NIL)
|
16
|
-
end
|
17
|
-
|
18
|
-
def builtin_invoke vm, args
|
19
|
-
builtin_invoke_1 vm, args.car
|
4
|
+
def builtin_call arg
|
5
|
+
if arg == nil
|
6
|
+
nil
|
7
|
+
elsif arg.respond_to?(:nydp_type)
|
8
|
+
arg.nydp_type.to_sym
|
9
|
+
elsif arg.is_a? Numeric
|
10
|
+
:number
|
11
|
+
else
|
12
|
+
"ruby/#{arg.class.name}".to_sym
|
13
|
+
end
|
20
14
|
end
|
21
15
|
end
|
data/lib/nydp/builtin/vm_info.rb
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
class Nydp::Builtin::VmInfo
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
INSTRUCTIONS = Nydp::Symbol.mk :instructions, VMINFO_NS
|
7
|
-
ARGS = Nydp::Symbol.mk :args, VMINFO_NS
|
8
|
-
|
9
|
-
def builtin_invoke vm, args
|
10
|
-
context_count = Nydp::Pair.new CONTEXTS, vm.contexts.size
|
11
|
-
instruction_count = Nydp::Pair.new INSTRUCTIONS, vm.instructions.size
|
12
|
-
arg_count = Nydp::Pair.new ARGS, vm.args.size
|
13
|
-
vm.push_arg Nydp::Pair.from_list [context_count, instruction_count, arg_count]
|
4
|
+
def builtin_call *args
|
5
|
+
nil
|
14
6
|
end
|
15
7
|
end
|