nydp 0.5.0 → 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 +30 -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 +88 -24
  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
data/lib/nydp/core.rb CHANGED
@@ -2,11 +2,9 @@ require 'nydp/plugin'
2
2
 
3
3
  module Nydp
4
4
  class Core
5
- def name ; "Nydp Core" ; end
5
+ include Nydp::PluginHelper
6
6
 
7
- def relative_path name
8
- File.join File.expand_path(File.dirname(__FILE__)), name
9
- end
7
+ def name ; "Nydp Core" ; end
10
8
 
11
9
  def base_path
12
10
  relative_path "../lisp/"
@@ -17,81 +15,84 @@ module Nydp
17
15
  end
18
16
 
19
17
  def loadfiles
20
- Dir.glob(relative_path '../lisp/core-*.nydp').sort
18
+ file_readers Dir.glob(relative_path '../lisp/core-*.nydp').sort
21
19
  end
22
20
 
23
21
  def testfiles
24
- Dir.glob(relative_path '../lisp/tests/**/*.nydp')
22
+ file_readers Dir.glob(relative_path '../lisp/tests/**/*.nydp')
25
23
  end
26
24
 
27
25
  def setup ns
28
- Symbol.mk(:cons , ns).assign(Nydp::Builtin::RubyWrap::Cons.instance)
29
- Symbol.mk(:car , ns).assign(Nydp::Builtin::RubyWrap::Car.instance )
30
- Symbol.mk(:cdr , ns).assign(Nydp::Builtin::RubyWrap::Cdr.instance )
31
- Symbol.mk(:log , ns).assign(Nydp::Builtin::RubyWrap::Log.instance )
32
-
33
- Symbol.mk(:+, ns).assign(Nydp::Builtin::Plus.instance)
34
- Symbol.mk(:-, ns).assign(Nydp::Builtin::Minus.instance)
35
- Symbol.mk(:*, ns).assign(Nydp::Builtin::Times.instance)
36
- Symbol.mk(:/, ns).assign(Nydp::Builtin::Divide.instance)
37
- Symbol.mk(:>, ns).assign(Nydp::Builtin::GreaterThan.instance)
38
- Symbol.mk(:<, ns).assign(Nydp::Builtin::LessThan.instance)
39
- Symbol.mk(:mod, ns).assign(Nydp::Builtin::Modulo.instance)
40
- Symbol.mk(:eval, ns).assign(Nydp::Builtin::Eval.instance)
41
- Symbol.mk(:false, ns).assign(false)
42
- Symbol.mk(:hash, ns).assign(Nydp::Builtin::Hash.instance)
43
- Symbol.mk(:apply, ns).assign(Nydp::Builtin::Apply.instance)
44
- Symbol.mk(:date, ns).assign(Nydp::Builtin::Date.instance)
45
- Symbol.mk(:error, ns).assign(Nydp::Builtin::Error.instance)
46
- Symbol.mk(:parse, ns).assign(Nydp::Builtin::Parse.instance)
47
- Symbol.mk(:p, ns).assign(Nydp::Builtin::Puts.instance)
48
- Symbol.mk(:PI, ns).assign 3.1415
49
- Symbol.mk(:nil, ns).assign Nydp::NIL
50
- Symbol.mk(:rand, ns).assign Nydp::Builtin::Rand.instance
51
- Symbol.mk(:sort, ns).assign Nydp::Builtin::Sort.instance
52
- Symbol.mk(:abs, ns).assign Nydp::Builtin::Abs.instance
53
- Symbol.mk(:sqrt, ns).assign Nydp::Builtin::Sqrt.instance
54
- Symbol.mk(:t, ns).assign Nydp::T
55
- Symbol.mk(:sym, ns).assign Nydp::Builtin::Sym.instance
56
- Symbol.mk(:ensuring , ns).assign(Nydp::Builtin::Ensuring.instance)
57
- Symbol.mk(:inspect , ns).assign(Nydp::Builtin::Inspect.instance)
58
- Symbol.mk(:comment , ns).assign(Nydp::Builtin::Comment.instance)
59
- Symbol.mk("handle-error" , ns).assign(Nydp::Builtin::HandleError.instance)
60
- Symbol.mk("parse-in-string" , ns).assign(Nydp::Builtin::ParseInString.instance)
61
- Symbol.mk("random-string" , ns).assign(Nydp::Builtin::RandomString.instance)
62
- Symbol.mk("regexp" , ns).assign(Nydp::Builtin::Regexp.instance)
63
- Symbol.mk("to-string" , ns).assign(Nydp::Builtin::ToString.instance)
64
- Symbol.mk("to-integer" , ns).assign(Nydp::Builtin::ToInteger.instance)
65
- Symbol.mk("string-length" , ns).assign(Nydp::Builtin::StringLength.instance)
66
- Symbol.mk("string-replace" , ns).assign(Nydp::Builtin::StringReplace.instance)
67
- Symbol.mk("string-match" , ns).assign(Nydp::Builtin::StringMatch.instance)
68
- Symbol.mk("string-split" , ns).assign(Nydp::Builtin::StringSplit.instance)
69
- Symbol.mk("string/pad-left" , ns).assign(Nydp::Builtin::StringPadLeft.instance)
70
- Symbol.mk("string/pad-right" , ns).assign(Nydp::Builtin::StringPadRight.instance)
71
- Symbol.mk("time" , ns).assign(Nydp::Builtin::Time.instance)
72
- Symbol.mk("thread-locals" , ns).assign(Nydp::Builtin::ThreadLocals.instance)
73
- Symbol.mk("type-of" , ns).assign(Nydp::Builtin::TypeOf.instance)
74
- Symbol.mk(:"eq?" , ns).assign(Nydp::Builtin::IsEqual.instance)
75
- Symbol.mk(:"cdr-set" , ns).assign(Nydp::Builtin::CdrSet.instance)
76
- Symbol.mk(:"hash-get" , ns).assign(Nydp::Builtin::HashGet.instance)
77
- Symbol.mk(:"hash-set" , ns).assign(Nydp::Builtin::HashSet.instance)
78
- Symbol.mk(:"hash-keys" , ns).assign(Nydp::Builtin::HashKeys.instance)
79
- Symbol.mk(:"hash-key?" , ns).assign(Nydp::Builtin::HashKeyPresent.instance)
80
- Symbol.mk(:"hash-merge" , ns).assign(Nydp::Builtin::HashMerge.instance)
81
- Symbol.mk(:"hash-slice" , ns).assign(Nydp::Builtin::HashSlice.instance)
82
- Symbol.mk(:"vm-info" , ns).assign Nydp::Builtin::VmInfo.instance
83
- Symbol.mk(:"pre-compile" , ns).assign Nydp::Builtin::PreCompile.instance
84
- Symbol.mk(:"script-run" , ns).assign Nydp::Builtin::ScriptRun.instance
85
- Symbol.mk(:"**" , ns).assign Nydp::Builtin::MathPower.instance
86
- Symbol.mk(:"" , ns).assign Nydp::Builtin::MathFloor.instance
87
- Symbol.mk(:"math-floor" , ns).assign Nydp::Builtin::MathFloor.instance
88
- Symbol.mk(:"" , ns).assign Nydp::Builtin::MathCeiling.instance
89
- Symbol.mk(:"math-ceiling" , ns).assign Nydp::Builtin::MathCeiling.instance
90
- Symbol.mk(:"math-round" , ns).assign Nydp::Builtin::MathRound.instance
91
- Symbol.mk(:"" , ns).assign Nydp::Builtin::SetIntersection.instance
92
- Symbol.mk(:"set-intersection", ns).assign Nydp::Builtin::SetIntersection.instance
93
- Symbol.mk(:"" , ns).assign Nydp::Builtin::SetUnion.instance
94
- Symbol.mk(:"set-union" , ns).assign Nydp::Builtin::SetUnion.instance
26
+ ns.assign(:cons , Nydp::Builtin::RubyWrap::Cons.instance )
27
+ ns.assign(:car , Nydp::Builtin::RubyWrap::Car.instance )
28
+ ns.assign(:cdr , Nydp::Builtin::RubyWrap::Cdr.instance )
29
+ ns.assign(:log , Nydp::Builtin::Log.instance )
30
+ ns.assign(:ln , Nydp::Builtin::RubyWrap::Ln.instance )
31
+ ns.assign(:mod , Nydp::Builtin::RubyWrap::Modulo.instance )
32
+ ns.assign(:sqrt , Nydp::Builtin::RubyWrap::Sqrt.instance )
33
+ ns.assign(:regexp , Nydp::Builtin::RubyWrap::Regexp.instance )
34
+ ns.assign("string/pad-left" , Nydp::Builtin::RubyWrap::StringPadLeft.instance )
35
+ ns.assign("string/pad-right" , Nydp::Builtin::RubyWrap::StringPadRight.instance)
36
+ ns.assign("string/force-encoding", Nydp::Builtin::RubyWrap::StringForceEncoding.instance)
37
+ ns.assign("to-list" , Nydp::Builtin::RubyWrap::ToList.instance )
38
+ ns.assign(:+ , Nydp::Builtin::Plus.instance )
39
+ ns.assign(:- , Nydp::Builtin::Minus.instance )
40
+ ns.assign(:* , Nydp::Builtin::Times.instance )
41
+ ns.assign(:/ , Nydp::Builtin::Divide.instance )
42
+ ns.assign(:> , Nydp::Builtin::GreaterThan.instance )
43
+ ns.assign(:< , Nydp::Builtin::LessThan.instance )
44
+ ns.assign(:eval , Nydp::Builtin::Eval.new(ns) )
45
+ ns.assign(:false , false )
46
+ ns.assign(:hash , Nydp::Builtin::Hash.instance )
47
+ ns.assign(:apply , Nydp::Builtin::Apply.instance )
48
+ ns.assign(:date , Nydp::Builtin::Date.instance )
49
+ ns.assign(:error , Nydp::Builtin::Error.instance )
50
+ ns.assign(:parse , Nydp::Builtin::Parse.instance )
51
+ ns.assign(:p , Nydp::Builtin::Puts.instance )
52
+ ns.assign(:PI , Math::PI )
53
+ ns.assign(:"π" , Math::PI )
54
+ ns.assign(:rand , Nydp::Builtin::Rand.instance )
55
+ ns.assign(:rng , Nydp::Builtin::RNG.instance )
56
+ ns.assign(:sort , Nydp::Builtin::Sort.instance )
57
+ ns.assign(:abs , Nydp::Builtin::Abs.instance )
58
+ ns.assign(:sym , Nydp::Builtin::Sym.instance )
59
+ ns.assign(:ensuring , Nydp::Builtin::Ensuring.instance )
60
+ ns.assign(:inspect , Nydp::Builtin::Inspect.instance )
61
+ ns.assign(:comment , Nydp::Builtin::Comment.instance )
62
+ ns.assign("handle-error" , Nydp::Builtin::HandleError.instance )
63
+ ns.assign("parse-in-string" , Nydp::Builtin::ParseInString.instance )
64
+ ns.assign("random-string" , Nydp::Builtin::RandomString.instance )
65
+ ns.assign("to-string" , Nydp::Builtin::ToString.instance )
66
+ ns.assign("to-integer" , Nydp::Builtin::ToInteger.instance )
67
+ ns.assign("string-length" , Nydp::Builtin::StringLength.instance )
68
+ ns.assign("string-replace" , Nydp::Builtin::StringReplace.instance )
69
+ ns.assign("string-match" , Nydp::Builtin::StringMatch.instance )
70
+ ns.assign("string-split" , Nydp::Builtin::StringSplit.instance )
71
+ ns.assign("time" , Nydp::Builtin::Time.instance )
72
+ ns.assign("thread-locals" , Nydp::Builtin::ThreadLocals.instance )
73
+ ns.assign("type-of" , Nydp::Builtin::TypeOf.instance )
74
+ ns.assign(:"eq?" , Nydp::Builtin::IsEqual.instance )
75
+ ns.assign(:"cdr-set" , Nydp::Builtin::CdrSet.instance )
76
+ ns.assign(:"hash-get" , Nydp::Builtin::HashGet.instance )
77
+ ns.assign(:"hash-set" , Nydp::Builtin::HashSet.instance )
78
+ ns.assign(:"hash-keys" , Nydp::Builtin::HashKeys.instance )
79
+ ns.assign(:"hash-key?" , Nydp::Builtin::HashKeyPresent.instance )
80
+ ns.assign(:"hash-merge" , Nydp::Builtin::HashMerge.instance )
81
+ ns.assign(:"hash-slice" , Nydp::Builtin::HashSlice.instance )
82
+ ns.assign(:"hash-to-array" , Nydp::Builtin::HashToArray.instance )
83
+ ns.assign(:"vm-info" , Nydp::Builtin::VmInfo.instance )
84
+ ns.assign(:"pre-compile-new-expression", Nydp::Builtin::PreCompile.instance )
85
+ ns.assign(:"script-run" , Nydp::Builtin::ScriptRun.instance )
86
+ ns.assign(:"**" , Nydp::Builtin::MathPower.instance )
87
+ ns.assign(:"" , Nydp::Builtin::MathFloor.instance )
88
+ ns.assign(:"math-floor" , Nydp::Builtin::MathFloor.instance )
89
+ ns.assign(:"" , Nydp::Builtin::MathCeiling.instance )
90
+ ns.assign(:"math-ceiling" , Nydp::Builtin::MathCeiling.instance )
91
+ ns.assign(:"math-round" , Nydp::Builtin::MathRound.instance )
92
+ ns.assign(:"" , Nydp::Builtin::SetIntersection.instance )
93
+ ns.assign(:"set-intersection", Nydp::Builtin::SetIntersection.instance )
94
+ ns.assign(:"⋃" , Nydp::Builtin::SetUnion.instance )
95
+ ns.assign(:"set-union" , Nydp::Builtin::SetUnion.instance )
95
96
  end
96
97
  end
97
98
  end
data/lib/nydp/core_ext.rb CHANGED
@@ -1,54 +1,118 @@
1
1
  class Object
2
- def _nydp_get a ; raise "_nydp_get : not gettable: #{a.inspect} on #{self.class.name}" ; end
3
- def _nydp_set a, v ; raise "_nydp_get : not settable: #{a.inspect} on #{self.class.name}" ; end
4
- def _nydp_keys ; [] ; end
5
- def _nydp_wrapper ; self ; end
6
- def lexical_reach n ; n ; end
2
+ def _nydp_get a ; raise "_nydp_get : not gettable: #{a._nydp_inspect} on #{self.class.name}" ; end
3
+ def _nydp_set a, v ; raise "_nydp_get : not settable: #{a._nydp_inspect} on #{self.class.name}" ; end
4
+ def _nydp_keys ; [] ; end
5
+ def _nydp_wrapper ; self ; end
6
+ def _nydp_inspect ; inspect ; end
7
+ def _nydp_to_s ; to_s ; end
8
+ def _nydp_compact_inspect ; _nydp_inspect ; end
9
+ def lexical_reach n ; n ; end
10
+ def to_ruby ; self ; end
11
+ def compile_to_ruby indent, srcs, opts=nil ; "#{indent}#{inspect}" ; end
7
12
  end
8
13
 
9
14
  class Method
10
15
  include Nydp::Converter
11
- def invoke_1 vm ; vm.push_arg call._nydp_wrapper ; end
12
- def invoke_2 vm, a0 ; vm.push_arg call(n2r(a0))._nydp_wrapper ; end
13
- def invoke_3 vm, a0, a1 ; vm.push_arg call(n2r(a0), n2r(a1))._nydp_wrapper ; end
14
- def invoke_4 vm, a0, a1, a2 ; vm.push_arg call(n2r(a0), n2r(a1), n2r(a2))._nydp_wrapper ; end
15
- def invoke vm, args ; vm.push_arg call(*(args.map { |a| n2r a}))._nydp_wrapper ; end
16
+ def _nydp_call *args ; (call *(rubify args))._nydp_wrapper ; end
16
17
  end
17
18
 
18
- class NilClass
19
- def _nydp_wrapper ; Nydp::NIL ; end
19
+ class Proc
20
+ alias _nydp_call call
20
21
  end
21
22
 
22
- class FalseClass
23
- def _nydp_wrapper ; Nydp::NIL ; end
23
+ class TrueClass
24
+ def _nydp_inspect ; 't' ; end
25
+ def assign *_ ; self ; end
26
+ def nydp_type ; :truth ; end
27
+ def _nydp_get a ; self ; end
28
+ def _nydp_set a, v ; self ; end
29
+ def _nydp_to_s ; "t" ; end
30
+ def compile_to_ruby indent, srcs, opts=nil ; "#{indent}true" ; end
24
31
  end
25
32
 
26
- class TrueClass
27
- def _nydp_wrapper ; Nydp::T ; end
33
+ class CantCallNil < NoMethodError
34
+ end
35
+
36
+ class NilClass
37
+ def car ; self ; end
38
+ def cdr ; self ; end
39
+ def size ; 0 ; end
40
+ def is? other ; self.equal? other ; end
41
+ def isnt? other ; !self.equal? other ; end
42
+ def + other ; other ; end
43
+ def copy ; self ; end
44
+ def assign *_ ; self ; end
45
+ def nydp_type ; :nil ; end
46
+ def _nydp_get a ; self ; end
47
+ def _nydp_set a, v ; self ; end
48
+ def & other ; self ; end
49
+ def | other ; other ; end
50
+ def _nydp_call *_ ; raise CantCallNil ; end
51
+ def compile_to_ruby i, s, o=nil ; "#{i}nil" ; end
52
+ end
53
+
54
+ class FalseClass
55
+ def _nydp_wrapper ; nil ; end
28
56
  end
29
57
 
30
58
  class ::Symbol
31
- def _nydp_wrapper ; Nydp::FrozenSymbol.mk(self) ; end
59
+ def _nydp_inspect
60
+ _ins = to_s
61
+ _nydp_untidy?(_ins) ? "|#{_ins.gsub(/\|/, '\|')}|" : _ins
62
+ end
63
+
64
+ def nydp_type ; :symbol ; end
65
+ # def execute vm ; self ; end
66
+
67
+ alias :inspect_before_nydp :inspect
68
+ def inspect
69
+ if self == :"#="
70
+ ':"#="'
71
+ else
72
+ inspect_before_nydp
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def _nydp_untidy? s
79
+ (s == "") || (s == nil) || (s =~ /[\s\|,\(\)"]/)
80
+ end
32
81
  end
33
82
 
34
83
  class ::Date
35
- def _nydp_wrapper ; Nydp::Date.new self ; end
84
+ def _nydp_get key ; _nydp_date.lookup key, self ; end
85
+ def _nydp_date ; @__nydp_date ||= Nydp::Date.new(self) ; end
86
+ def nydp_type ; :date ; end
87
+ end
88
+
89
+ class ::Time
90
+ @@wl = Set.new %i{ year month day hour min sec }
91
+ def _nydp_time_get key ; send(key) if @@wl.include?(key) ; end
92
+ def _nydp_get key ; _nydp_time_get(key.to_s.to_sym) ; end
93
+ def nydp_type ; :time ; end
36
94
  end
37
95
 
38
96
  class ::Array
39
- def _nydp_wrapper ; Nydp::Pair.from_list map &:_nydp_wrapper ; end
97
+ def _nydp_wrapper ; Nydp::Pair.from_list map &:_nydp_wrapper ; end
98
+ def _nydp_inspect ; "[" + map(&:_nydp_inspect).join(" ") + "]" ; end
40
99
  end
41
100
 
42
101
  class ::String
43
- # def _nydp_wrapper ; Nydp::StringAtom.new self ; end
102
+ # _hex_ord only works for characters whose #ord is < 256, ie #bytes returns a single-element array
103
+ # this should allow for two-way conversion of names containing the characters in the regexp
104
+ # even though we don't use two-way conversion anywhere just yet
105
+ def _nydp_name_to_rb_name ; self.gsub(/[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]/) { |chr| "_#{chr._hex_ord}"}.to_sym ; end
44
106
  def as_method_name ; self.gsub(/-/, '_').to_sym ; end
45
107
  def nydp_type ; :string ; end
46
- def to_ruby ; self ; end
108
+ def _hex_ord ; ord.to_s(16).rjust(2, '0') ; end
47
109
  end
48
110
 
49
111
  class ::Hash
50
112
  include Nydp::Helper
51
- def _nydp_get a ; self[n2r a] ; end
52
- def _nydp_set a, v ; self[n2r a] = n2r(v) ; end
53
- def _nydp_keys ; keys ; end
113
+ def _nydp_get a ; self[a]._nydp_wrapper ; end
114
+ def _nydp_set a, v ; self[a] = v ; end
115
+ def _nydp_keys ; keys ; end
116
+ def _nydp_inspect ; "{" + map { |k,v| [k._nydp_inspect, v._nydp_inspect].join(" ")}.join(" ") + "}" ; end
117
+ def nydp_type ; :hash ; end
54
118
  end
data/lib/nydp/date.rb CHANGED
@@ -18,19 +18,18 @@ module Nydp
18
18
 
19
19
  def initialize ruby_date ; @ruby_date = ruby_date ; end
20
20
 
21
- def to_date ; ruby_date ; end
22
- def to_s ; ruby_date.to_s ; end
23
- def to_ruby ; ruby_date ; end
24
- def inspect ; ruby_date.inspect ; end
25
- def nydp_type ; :date ; end
26
- def > other ; is_date?(other) && ruby_date > other.ruby_date ; end
27
- def < other ; is_date?(other) && ruby_date < other.ruby_date ; end
28
- def == other ; is_date?(other) && ruby_date == other.ruby_date ; end
29
- def <=> other ; is_date?(other) && ruby_date <=> other.ruby_date ; end
30
- def eql? d ; self == d ; end
31
- def hash ; ruby_date.hash ; end
32
- def is_date? other ; other.is_a? Nydp::Date ; end
33
- def - other ; r2n(ruby_date - (is_date?(other) ? other.ruby_date : other)) ; end
21
+ def to_date ; ruby_date ; end
22
+ def to_s ; ruby_date.to_s ; end
23
+ def to_ruby ; ruby_date ; end
24
+ def inspect ; ruby_date.inspect ; end
25
+ def > other ; is_date?(other) && ruby_date > other ; end
26
+ def < other ; is_date?(other) && ruby_date < other ; end
27
+ def == other ; is_date?(other) && ruby_date == other ; end
28
+ def <=> other ; is_date?(other) && ruby_date <=> other ; end
29
+ def eql? d ; self == d ; end
30
+ def hash ; ruby_date.hash ; end
31
+ def is_date? other ; other.is_a? ::Date ; end
32
+ def - other ; ruby_date - other ; end
34
33
  def + int ; int.is_a?(Integer) ? r2n(ruby_date + int) : r2n(change(*int.to_ruby)) ; end
35
34
 
36
35
  @@pass_through = %i{ monday? tuesday? wednesday? thursday? friday? saturday? sunday? }
@@ -39,7 +38,8 @@ module Nydp
39
38
  last_year next_year beginning_of_year end_of_year
40
39
  last_month next_month beginning_of_month end_of_month
41
40
  last_week next_week beginning_of_week end_of_week
42
- yesterday tomorrow age
41
+ yesterday tomorrow age past?
42
+ future?
43
43
  } + @@pass_through
44
44
 
45
45
  def year y, m, d, w ; y ; end
@@ -47,6 +47,9 @@ module Nydp
47
47
  def day y, m, d, w ; d ; end
48
48
  def week_day y, m, d, w ; w ; end
49
49
 
50
+ def future? *_ ; ruby_date > ::Date.today ; end
51
+ def past? *_ ; ruby_date < ::Date.today ; end
52
+
50
53
  def last_year y, m, d, w ; ruby_date.prev_year ; end
51
54
  def next_year y, m, d, w ; ruby_date.next_year ; end
52
55
  def beginning_of_year y, m, d, w ; build(y, 1, 1) ; end
@@ -76,11 +79,11 @@ module Nydp
76
79
  class_eval "def #{n} * ; ruby_date.#{n} ; end"
77
80
  end
78
81
 
79
- def _nydp_keys ; @@keys.to_a ; end
80
- def dispatch key, y, m, d, w ; self.send(key, y, m, d, w) if _nydp_keys.include?(key) ; end
81
- def splat date ; [date.year, date.month, date.day, date.wday] ; end
82
- def lookup key, date ; r2n(dispatch(key.to_s.gsub(/-/, '_').to_sym, *splat(date))) ; end
83
- def _nydp_get key ; lookup key, ruby_date ; end
82
+ def _nydp_keys ; @@keys.to_a ; end
83
+ def dispatch key, y, m, d, w ; self.send(key, y, m, d, w) if _nydp_keys.include?(key) ; end
84
+ def splat date ; [date.year, date.month, date.day, date.wday] ; end
85
+ def lookup key, date ; r2n(dispatch(key.to_s.gsub(/-/, '_').to_sym, *splat(date))) ; end
86
+ def _nydp_get key ; lookup key, ruby_date ; end
84
87
  def change amount, attr
85
88
  if attr == :day ; (ruby_date + amount)
86
89
  elsif attr == :week ; (ruby_date + (7 * amount))
data/lib/nydp/error.rb CHANGED
@@ -9,8 +9,7 @@ module Nydp
9
9
  @nydp_cause = nydp_cause
10
10
  end
11
11
 
12
- def cause
13
- @nydp_cause || super
14
- end
12
+ def nydp_type ; :error ; end
13
+ def cause ; @nydp_cause || super ; end
15
14
  end
16
15
  end