nydp 0.5.1 → 0.6.0

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 (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