nydp 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +77 -56
  4. data/lib/lisp/core-000.nydp +1 -1
  5. data/lib/lisp/core-010-precompile.nydp +49 -29
  6. data/lib/lisp/core-012-utils.nydp +12 -8
  7. data/lib/lisp/core-015-documentation.nydp +41 -15
  8. data/lib/lisp/core-017-builtin-dox.nydp +621 -100
  9. data/lib/lisp/core-020-utils.nydp +33 -6
  10. data/lib/lisp/core-025-warnings.nydp +1 -1
  11. data/lib/lisp/core-030-syntax.nydp +64 -48
  12. data/lib/lisp/core-035-flow-control.nydp +20 -28
  13. data/lib/lisp/core-037-list-utils.nydp +84 -21
  14. data/lib/lisp/core-040-utils.nydp +8 -5
  15. data/lib/lisp/core-041-string-utils.nydp +17 -11
  16. data/lib/lisp/core-043-list-utils.nydp +140 -77
  17. data/lib/lisp/core-045-dox-utils.nydp +1 -0
  18. data/lib/lisp/core-050-test-runner.nydp +8 -12
  19. data/lib/lisp/core-070-prefix-list.nydp +19 -15
  20. data/lib/lisp/core-080-pretty-print.nydp +13 -5
  21. data/lib/lisp/core-090-hook.nydp +11 -11
  22. data/lib/lisp/core-100-utils.nydp +51 -66
  23. data/lib/lisp/core-110-hash-utils.nydp +34 -7
  24. data/lib/lisp/core-120-settings.nydp +14 -9
  25. data/lib/lisp/core-130-validations.nydp +28 -13
  26. data/lib/lisp/core-900-benchmarking.nydp +420 -47
  27. data/lib/lisp/tests/000-empty-args-examples.nydp +5 -0
  28. data/lib/lisp/tests/andify-examples.nydp +1 -1
  29. data/lib/lisp/tests/auto-hash-examples.nydp +6 -1
  30. data/lib/lisp/tests/best-examples.nydp +1 -1
  31. data/lib/lisp/tests/boot-tests.nydp +1 -1
  32. data/lib/lisp/tests/date-examples.nydp +129 -102
  33. data/lib/lisp/tests/destructuring-examples.nydp +1 -1
  34. data/lib/lisp/tests/dox-tests.nydp +2 -2
  35. data/lib/lisp/tests/hash-examples.nydp +58 -33
  36. data/lib/lisp/tests/list-tests.nydp +137 -1
  37. data/lib/lisp/tests/pretty-print-tests.nydp +12 -0
  38. data/lib/lisp/tests/rotate-2d-array-examples.nydp +26 -0
  39. data/lib/lisp/tests/sort-examples.nydp +5 -5
  40. data/lib/lisp/tests/string-tests.nydp +16 -5
  41. data/lib/lisp/tests/syntax-tests.nydp +10 -2
  42. data/lib/lisp/tests/time-examples.nydp +8 -1
  43. data/lib/lisp/tests/unparse-tests.nydp +13 -7
  44. data/lib/nydp/assignment.rb +15 -28
  45. data/lib/nydp/builtin/abs.rb +4 -3
  46. data/lib/nydp/builtin/apply.rb +8 -10
  47. data/lib/nydp/builtin/cdr_set.rb +1 -1
  48. data/lib/nydp/builtin/comment.rb +1 -3
  49. data/lib/nydp/builtin/date.rb +11 -28
  50. data/lib/nydp/builtin/divide.rb +3 -10
  51. data/lib/nydp/builtin/ensuring.rb +6 -21
  52. data/lib/nydp/builtin/error.rb +2 -4
  53. data/lib/nydp/builtin/eval.rb +9 -4
  54. data/lib/nydp/builtin/greater_than.rb +7 -8
  55. data/lib/nydp/builtin/handle_error.rb +10 -34
  56. data/lib/nydp/builtin/hash.rb +24 -45
  57. data/lib/nydp/builtin/inspect.rb +1 -3
  58. data/lib/nydp/builtin/is_equal.rb +4 -7
  59. data/lib/nydp/builtin/less_than.rb +6 -7
  60. data/lib/nydp/builtin/log.rb +7 -0
  61. data/lib/nydp/builtin/math_ceiling.rb +1 -3
  62. data/lib/nydp/builtin/math_floor.rb +1 -3
  63. data/lib/nydp/builtin/math_power.rb +1 -3
  64. data/lib/nydp/builtin/math_round.rb +2 -2
  65. data/lib/nydp/builtin/minus.rb +7 -14
  66. data/lib/nydp/builtin/parse.rb +5 -5
  67. data/lib/nydp/builtin/parse_in_string.rb +5 -7
  68. data/lib/nydp/builtin/plus.rb +14 -31
  69. data/lib/nydp/builtin/pre_compile.rb +1 -3
  70. data/lib/nydp/builtin/puts.rb +4 -8
  71. data/lib/nydp/builtin/quit.rb +1 -1
  72. data/lib/nydp/builtin/rand.rb +6 -11
  73. data/lib/nydp/builtin/random_string.rb +2 -4
  74. data/lib/nydp/builtin/rng.rb +25 -0
  75. data/lib/nydp/builtin/ruby_wrap.rb +27 -14
  76. data/lib/nydp/builtin/script_run.rb +1 -3
  77. data/lib/nydp/builtin/set_intersection.rb +3 -4
  78. data/lib/nydp/builtin/set_union.rb +3 -4
  79. data/lib/nydp/builtin/sort.rb +2 -7
  80. data/lib/nydp/builtin/string_match.rb +5 -13
  81. data/lib/nydp/builtin/string_replace.rb +2 -7
  82. data/lib/nydp/builtin/string_split.rb +3 -8
  83. data/lib/nydp/builtin/sym.rb +2 -9
  84. data/lib/nydp/builtin/thread_locals.rb +2 -2
  85. data/lib/nydp/builtin/time.rb +38 -44
  86. data/lib/nydp/builtin/times.rb +6 -15
  87. data/lib/nydp/builtin/to_integer.rb +8 -14
  88. data/lib/nydp/builtin/to_string.rb +2 -13
  89. data/lib/nydp/builtin/type_of.rb +10 -16
  90. data/lib/nydp/builtin/vm_info.rb +2 -10
  91. data/lib/nydp/builtin.rb +15 -37
  92. data/lib/nydp/compiler.rb +29 -19
  93. data/lib/nydp/cond.rb +95 -88
  94. data/lib/nydp/context_symbol.rb +11 -9
  95. data/lib/nydp/core.rb +74 -73
  96. data/lib/nydp/core_ext.rb +87 -26
  97. data/lib/nydp/date.rb +22 -19
  98. data/lib/nydp/error.rb +2 -3
  99. data/lib/nydp/function_invocation.rb +76 -289
  100. data/lib/nydp/helper.rb +18 -9
  101. data/lib/nydp/interpreted_function.rb +159 -25
  102. data/lib/nydp/lexical_context.rb +9 -8
  103. data/lib/nydp/lexical_context_builder.rb +1 -1
  104. data/lib/nydp/literal.rb +3 -7
  105. data/lib/nydp/loop.rb +72 -0
  106. data/lib/nydp/namespace.rb +52 -0
  107. data/lib/nydp/pair.rb +146 -50
  108. data/lib/nydp/parser.rb +9 -11
  109. data/lib/nydp/plugin.rb +88 -19
  110. data/lib/nydp/runner.rb +141 -23
  111. data/lib/nydp/symbol.rb +16 -26
  112. data/lib/nydp/symbol_lookup.rb +3 -2
  113. data/lib/nydp/tokeniser.rb +1 -1
  114. data/lib/nydp/truth.rb +2 -37
  115. data/lib/nydp/version.rb +1 -1
  116. data/lib/nydp.rb +33 -44
  117. data/nydp.gemspec +2 -1
  118. data/spec/date_spec.rb +26 -32
  119. data/spec/embedded_spec.rb +22 -22
  120. data/spec/error_spec.rb +12 -16
  121. data/spec/foreign_hash_spec.rb +21 -36
  122. data/spec/hash_non_hash_behaviour_spec.rb +12 -29
  123. data/spec/hash_spec.rb +36 -49
  124. data/spec/literal_spec.rb +6 -6
  125. data/spec/nydp_spec.rb +14 -14
  126. data/spec/pair_spec.rb +8 -8
  127. data/spec/parser_spec.rb +41 -37
  128. data/spec/rand_spec.rb +1 -4
  129. data/spec/spec_helper.rb +3 -3
  130. data/spec/string_atom_spec.rb +15 -16
  131. data/spec/symbol_spec.rb +27 -52
  132. data/spec/thread_local_spec.rb +23 -8
  133. data/spec/time_spec.rb +4 -10
  134. data/spec/tokeniser_spec.rb +10 -10
  135. metadata +25 -13
  136. data/lib/nydp/builtin/modulo.rb +0 -11
  137. data/lib/nydp/builtin/regexp.rb +0 -7
  138. data/lib/nydp/builtin/sqrt.rb +0 -7
  139. data/lib/nydp/builtin/string_pad_left.rb +0 -7
  140. data/lib/nydp/builtin/string_pad_right.rb +0 -7
  141. data/lib/nydp/hash.rb +0 -9
  142. data/lib/nydp/image_store.rb +0 -21
  143. data/lib/nydp/vm.rb +0 -129
@@ -18,4 +18,11 @@
18
18
 
19
19
  ("returns its year" (&year (date (time 1999 12 31 13 29 52))) 1999)
20
20
  ("returns its month" (&month (date (time 1999 12 31 13 29 52))) 12)
21
- ("returns its day" (&day (date (time 1999 12 31 13 29 52))) 31))
21
+ ("returns its day" (&day (date (time 1999 12 31 13 29 52))) 31)
22
+
23
+ ("returns its year" (&year (time 1999 12 31 13 29 52)) 1999)
24
+ ("returns its month" (&month (time 1999 12 31 13 29 52)) 12)
25
+ ("returns its day" (&day (time 1999 12 31 13 29 52)) 31)
26
+ ("returns its hour" (&hour (time 1999 12 31 13 29 52)) 13)
27
+ ("returns its minute" (&min (time 1999 12 31 13 29 52)) 29)
28
+ ("returns its second" (&sec (time 1999 12 31 13 29 52)) 52))
@@ -1,8 +1,14 @@
1
1
  (examples-for to-string
2
- ("unquote" (to-string '(unquote a)) ",a" )
3
- ("quote" (to-string '(quote a)) "'a" )
4
- ("quasiquote" (to-string '(quasiquote a)) "`a" )
5
- ("unquote-splicing" (to-string '(unquote-splicing a)) ",@a" )
6
- ("brace-list" (to-string '(brace-list a)) "{ a }" )
7
- ("brace-list" (to-string '(brace-list a b)) "{ a b }" )
8
- ("brace-list" (to-string '(brace-list a b c d)) "{ a b c d }" ))
2
+ ("unquote" (to-string '(unquote a)) ",a" )
3
+ ("quote" (to-string '(quote a)) "'a" )
4
+ ("quasiquote" (to-string '(quasiquote a)) "`a" )
5
+ ("unquote-splicing" (to-string '(unquote-splicing a)) ",@a" )
6
+ ("percent-syntax" (to-string '(percent-syntax || a)) "%a" )
7
+ ("colon-syntax" (to-string '(colon-syntax a b c)) "a:b:c" )
8
+ ("dot-syntax" (to-string '(dot-syntax a b c)) "a.b.c" )
9
+ ("brace-list" (to-string '(brace-list a)) "{ a }" )
10
+ ("brace-list" (to-string '(brace-list a b)) "{ a b }" )
11
+ ("brace-list" (to-string '(brace-list a b c d)) "{ a b c d }" )
12
+ ("prefix-list"
13
+ (to-string '((prefix-list "%a.item" (href path)) anchor))
14
+ "(%a.item(href path) anchor)"))
@@ -1,35 +1,16 @@
1
1
  module Nydp
2
- class AssignmentInstruction
3
- attr_accessor :name
4
-
5
- def initialize name
6
- @name = name
7
- end
8
-
9
- def execute vm
10
- @name.assign vm.peek_arg, vm.current_context
11
- rescue
12
- raise "assigning #{@name.inspect}"
13
- end
14
-
15
- def to_s
16
- "#assign #{@name}"
17
- end
18
- end
19
-
20
2
  class Assignment
21
3
  include Helper
22
4
 
23
- def self.build args, bindings
24
- name = Compiler.compile args.car, bindings
25
- raise "can't assign to #{name.inspect} : expression was #{args}" unless name.respond_to?(:assign)
5
+ def self.build args, bindings, ns
6
+ name = Compiler.compile args.car, bindings, ns
7
+ raise "can't assign to #{name._nydp_inspect} : expression was #{args}" unless name.respond_to?(:assign)
26
8
  value_expr = args.cdr.car
27
- Assignment.new name, Compiler.compile(value_expr, bindings), value_expr
9
+ Assignment.new name, Compiler.compile(value_expr, bindings, ns), args
28
10
  end
29
11
 
30
- def initialize name, value, value_src
31
- @name, @value, @value_src = name, value, value_src
32
- @instructions = cons(value, cons(AssignmentInstruction.new(name)))
12
+ def initialize name, value, src
13
+ @name, @value, @src = name, value, src
33
14
  end
34
15
 
35
16
  def lexical_reach n
@@ -37,15 +18,21 @@ module Nydp
37
18
  end
38
19
 
39
20
  def to_s
40
- "(assign #{@instructions.cdr.car.name} #{@value_src.inspect})"
21
+ "(assign #{@src.car} #{@src.cdr.car})"
22
+ end
23
+
24
+ def compile_to_ruby indent, srcs, opts=nil
25
+ "#{indent}##> #{to_s.split(/\n/).join('\n')}\n" +
26
+ "#{indent}(#{@name.compile_to_ruby "", srcs} =\n" +
27
+ "#{indent}#{@value.compile_to_ruby indent, srcs})"
41
28
  end
42
29
 
43
30
  def inspect; to_s ; end
44
31
 
45
32
  def execute vm
46
- vm.push_ctx_instructions @instructions
33
+ @name.assign @value.execute(vm), vm.current_context
47
34
  rescue
48
- raise "assigning #{@value.inspect} to #{@name.inspect}"
35
+ raise "assigning #{@value._nydp_inspect} to #{@name._nydp_inspect}"
49
36
  end
50
37
  end
51
38
  end
@@ -1,8 +1,9 @@
1
1
  class Nydp::Builtin::Abs
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def invoke_2 vm, a0 ; vm.push_arg(a0.abs) ; end
5
- def builtin_invoke vm, args ; invoke_2 vm, args.car ; end
6
-
7
4
  def name ; "mod" ; end
5
+
6
+ def builtin_call arg
7
+ arg.abs
8
+ end
8
9
  end
@@ -1,16 +1,14 @@
1
1
  class Nydp::Builtin::Apply
2
2
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- args.car.invoke vm, apply_args(args.cdr)
6
- end
7
-
8
- private
4
+ def builtin_call arg, *args
5
+ # original_args = args.dup
6
+ cc = args.pop
7
+ cc = [] if cc == nil
8
+ dd = cc.to_a
9
+ aa = args.concat(dd)
9
10
 
10
- def apply_args args
11
- raise "Apply: expected a list : got #{args.inspect}" unless pair? args
12
- raise "Apply: improper list : cdr is ruby nil" if args.cdr.nil?
13
- return args.car if Nydp::NIL.is? args.cdr
14
- cons args.car, apply_args(args.cdr)
11
+ arg.call(*aa)._nydp_wrapper
15
12
  end
13
+
16
14
  end
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::CdrSet
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args ; vm.push_arg(args.car.cdr = args.cdr.car) ; end
4
+ def builtin_call a, b ; a.cdr = b ; end
5
5
  end
@@ -1,7 +1,5 @@
1
1
  class Nydp::Builtin::Comment
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg Nydp::NIL
6
- end
4
+ def builtin_call *args ; nil ; end
7
5
  end
@@ -1,34 +1,17 @@
1
1
  class Nydp::Builtin::Date
2
2
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- case args.size
6
- when 0 ; builtin_invoke_1 vm
7
- when 1 ; builtin_invoke_2 vm, args.car
8
- when 2 ; builtin_invoke_3 vm, args.car, args.cdr.car
9
- when 3 ; builtin_invoke_4 vm, args.car, args.cdr.car, args.cdr.cdr.car
4
+ def builtin_call y=:unset, m=:unset, d=:unset
5
+ if y == :unset
6
+ Date.today
7
+ elsif m == :unset
8
+ if y.respond_to?(:to_date)
9
+ y.to_date
10
+ elsif y.is_a?(String)
11
+ ::Date.parse(y)
12
+ end
13
+ else
14
+ Date.new(y,m,d)
10
15
  end
11
16
  end
12
-
13
- def builtin_invoke_1 vm
14
- vm.push_arg(Nydp::Date.new Date.today)
15
- end
16
-
17
- # it's a Time object (or any object that responds to #to_date)
18
- def builtin_invoke_2 vm, arg
19
- arg = if arg.respond_to?(:to_date)
20
- arg.to_date
21
- elsif arg.is_a?(String)
22
- ::Date.parse(arg)
23
- end
24
- vm.push_arg(Nydp::Date.new arg)
25
- end
26
-
27
- def builtin_invoke_3 vm, a0, a1
28
- raise Nydp::Error.new "Date, got 2 args (#{a0} #{a1}), expected 0 or 1 or 3 args"
29
- end
30
-
31
- def builtin_invoke_4 vm, y, m, d
32
- vm.push_arg(Nydp::Date.new Date.new(y,m,d))
33
- end
34
17
  end
@@ -1,17 +1,10 @@
1
1
  class Nydp::Builtin::Divide
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg divide(args.cdr, args.car)
6
- end
4
+ def name ; "/" ; end
7
5
 
8
- def divide args, accum
9
- if Nydp::NIL.is? args
10
- accum
11
- else
12
- divide(args.cdr, (accum / args.car))
13
- end
6
+ def builtin_call *args
7
+ (args.reduce &:/)._nydp_wrapper
14
8
  end
15
9
 
16
- def name ; "/" ; end
17
10
  end
@@ -1,28 +1,13 @@
1
- require "nydp/vm"
1
+ # require "nydp/vm"
2
2
 
3
3
  class Nydp::Builtin::Ensuring
4
4
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
5
5
 
6
- class InvokeProtection
7
- include Nydp::VM::Finally
8
- attr_reader :protection
9
-
10
- def initialize protection
11
- @protection = protection
12
- end
13
-
14
- def execute vm
15
- protection.invoke vm, Nydp::NIL
6
+ def builtin_call ensureme, tricky
7
+ begin
8
+ tricky.call
9
+ ensure
10
+ ensureme.call
16
11
  end
17
12
  end
18
-
19
- def builtin_invoke vm, args
20
- fn_ensure = args.car
21
- fn_tricky = args.cdr.car
22
-
23
- protection_instructions = Nydp::Pair.from_list [InvokeProtection.new(fn_ensure), Nydp::PopArg]
24
- vm.push_ctx_instructions protection_instructions
25
-
26
- fn_tricky.invoke vm, Nydp::NIL
27
- end
28
13
  end
@@ -1,9 +1,7 @@
1
1
  class Nydp::Builtin::Error
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- # override #invoke on nydp/builtin/base because
5
- # we don't want to inherit error handling
6
- def builtin_invoke vm, args
7
- raise Nydp::Error.new(args.to_a.map(&:to_s).join("\n"), vm.last_error)
4
+ def builtin_call *args
5
+ raise Nydp::Error.new(args.map(&:to_s).join("\n"))
8
6
  end
9
7
  end
@@ -1,8 +1,13 @@
1
1
  class Nydp::Builtin::Eval
2
- include Nydp::Builtin::Base, Singleton
2
+ include Nydp::Builtin::Base
3
3
 
4
- def builtin_invoke vm, args
5
- evaluator = Nydp::Evaluator.new Nydp::VM.new(vm.ns), vm.ns, "<eval>"
6
- vm.push_arg evaluator.evaluate args.car
4
+ def initialize ns
5
+ @ns = ns
6
+ super()
7
+ end
8
+
9
+ def builtin_call *args
10
+ evaluator = Nydp::Evaluator.new @ns, "<eval>"
11
+ evaluator.evaluate args.first
7
12
  end
8
13
  end
@@ -1,14 +1,13 @@
1
1
  class Nydp::Builtin::GreaterThan
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg(greater_than(args.car, args.cdr) || Nydp::NIL)
6
- end
4
+ def name ; ">" ; end
7
5
 
8
- def greater_than arg, args
9
- return arg if Nydp::NIL.is? args
10
- (arg > args.car) && greater_than(args.car, args.cdr)
6
+ def builtin_call arg, *args
7
+ while !args.empty?
8
+ return nil unless args.first && arg > args.first
9
+ arg = args.shift
10
+ end
11
+ return arg
11
12
  end
12
-
13
- def name ; ">" ; end
14
13
  end
@@ -1,46 +1,22 @@
1
- require "nydp/vm"
1
+ # require "nydp/vm"
2
2
 
3
3
  class Nydp::Builtin::HandleError
4
4
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
5
5
 
6
- class CatchError
7
- include Nydp::Helper, Nydp::VM::HandleError
8
-
9
- attr_reader :handler, :vm_arg_array_size
10
-
11
- def initialize handler, vm_arg_array_size
12
- @handler, @vm_arg_array_size = handler, vm_arg_array_size
13
- end
14
-
15
- def execute vm
16
- e = vm.last_error = vm.unhandled_error
17
- vm.unhandled_error = nil
18
- return unless e
19
-
20
- vm.args = vm.args[0...vm_arg_array_size]
21
-
6
+ def builtin_call handler, tricky
7
+ begin
8
+ res = tricky.call
9
+ rescue Exception => e
10
+ o = e
22
11
  msgs = []
12
+ traces = []
23
13
  while e
24
14
  msgs << e.message
15
+ traces << Nydp.enhance_backtrace(e.backtrace)
25
16
  e = e.cause
26
17
  end
27
-
28
- handler.invoke_2 vm, r2n(msgs)
18
+ res = handler.call msgs._nydp_wrapper, traces._nydp_wrapper
29
19
  end
30
-
31
- def to_s
32
- "(on-err: #{handler})"
33
- end
34
- end
35
-
36
-
37
- def builtin_invoke vm, args
38
- fn_handle = args.car
39
- fn_tricky = args.cdr.car
40
-
41
- catcher_instructions = Nydp::Pair.from_list [CatchError.new(fn_handle, vm.args.size)]
42
- vm.push_ctx_instructions catcher_instructions
43
-
44
- fn_tricky.invoke vm, Nydp::NIL
20
+ res._nydp_wrapper
45
21
  end
46
22
  end
@@ -1,81 +1,60 @@
1
- require "nydp/hash"
2
-
3
1
  class Nydp::Builtin::Hash
4
2
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
5
3
 
6
- def builtin_invoke vm, args
7
- vm.push_arg(build_hash Nydp::Hash.new, args)
8
- end
9
-
10
- def build_hash h, args
11
- return h if Nydp::NIL.is? args
12
- k = args.car
13
- rest = args.cdr
14
- v = rest.car
15
- h[k] = v
16
- build_hash h, rest.cdr
17
- end
4
+ def builtin_call *args ; Hash[*args] ; end
18
5
  end
19
6
 
20
7
  class Nydp::Builtin::HashGet
21
8
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
22
- def builtin_invoke vm, args
23
- vm.push_arg(args.car._nydp_get(args.cdr.car)._nydp_wrapper || Nydp::NIL)
9
+ def builtin_call hsh=nil, k=nil, *args
10
+ hsh._nydp_get(k)._nydp_wrapper
24
11
  end
25
12
  end
26
13
 
27
14
  class Nydp::Builtin::HashSet
28
15
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
29
- def builtin_invoke vm, args
30
- value = args.cdr.cdr.car
31
- args.car._nydp_set(args.cdr.car, value)
32
- vm.push_arg value
16
+ def builtin_call hsh, k, v=nil
17
+ hsh._nydp_set(k, v)
18
+ v
33
19
  end
34
20
  end
35
21
 
36
22
  class Nydp::Builtin::HashKeys
37
23
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
38
- def builtin_invoke vm, args
39
- vm.push_arg args.car._nydp_keys._nydp_wrapper
24
+ def builtin_call h
25
+ h._nydp_keys._nydp_wrapper
40
26
  end
41
27
  end
42
28
 
43
29
  class Nydp::Builtin::HashKeyPresent
44
30
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
45
- def builtin_invoke vm, args
46
- hash = args.car
47
- key = args.cdr.car
48
- truth = case hash
49
- when Nydp::Hash
50
- hash.key? key
51
- else
52
- hash.key? n2r key
53
- end
54
- vm.push_arg(truth ? Nydp::T : Nydp::NIL)
55
- end
56
31
  def name ; "hash-key?" ; end
32
+
33
+ def builtin_call h, k
34
+ h.key?(k) || nil
35
+ end
57
36
  end
58
37
 
59
38
  class Nydp::Builtin::HashMerge
60
39
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
61
40
 
62
- def builtin_invoke vm, args
63
- hash_0 = args.car
64
- hash_1 = args.cdr.car
65
-
66
- vm.push_arg hash_0.merge hash_1
41
+ def builtin_call a0, a1
42
+ (a0.merge a1)._nydp_wrapper
67
43
  end
68
44
  end
69
45
 
70
46
  class Nydp::Builtin::HashSlice
71
47
  include Nydp::Helper, Nydp::Builtin::Base, Singleton
72
48
 
73
- def builtin_invoke vm, args
74
- old = args.car
75
- h = old.class.new
76
- slice = args.cdr.car
77
- slice = slice.map { |k| n2r k } unless old.is_a? Nydp::Hash
78
- slice.each { |k| h[k] = old[k] if old.key?(k) }
79
- vm.push_arg h
49
+ def builtin_call h, slice
50
+ h.slice(*slice.to_a)
51
+ end
52
+ end
53
+
54
+ class Nydp::Builtin::HashToArray
55
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
56
+
57
+ def builtin_call h
58
+ h.to_a._nydp_wrapper
80
59
  end
81
60
  end
@@ -1,7 +1,5 @@
1
1
  class Nydp::Builtin::Inspect
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg args.car.inspect
6
- end
4
+ def builtin_call arg ; arg._nydp_inspect ; end
7
5
  end
@@ -1,14 +1,11 @@
1
1
  class Nydp::Builtin::IsEqual
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke_1 vm ; raise "#{name} : requires at least two args" ; end
5
- def builtin_invoke_2 vm, arg ; raise "#{name} : requires at least two args, got one: (#{arg})" ; end
6
-
7
- def builtin_invoke_3 vm, a0, a1 ; vm.push_arg ((a0 == a1) ? Nydp::T : Nydp::NIL) ; end
8
- def builtin_invoke_4 vm, a0, a1, a2 ; vm.push_arg (eq?([a0, a1, a2]) ? Nydp::T : Nydp::NIL) ; end
9
- def builtin_invoke vm, args ; vm.push_arg (eq?(args.to_a) ? Nydp::T : Nydp::NIL) ; end
10
-
11
4
  def _eq? arg, args ; args.all? { |a| a == arg } ; end
12
5
  def eq? args ; _eq? args.first, args[1..-1] ; end
13
6
  def name ; "eq?" ; end
7
+
8
+ def builtin_call *args
9
+ eq?(args) || nil
10
+ end
14
11
  end
@@ -1,13 +1,12 @@
1
1
  class Nydp::Builtin::LessThan
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg(less_than(args.car, args.cdr) || Nydp::NIL)
6
- end
7
-
8
- def less_than arg, args
9
- return arg if Nydp::NIL.is? args
10
- (arg < args.car) && less_than(args.car, args.cdr)
4
+ def builtin_call arg, *args
5
+ while !args.empty?
6
+ return nil unless args.first && (arg < args.first)
7
+ arg = args.shift
8
+ end
9
+ return arg
11
10
  end
12
11
 
13
12
  def name ; "<" ; end
@@ -0,0 +1,7 @@
1
+ class Nydp::Builtin::Log
2
+ include Nydp::Builtin::Base, Singleton
3
+
4
+ def builtin_call *args
5
+ Nydp.logger.info(args.map(&:to_s).join(' '))
6
+ end
7
+ end
@@ -1,7 +1,5 @@
1
1
  class Nydp::Builtin::MathCeiling
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg(args.car.ceil)
6
- end
4
+ def builtin_call arg ; arg.ceil ; end
7
5
  end
@@ -1,7 +1,5 @@
1
1
  class Nydp::Builtin::MathFloor
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg(args.car.floor)
6
- end
4
+ def builtin_call arg ; arg.floor ; end
7
5
  end
@@ -1,7 +1,5 @@
1
1
  class Nydp::Builtin::MathPower
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg(args.car ** args.cdr.car)
6
- end
4
+ def builtin_call a0, a1 ; a0 ** a1 ; end
7
5
  end
@@ -1,7 +1,7 @@
1
1
  class Nydp::Builtin::MathRound
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- vm.push_arg(args.car.round)
4
+ def builtin_call arg
5
+ arg.round
6
6
  end
7
7
  end
@@ -1,22 +1,15 @@
1
1
  class Nydp::Builtin::Minus
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def invoke_1 vm ; vm.push_arg 0 ; end
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 diff(args.cdr, args.car)
11
- end
4
+ def name ; "-" ; end
12
5
 
13
- def diff args, accum
14
- if Nydp::NIL.is? args
15
- accum
6
+ def builtin_call *args
7
+ if args.length == 1
8
+ - args.first
9
+ elsif args.first
10
+ args.reduce(&:-)
16
11
  else
17
- diff(args.cdr, (accum - args.car))
12
+ 0
18
13
  end
19
14
  end
20
-
21
- def name ; "-" ; end
22
15
  end
@@ -1,14 +1,14 @@
1
1
  class Nydp::Builtin::Parse
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- parser = Nydp.new_parser(vm.ns)
6
- tokens = Nydp.new_tokeniser Nydp::StringReader.new args.car.to_s
4
+ def builtin_call arg
5
+ parser = Nydp.new_parser
6
+ tokens = Nydp.new_tokeniser Nydp::StringReader.new "parse", arg.to_s
7
7
  exprs = []
8
8
  while !tokens.finished
9
9
  expr = parser.expression(tokens)
10
- exprs << expr unless expr == nil
10
+ exprs << expr unless expr == nil && tokens.finished
11
11
  end
12
- vm.push_arg Nydp::Pair.from_list exprs
12
+ Nydp::Pair.from_list exprs
13
13
  end
14
14
  end
@@ -1,14 +1,12 @@
1
1
  class Nydp::Builtin::ParseInString
2
2
  include Nydp::Builtin::Base, Singleton
3
3
 
4
- def builtin_invoke vm, args
5
- parser = Nydp.new_parser(vm.ns)
6
- parsable = args.car.to_s
7
- tokens = Nydp.new_tokeniser Nydp::StringReader.new parsable
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.inspect} in\n#{Nydp.indent_text parsable}"
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