nydp 0.1.15 → 0.2.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/lib/lisp/core-015-documentation.nydp +11 -4
  3. data/lib/lisp/core-040-utils.nydp +3 -0
  4. data/lib/lisp/tests/builtin-tests.nydp +1 -1
  5. data/lib/lisp/tests/foundation-test.nydp +40 -0
  6. data/lib/lisp/tests/time-examples.nydp +21 -0
  7. data/lib/nydp.rb +10 -8
  8. data/lib/nydp/builtin.rb +3 -2
  9. data/lib/nydp/builtin/apply.rb +2 -2
  10. data/lib/nydp/builtin/car.rb +1 -1
  11. data/lib/nydp/builtin/cdr.rb +1 -1
  12. data/lib/nydp/builtin/cdr_set.rb +1 -1
  13. data/lib/nydp/builtin/comment.rb +2 -2
  14. data/lib/nydp/builtin/cons.rb +1 -1
  15. data/lib/nydp/builtin/date.rb +20 -0
  16. data/lib/nydp/builtin/divide.rb +2 -2
  17. data/lib/nydp/builtin/ensuring.rb +3 -3
  18. data/lib/nydp/builtin/error.rb +1 -1
  19. data/lib/nydp/builtin/eval.rb +2 -6
  20. data/lib/nydp/builtin/greater_than.rb +3 -3
  21. data/lib/nydp/builtin/handle_error.rb +2 -2
  22. data/lib/nydp/builtin/hash.rb +14 -20
  23. data/lib/nydp/builtin/inspect.rb +1 -1
  24. data/lib/nydp/builtin/is_equal.rb +10 -5
  25. data/lib/nydp/builtin/less_than.rb +3 -3
  26. data/lib/nydp/builtin/load_tests.rb +3 -7
  27. data/lib/nydp/builtin/millisecs.rb +1 -1
  28. data/lib/nydp/builtin/minus.rb +2 -2
  29. data/lib/nydp/builtin/modulo.rb +1 -1
  30. data/lib/nydp/builtin/parse.rb +3 -6
  31. data/lib/nydp/builtin/parse_in_string.rb +3 -6
  32. data/lib/nydp/builtin/plus.rb +3 -3
  33. data/lib/nydp/builtin/pre_compile.rb +2 -2
  34. data/lib/nydp/builtin/puts.rb +2 -2
  35. data/lib/nydp/builtin/random_string.rb +4 -4
  36. data/lib/nydp/builtin/sort.rb +1 -1
  37. data/lib/nydp/builtin/sqrt.rb +1 -1
  38. data/lib/nydp/builtin/string_match.rb +7 -10
  39. data/lib/nydp/builtin/string_replace.rb +1 -1
  40. data/lib/nydp/builtin/string_split.rb +1 -1
  41. data/lib/nydp/builtin/sym.rb +2 -6
  42. data/lib/nydp/builtin/thread_locals.rb +1 -1
  43. data/lib/nydp/builtin/time.rb +52 -0
  44. data/lib/nydp/builtin/times.rb +2 -2
  45. data/lib/nydp/builtin/to_string.rb +2 -2
  46. data/lib/nydp/builtin/type_of.rb +3 -7
  47. data/lib/nydp/builtin/vm_info.rb +1 -1
  48. data/lib/nydp/compiler.rb +2 -2
  49. data/lib/nydp/cond.rb +1 -1
  50. data/lib/nydp/core.rb +48 -48
  51. data/lib/nydp/function_invocation.rb +1 -1
  52. data/lib/nydp/helper.rb +5 -5
  53. data/lib/nydp/interpreted_function.rb +3 -3
  54. data/lib/nydp/lexical_context.rb +4 -4
  55. data/lib/nydp/lexical_context_builder.rb +2 -2
  56. data/lib/nydp/pair.rb +11 -11
  57. data/lib/nydp/runner.rb +2 -2
  58. data/lib/nydp/symbol.rb +2 -2
  59. data/lib/nydp/symbol_lookup.rb +1 -1
  60. data/lib/nydp/truth.rb +8 -11
  61. data/lib/nydp/version.rb +1 -1
  62. data/lib/nydp/vm.rb +4 -3
  63. data/spec/date_spec.rb +28 -20
  64. data/spec/error_spec.rb +1 -1
  65. data/spec/foreign_hash_spec.rb +12 -12
  66. data/spec/hash_non_hash_behaviour_spec.rb +8 -8
  67. data/spec/hash_spec.rb +14 -14
  68. data/spec/literal_spec.rb +2 -2
  69. data/spec/nydp_spec.rb +6 -6
  70. data/spec/pair_spec.rb +8 -8
  71. data/spec/parser_spec.rb +1 -1
  72. data/spec/spec_helper.rb +1 -1
  73. data/spec/string_atom_spec.rb +9 -9
  74. data/spec/string_token_spec.rb +1 -1
  75. data/spec/symbol_spec.rb +9 -9
  76. data/spec/thread_local_spec.rb +2 -6
  77. data/spec/time_spec.rb +48 -0
  78. metadata +7 -3
  79. data/lib/nydp/builtin/today.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e6fd1dc5fc3149b5f11a0ebdde15b780b18961e
4
- data.tar.gz: f0f7f42ba740494b00425e3c5200acc12b9483c9
3
+ metadata.gz: f7639157cc6f6e6959cec1491e180b71930204ae
4
+ data.tar.gz: 80357a5ba720caa3065845a575a154087d9ff25c
5
5
  SHA512:
6
- metadata.gz: 20c231e32e8a611446082c2a3eb144ac5782226dcb15f44224a0a77813577d77bf538cf65f6d897f824f0d2c0e7a8a9f8e054c9d84d6b60b06781ede72d1cb1e
7
- data.tar.gz: ba1e3bc4f43c7c10bd8e06bd0ce45e513413b75a8213f0365abcb6389114e42ddf1e0c7746fbe78fc0829c5e711b57726ce11d6c11594b6f83fc674d8b372252
6
+ metadata.gz: 8a0824e45483b39ca5cd26730753025ffc57a1a976a83ec4e16f10c62c217993f30ef85d892aec26c52e08fb36dc8be9e55f460ed10a492bb2955260eb5e0636
7
+ data.tar.gz: c8530f8e2afcce52d310d2b76bf09de29dc162fd97df159e4c4fd3a7ac1c35b1deb103972d00fd7d7027ded94d98a85683cee28f849329f20975a955f85dbc62
@@ -37,6 +37,8 @@
37
37
  (cond (dox? name)
38
38
  (hash-get (car (dox-lookup name)) attr)))
39
39
 
40
+ (def dox-chapter-names () (hash-keys chapters ))
41
+ (def dox-chapter (name) (hash-get chapters name ))
40
42
  (def dox-what-is? (name) (dox-get-attr name 'what ))
41
43
  (def dox-src (name) (dox-get-attr name 'src ))
42
44
  (def dox-examples (name) (hash-get examples name ))
@@ -84,7 +86,8 @@
84
86
  'mac
85
87
  ',(map car (hash-get body-forms 'comment))
86
88
  ',args
87
- '(mac ,name ,args ,@(hash-get body-forms nil)))))
89
+ '(mac ,name ,args ,@(hash-get body-forms nil))
90
+ ',(map car (hash-get body-forms 'chapter)))))
88
91
 
89
92
  (hash-set macs 'mac
90
93
  (fn (name args . body)
@@ -94,13 +97,15 @@
94
97
  'mac
95
98
  '("define a new global macro")
96
99
  '(name args . body)
97
- '`(hash-set macs ',name (fn ,ooargs ,@body)))
100
+ '`(hash-set macs ',name (fn ,ooargs ,@body))
101
+ '(nydp-core))
98
102
 
99
103
  (dox-add-doc 'do
100
104
  'mac
101
105
  '("perform a series of operations")
102
106
  'args
103
- '`((fn nil ,@args)))
107
+ '`((fn nil ,@args))
108
+ '(nydp-core))
104
109
 
105
110
  (mac def-assign args `(assign ,@args))
106
111
 
@@ -111,8 +116,10 @@
111
116
  'def
112
117
  ',(map car (hash-get body-forms 'comment))
113
118
  ',args
114
- '(def ,name ,args ,@(hash-get body-forms nil)))))
119
+ '(def ,name ,args ,@(hash-get body-forms nil))
120
+ ',(map car (hash-get body-forms 'chapter)))))
115
121
 
116
122
  (mac def (name args . body)
117
123
  ; define a new function in the global namespace
124
+ (chapter nydp-core)
118
125
  (define-def-expr name args (filter-forms (build-def-hash (hash)) body)))
@@ -1,3 +1,6 @@
1
+ (def today ()
2
+ ; return a date for the current day
3
+ (date))
1
4
 
2
5
  (def eachr (f things)
3
6
  (when things
@@ -12,7 +12,6 @@
12
12
  ("eval" (inspect eval ) "builtin/eval" )
13
13
  ("hash" (inspect hash ) "builtin/hash" )
14
14
  ("date" (inspect date ) "builtin/date" )
15
- ("today" (inspect today ) "builtin/today" )
16
15
  ("error" (inspect error ) "builtin/error" )
17
16
  ("apply" (inspect apply ) "builtin/apply" )
18
17
  ("error" (inspect error ) "builtin/error" )
@@ -32,6 +31,7 @@
32
31
  ("string-length" (inspect string-length ) "builtin/string-length" )
33
32
  ("string-replace" (inspect string-replace ) "builtin/string-replace" )
34
33
  ("string-split" (inspect string-split ) "builtin/string-split" )
34
+ ("time" (inspect time ) "builtin/time" )
35
35
  ("thread-locals" (inspect thread-locals ) "builtin/thread-locals" )
36
36
  ("eq?" (inspect eq? ) "builtin/eq?" )
37
37
  ("hash-get" (inspect hash-get ) "builtin/hash-get" )
@@ -16,6 +16,46 @@
16
16
  (eq? '|| '||)
17
17
  t)
18
18
 
19
+ ("true for two identical numbers"
20
+ (eq? 42 42)
21
+ t)
22
+
23
+ ("true for three identical numbers"
24
+ (eq? 42 42 42)
25
+ t)
26
+
27
+ ("true for four identical numbers"
28
+ (eq? 42 42 42 42)
29
+ t)
30
+
31
+ ("true for five identical numbers"
32
+ (eq? 42 42 42 42 42)
33
+ t)
34
+
35
+ ("true for six identical numbers"
36
+ (eq? 42 42 42 42 42 42)
37
+ t)
38
+
39
+ ("false for one different number in six"
40
+ (eq? 42 42 42 42 42 -3)
41
+ nil)
42
+
43
+ ("false for one different number in five"
44
+ (eq? 42 42 42 -3 42)
45
+ nil)
46
+
47
+ ("false for one different number in four"
48
+ (eq? 42 -3 42 42)
49
+ nil)
50
+
51
+ ("false for one different number in three"
52
+ (eq? -3 42 42)
53
+ nil)
54
+
55
+ ("false for two different numbers"
56
+ (eq? -3 42)
57
+ nil)
58
+
19
59
  ("nil for two different symbols"
20
60
  (eq? 'foo 'bar)
21
61
  nil))
@@ -0,0 +1,21 @@
1
+ (examples-for time
2
+ ("creates a single date" (to-string (time 1965 6 8)) "1965-06-08 00:00:00 +0100" )
3
+ ("adds ten seconds" (to-string (time (time 2004 3 12 14 30) 10)) "2004-03-12 14:30:10 +0100" )
4
+ ("'+ adds seconds" (to-string (+ (time 2004 3 12 14 30) 29)) "2004-03-12 14:30:29 +0100" )
5
+ ("subtracts times" (time (time 2004 3 12 14 32) (time 2004 3 12 14 30)) 120.0 )
6
+ ("'- subtracts times" (- (time 2004 3 12 14 36) (time 2004 3 12 14 26)) 600.0 )
7
+
8
+ ("can act as hash key"
9
+ (with (h {} d (time 1971 11 18 14 57))
10
+ (hash-set h d "on this day")
11
+ (to-string (hash-get h (time 1971 11 18 14 57))))
12
+ "on this day")
13
+
14
+ ("equals itself" (eq? (time 2004 3 12) (time 2004 3 12)) t )
15
+ ("does not equal another" (eq? (time 2004 3 12) (time 2006 6 21)) nil)
16
+ ("does not equal nil" (eq? (time 2004 3 12) nil ) nil)
17
+ ("nil does not equal a time" (eq? nil (time 2004 3 12) ) nil)
18
+
19
+ ("returns its year" (&year (date (time 1999 12 31 13 29 52))) 1999)
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))
data/lib/nydp.rb CHANGED
@@ -8,7 +8,7 @@ module Nydp
8
8
  def self.testfiles; PLUGINS.map(&:testfiles).flatten ; end
9
9
  def self.plugin_names ; PLUGINS.map(&:name) ; end
10
10
  def self.loadall ns, files
11
- vm = VM.new
11
+ vm = VM.new(ns)
12
12
  files.each { |f|
13
13
  reader = Nydp::StreamReader.new(File.new(f))
14
14
  Nydp::Runner.new(vm, ns, reader).run
@@ -27,29 +27,31 @@ module Nydp
27
27
  def self.apply_function ns, function_name, *args
28
28
  function = r2n(function_name.to_sym, ns).value
29
29
  args = r2n args, ns
30
- vm = VM.new
30
+ vm = VM.new(ns)
31
31
 
32
32
  function.invoke vm, args
33
33
  vm.thread
34
34
  end
35
35
 
36
- def self.reader txt ; Nydp::StringReader.new txt ; end
37
- def self.eval_src ns, src_txt ; eval_with Nydp::Runner, ns, src_txt ; end
38
- def self.eval_src! ns, src_txt ; eval_with Nydp::ExplodeRunner, ns, src_txt ; end
39
- def self.eval_with runner, ns, src_txt ; runner.new(VM.new, ns, reader(src_txt)).run ; end
36
+ def self.reader txt ; Nydp::StringReader.new txt ; end
37
+ def self.eval_src ns, src_txt ; eval_with Nydp::Runner, ns, src_txt ; end
38
+ def self.eval_src! ns, src_txt ; eval_with Nydp::ExplodeRunner, ns, src_txt ; end
39
+ def self.eval_with runner, ns, src_txt ; runner.new(VM.new(ns), ns, reader(src_txt)).run ; end
40
40
 
41
41
  def self.repl
42
42
  puts "welcome to nydp"
43
43
  puts "^D to exit"
44
44
  reader = Nydp::ReadlineReader.new $stdin, "nydp > "
45
- Nydp::Runner.new(VM.new, build_nydp, reader, $stdout).run
45
+ ns = build_nydp
46
+ Nydp::Runner.new(VM.new(ns), ns, reader, $stdout).run
46
47
  end
47
48
 
48
49
  def self.tests *options
49
50
  verbose = options.include?(:verbose) ? "t" : "nil"
50
51
  puts "welcome to nydp : running tests"
51
52
  reader = Nydp::StringReader.new "(run-all-tests #{verbose})"
52
- Nydp::Runner.new(VM.new, build_nydp, reader).run
53
+ ns = build_nydp
54
+ Nydp::Runner.new(VM.new(ns), ns, reader).run
53
55
  end
54
56
 
55
57
  end
data/lib/nydp/builtin.rb CHANGED
@@ -5,7 +5,8 @@ module Nydp::Builtin
5
5
  module Base
6
6
  include Nydp::Helper
7
7
 
8
- def builtin_invoke_1 vm ; builtin_invoke vm, Nydp.NIL ; end
8
+ def builtin_invoke vm, args ; raise "#{self.class.name} : please implement #builtin_invoke" ; end
9
+ def builtin_invoke_1 vm ; builtin_invoke vm, Nydp::NIL ; end
9
10
  def builtin_invoke_2 vm, a ; builtin_invoke vm, cons(a) ; end
10
11
  def builtin_invoke_3 vm, a0, a1 ; builtin_invoke vm, cons(a0, cons(a1)) ; end
11
12
  def builtin_invoke_4 vm, a0, a1, a2 ; builtin_invoke vm, cons(a0, cons(a1, cons(a2))) ; end
@@ -13,7 +14,7 @@ module Nydp::Builtin
13
14
  def invoke_1 vm
14
15
  builtin_invoke_1 vm
15
16
  rescue Exception => e
16
- handle_error e, Nydp.NIL
17
+ handle_error e, Nydp::NIL
17
18
  end
18
19
 
19
20
  def invoke_2 vm, arg
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::Apply
2
- include Nydp::Helper, Nydp::Builtin::Base
2
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
5
  args.car.invoke vm, apply_args(args.cdr)
@@ -10,7 +10,7 @@ class Nydp::Builtin::Apply
10
10
  def apply_args args
11
11
  raise "Apply: expected a list : got #{args.inspect}" unless pair? args
12
12
  raise "Apply: improper list : cdr is ruby nil" if args.cdr.nil?
13
- return args.car if Nydp.NIL.is? args.cdr
13
+ return args.car if Nydp::NIL.is? args.cdr
14
14
  cons args.car, apply_args(args.cdr)
15
15
  end
16
16
  end
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::Car
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
5
  vm.push_arg args.car.car
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::Cdr
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
5
  vm.push_arg args.car.cdr
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::CdrSet
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
5
  pair = args.car
@@ -1,7 +1,7 @@
1
1
  class Nydp::Builtin::Comment
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
- vm.push_arg Nydp.NIL
5
+ vm.push_arg Nydp::NIL
6
6
  end
7
7
  end
@@ -1,6 +1,6 @@
1
1
  module Nydp::Builtin
2
2
  class Cons
3
- include Nydp::Builtin::Base
3
+ include Nydp::Builtin::Base, Singleton
4
4
 
5
5
  def builtin_invoke vm, args
6
6
  vm.push_arg Nydp::Pair.new(args.car, args.cdr.car)
@@ -0,0 +1,20 @@
1
+ class Nydp::Builtin::Date
2
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
3
+
4
+ def builtin_invoke_1 vm
5
+ vm.push_arg(Nydp::Date.new Date.today)
6
+ end
7
+
8
+ # it's a Time object (or any object that responds to #to_date)
9
+ def builtin_invoke_2 vm, arg
10
+ vm.push_arg(Nydp::Date.new arg.to_date)
11
+ end
12
+
13
+ def builtin_invoke_3 vm, a0, a1
14
+ raise Nydp::Error.new "Date, got 2 args (#{a0} #{a1}), expected 0 or 1 or 3 args"
15
+ end
16
+
17
+ def builtin_invoke_4 vm, y, m, d
18
+ vm.push_arg(Nydp::Date.new Date.new(y,m,d))
19
+ end
20
+ end
@@ -1,12 +1,12 @@
1
1
  class Nydp::Builtin::Divide
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
5
  vm.push_arg divide(args.cdr, args.car)
6
6
  end
7
7
 
8
8
  def divide args, accum
9
- if Nydp.NIL.is? args
9
+ if Nydp::NIL.is? args
10
10
  accum
11
11
  else
12
12
  divide(args.cdr, (accum / args.car))
@@ -1,7 +1,7 @@
1
1
  require "nydp/vm"
2
2
 
3
3
  class Nydp::Builtin::Ensuring
4
- include Nydp::Helper, Nydp::Builtin::Base
4
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
5
5
 
6
6
  class InvokeProtection
7
7
  include Nydp::VM::Finally
@@ -12,7 +12,7 @@ class Nydp::Builtin::Ensuring
12
12
  end
13
13
 
14
14
  def execute vm
15
- protection.invoke vm, Nydp.NIL
15
+ protection.invoke vm, Nydp::NIL
16
16
  end
17
17
  end
18
18
 
@@ -24,6 +24,6 @@ class Nydp::Builtin::Ensuring
24
24
  vm.instructions.push protection_instructions
25
25
  vm.contexts.push vm.current_context
26
26
 
27
- fn_tricky.invoke vm, Nydp.NIL
27
+ fn_tricky.invoke vm, Nydp::NIL
28
28
  end
29
29
  end
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::Error
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  # override #invoke on nydp/builtin/base because
5
5
  # we don't want to inherit error handling
@@ -1,12 +1,8 @@
1
1
  class Nydp::Builtin::Eval
2
- include Nydp::Builtin::Base
3
-
4
- def initialize ns
5
- @ns = ns
6
- end
2
+ include Nydp::Builtin::Base, Singleton
7
3
 
8
4
  def builtin_invoke vm, args
9
- evaluator = Nydp::Evaluator.new Nydp::VM.new, @ns
5
+ evaluator = Nydp::Evaluator.new Nydp::VM.new(vm.ns), vm.ns
10
6
  vm.push_arg evaluator.evaluate args.car
11
7
  end
12
8
  end
@@ -1,12 +1,12 @@
1
1
  class Nydp::Builtin::GreaterThan
2
- include Nydp::Builtin::Base
2
+ include Nydp::Builtin::Base, Singleton
3
3
 
4
4
  def builtin_invoke vm, args
5
- vm.push_arg (greater_than(args.car, args.cdr) ? Nydp.T : Nydp.NIL)
5
+ vm.push_arg (greater_than(args.car, args.cdr) ? Nydp::T : Nydp::NIL)
6
6
  end
7
7
 
8
8
  def greater_than arg, args
9
- return true if Nydp.NIL.is? args
9
+ return true if Nydp::NIL.is? args
10
10
  (arg > args.car) && greater_than(args.car, args.cdr)
11
11
  end
12
12
 
@@ -1,7 +1,7 @@
1
1
  require "nydp/vm"
2
2
 
3
3
  class Nydp::Builtin::HandleError
4
- include Nydp::Helper, Nydp::Builtin::Base
4
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
5
5
 
6
6
  class CatchError
7
7
  include Nydp::Helper, Nydp::VM::HandleError
@@ -36,6 +36,6 @@ class Nydp::Builtin::HandleError
36
36
  vm.instructions.push catcher_instructions
37
37
  vm.contexts.push vm.current_context
38
38
 
39
- fn_tricky.invoke vm, Nydp.NIL
39
+ fn_tricky.invoke vm, Nydp::NIL
40
40
  end
41
41
  end
@@ -1,27 +1,25 @@
1
1
  require "nydp/hash"
2
2
 
3
3
  class Nydp::Builtin::Hash
4
- include Nydp::Helper, Nydp::Builtin::Base
4
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
5
5
  def builtin_invoke vm, args
6
6
  vm.push_arg(Nydp::Hash.new)
7
7
  end
8
8
  end
9
9
 
10
10
  class Nydp::Builtin::HashGet
11
- include Nydp::Helper, Nydp::Builtin::Base
12
- attr_accessor :ns
13
- def initialize ns ; @ns = ns; end
11
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
14
12
  def builtin_invoke vm, args
15
13
  hsh = args.car
16
14
  key = args.cdr.car
17
15
  case hsh
18
16
  when Nydp::Hash
19
- vm.push_arg(hsh[key] || Nydp.NIL)
20
- when NilClass, Nydp.NIL
21
- vm.push_arg Nydp.NIL
17
+ vm.push_arg(hsh[key] || Nydp::NIL)
18
+ when NilClass, Nydp::NIL
19
+ vm.push_arg Nydp::NIL
22
20
  else
23
21
  v = hsh.respond_to?(:[]) ? hsh[n2r key] : ruby_call(hsh, key)
24
- vm.push_arg(r2n v, ns)
22
+ vm.push_arg(r2n v, vm.ns)
25
23
  end
26
24
  end
27
25
 
@@ -38,7 +36,7 @@ class Nydp::Builtin::HashGet
38
36
  end
39
37
 
40
38
  class Nydp::Builtin::HashSet
41
- include Nydp::Helper, Nydp::Builtin::Base
39
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
42
40
  def builtin_invoke vm, args
43
41
  hash = args.car
44
42
  key = args.cdr.car
@@ -46,7 +44,7 @@ class Nydp::Builtin::HashSet
46
44
  case hash
47
45
  when Nydp::Hash
48
46
  hash[key] = value
49
- when NilClass, Nydp.NIL
47
+ when NilClass, Nydp::NIL
50
48
  nil
51
49
  else
52
50
  if hash.respond_to?(:[]=)
@@ -60,25 +58,21 @@ class Nydp::Builtin::HashSet
60
58
  end
61
59
 
62
60
  class Nydp::Builtin::HashKeys
63
- include Nydp::Helper, Nydp::Builtin::Base
64
- attr_accessor :ns
65
- def initialize ns ; @ns = ns; end
61
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
66
62
  def builtin_invoke vm, args
67
63
  hash = args.car
68
64
  if hash.is_a? Nydp::Hash
69
65
  vm.push_arg Nydp::Pair.from_list hash.keys
70
66
  elsif hash.respond_to?(:keys)
71
- vm.push_arg r2n(hash.keys.to_a.sort, ns)
67
+ vm.push_arg r2n(hash.keys.to_a.sort, vm.ns)
72
68
  else
73
- vm.push_arg Nydp.NIL
69
+ vm.push_arg Nydp::NIL
74
70
  end
75
71
  end
76
72
  end
77
73
 
78
74
  class Nydp::Builtin::HashKeyPresent
79
- include Nydp::Helper, Nydp::Builtin::Base
80
- attr_accessor :ns
81
- def initialize ns ; @ns = ns; end
75
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
82
76
  def builtin_invoke vm, args
83
77
  hash = args.car
84
78
  key = args.cdr.car
@@ -88,13 +82,13 @@ class Nydp::Builtin::HashKeyPresent
88
82
  else
89
83
  hash.key? n2r key
90
84
  end
91
- vm.push_arg(truth ? Nydp.T : Nydp.NIL)
85
+ vm.push_arg(truth ? Nydp::T : Nydp::NIL)
92
86
  end
93
87
  def name ; "hash-key?" ; end
94
88
  end
95
89
 
96
90
  class Nydp::Builtin::HashMerge
97
- include Nydp::Helper, Nydp::Builtin::Base
91
+ include Nydp::Helper, Nydp::Builtin::Base, Singleton
98
92
 
99
93
  def builtin_invoke vm, args
100
94
  hash_0 = args.car