nydp 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e297c2db504d03a1ae69c9b084c42d2967c409f6
4
- data.tar.gz: 14ef550b291308d9fe1b5804a17e82733df7d46e
3
+ metadata.gz: 39e2357b8393c54fc0eea68f0edd2a8d6728ad3a
4
+ data.tar.gz: 27f90d034ee3a3fa44fe7c24e3a08638ac5b6781
5
5
  SHA512:
6
- metadata.gz: 9b0ee4357faaf3d0d4f2a7be37df48eac75877c3e717c32ac05ab1e57372d36764f2f1d185ba4acbba90e34bb5f73ea8c1165fc8db4d640762ee42bdaedf6985
7
- data.tar.gz: 36bd8b57e1b6dfb3634129806931b5d0b4e69caaa7bff59f0540c68a34ad9fc18d96b11d360069a1f38aa474e279b5e75db54fd198bd10fb66553fc73519d760
6
+ metadata.gz: 18a8c415c0a4c6418a17122fd619cc840120e9a5d3fc0444185399e22d52fe4852c966f60cc67c304e7c2b38e7b449459d5cbac498caa67fe405de8eb56809a1
7
+ data.tar.gz: b959fde0c9b6e51957687eccdd7252cacea90e51a82d8d166242aaaa41835035ecec79987a3cbe4ee741b2097f131401f094739e5f1b4cb5e26789992cb31c95
@@ -1,10 +1,16 @@
1
- ((fn (dox examples)
1
+ ((fn (dox examples chapters)
2
2
  (def dox-add-doc (name what texts args src)
3
3
  (hash-set dox
4
4
  name
5
5
  (cons (list name what texts args src)
6
6
  (hash-get dox sym))))
7
7
 
8
+ (def dox-add-to-chapter (chapter item)
9
+ (hash-set chapters
10
+ item
11
+ (cons item
12
+ (hash-get chapters item))))
13
+
8
14
  (def dox-add-examples (name example-exprs)
9
15
  (hash-set examples
10
16
  name
@@ -33,7 +39,7 @@
33
39
  (def dox-arg-names (name)
34
40
  (cond (dox? name)
35
41
  (cadddr (car (dox-lookup name))))))
36
- (hash) (hash))
42
+ (hash) (hash) (hash))
37
43
 
38
44
  (def isa-comment? (thing)
39
45
  (cond (pair? thing)
@@ -218,7 +218,10 @@
218
218
  `(brace-list-mono ,(car args))
219
219
  (brace-list-build-hash args)))
220
220
 
221
+ (mac returnlet (var val . body)
222
+ ; stores ,val in ,var, executes ,@body, returns ,var
223
+ `(let ,var ,val ,@body ,var))
224
+
221
225
  (mac returning (val . body)
222
226
  ; stores ,val, executes ,@body, and returns ,val.
223
- (w/uniq retval
224
- `(let ,retval ,val ,@body ,retval)))
227
+ (w/uniq retval `(returnlet ,retval ,val ,@body)))
@@ -29,14 +29,27 @@
29
29
  txt)))
30
30
 
31
31
  (def joinstr (txt . things)
32
- (let joinables (flatten things)
33
- (apply +
34
- (to-string (car joinables))
35
- (flatten (zip (map (fn (_) txt) (cdr joinables))
36
- (map to-string (cdr joinables)))))))
32
+ ; flatten 'things into a single list (ie unnest lists)
33
+ ; convert each item to a string
34
+ ; return a single string which is the concatenation of each
35
+ ; stringified item, with given 'txt inserted in between
36
+ ; each item
37
+ (let joinables (flatten things)
38
+ (apply +
39
+ (to-string (car joinables))
40
+ (flatten (zip (map (fn (_) txt) (cdr joinables))
41
+ (map to-string (cdr joinables)))))))
42
+
43
+ (def j items
44
+ ; delegate to 'joinstr with an empty join string
45
+ (joinstr "" items))
37
46
 
38
47
  (def string-pieces pieces
39
- (joinstr "" pieces))
48
+ ; string-interpolation syntax emits this form. Default implementation
49
+ ; is to delegate to 'j , but containing forms may use macros that
50
+ ; override this in order to provide specific interpolation behaviour
51
+ ; (for example, formatting numbers or stripping HTML tags)
52
+ (j pieces))
40
53
 
41
54
  (def collect (f things)
42
55
  ; if 'things is a list, return all the items in the list for which 'f returns non-nil
@@ -36,3 +36,24 @@
36
36
  (def uniqify (things)
37
37
  ; return a list containing all the elements of 'things, but with no duplicates
38
38
  (reject (seen?) things))
39
+
40
+ (def group-by (f things)
41
+ ; return a hash of 'things keyed by (f thing) for
42
+ ; each thing in 'things
43
+ (returnlet hsh {}
44
+ (each thing things
45
+ (hash-cons hsh (f thing) thing))))
46
+
47
+ (with (m2i λd(+ (* 12 d.year) (- d.month 1))
48
+ i2m λi(date (/ i 12) (+ 1 (mod i 12)) 1))
49
+ (def relative-months (anchor . mm)
50
+ ; 'anchor is a date
51
+ ; 'mm is a list of integers
52
+ ; for each m in 'mm, return the date at the beginning of
53
+ ; the month given by adding m months to 'anchor
54
+ (let mi (m2i anchor)
55
+ (map λm(i2m (+ mi m)) mm))))
56
+
57
+ (mac auto-hash names
58
+ ; (auto-hash a b c) same as { a a b b c c }
59
+ `(brace-list ,@(flatten:map λn(list n n) names)))
@@ -0,0 +1,5 @@
1
+ (examples-for auto-hash
2
+ ("builds a hash from the existing lexical context"
3
+ (with (a 1 b 2 c 3)
4
+ (to-string (auto-hash a b c)))
5
+ "{a=>1, b=>2, c=>3}"))
@@ -85,7 +85,11 @@
85
85
 
86
86
  ("special combination with bang"
87
87
  (pre-compile '(!x:y a b))
88
- ((fn args (no (x (apply y args)))) a b)))
88
+ ((fn args (no (x (apply y args)))) a b))
89
+
90
+ ("precedence over ampersand-syntax"
91
+ (pre-compile '(&attr:func a b))
92
+ ((fn args ((fn (obj) (hash-get obj (quote attr))) (apply func args))) a b)))
89
93
 
90
94
  (examples-for let
91
95
  ("expands 'let"
@@ -81,3 +81,6 @@
81
81
  ("multiplies 2 floats" (* 4.2 0.5) 2.1)
82
82
  ("multiplies 3 floats" (* 4.2 -2.5) -10.5)
83
83
  ("multiplies 4 floats" (* 6.6 1.1 3.3) 23.958))
84
+
85
+ (examples-for mod
86
+ ("modulus for two ints" (mod 64 6) 4))
@@ -24,6 +24,11 @@
24
24
  (to-string (hash-get h (date 2015 11 8))))
25
25
  "on this day")
26
26
 
27
+ ("equals itself" (eq? (date 2004 3 12) (date 2004 3 12)) t )
28
+ ("does not equal another" (eq? (date 2004 3 12) (date 2006 6 21)) nil)
29
+ ("does not equal nil" (eq? (date 2004 3 12) nil ) nil)
30
+ ("nil does not equal a date" (eq? nil (date 2004 3 12) ) nil)
31
+
27
32
  ("returns its year" (let d (date 1999 12 31) d.year) 1999)
28
33
  ("returns its month" (let d (date 1999 12 31) d.month) 12 )
29
34
  ("returns its day" (let d (date 1999 12 31) d.day) 31 )
@@ -0,0 +1,8 @@
1
+ (examples-for group-by
2
+ ("create a hash keyed by value of given function"
3
+ (let h (group-by car
4
+ (list '(a b c) '(a x y) '(b c d) '(z y x) '(z b a) '(1 2 3)))
5
+ (joinstr ", "
6
+ (map λk(j k " -> " (inspect:hash-get h k))
7
+ (hash-keys h))))
8
+ "a -> ((a x y) (a b c)), b -> ((b c d)), z -> ((z b a) (z y x)), 1 -> ((1 2 3))"))
@@ -0,0 +1,4 @@
1
+ (examples-for relative-months
2
+ ("finds dates around a given date"
3
+ (joinstr " - " (relative-months (date 2000 1 1) -32 -2 0 2 24))
4
+ "1997-05-01 - 1999-11-01 - 2000-01-01 - 2000-03-01 - 2002-01-01"))
@@ -4,3 +4,9 @@
4
4
  (returning x
5
5
  (= x 3)))
6
6
  2))
7
+
8
+ (examples-for returnlet
9
+ ("it stores the given value in the given variable, executes body, returns the value assigned to the variable"
10
+ (let result (returnlet hsh (hash) (= hsh.a 1) (= hsh.b 2))
11
+ (list (hash-keys result) (hash-values result)))
12
+ ((a b) (1 2))))
@@ -62,6 +62,14 @@
62
62
  (joinstr " - " '(1 2 3))
63
63
  "1 - 2 - 3"))
64
64
 
65
+ (examples-for j
66
+ ("joins elements with empty string"
67
+ (j 1 2 3)
68
+ "123")
69
+ ("joins elements of a list with empty string"
70
+ (j '(1 2 3))
71
+ "123"))
72
+
65
73
  (examples-for string-strip
66
74
  ("removes leading whitespace" (string-strip " hello!") "hello!" )
67
75
  ("removes trailing whitespace" (string-strip "(world) ") "(world)" )
@@ -0,0 +1,11 @@
1
+ class Nydp::Builtin::Modulo
2
+ include Nydp::Builtin::Base
3
+
4
+ def invoke_3 vm, a0, a1 ; vm.push_arg(a0 % a1) ; end
5
+
6
+ def builtin_invoke vm, args
7
+ invoke_3 vm, args.car, args.cdr.car
8
+ end
9
+
10
+ def name ; "mod" ; end
11
+ end
data/lib/nydp/core.rb CHANGED
@@ -30,6 +30,7 @@ module Nydp
30
30
  Symbol.mk(:/, ns).assign(Nydp::Builtin::Divide.new)
31
31
  Symbol.mk(:>, ns).assign(Nydp::Builtin::GreaterThan.new)
32
32
  Symbol.mk(:<, ns).assign(Nydp::Builtin::LessThan.new)
33
+ Symbol.mk(:mod, ns).assign(Nydp::Builtin::Modulo.new)
33
34
  Symbol.mk(:eval, ns).assign(Nydp::Builtin::Eval.new(ns))
34
35
  Symbol.mk(:false, ns).assign(false)
35
36
  Symbol.mk(:hash, ns).assign(Nydp::Builtin::Hash.new)
data/lib/nydp/date.rb CHANGED
@@ -25,20 +25,14 @@ module Nydp
25
25
  def inspect ; ruby_date.inspect ; end
26
26
  def nydp_type ; :date ; end
27
27
  def + int ; r2n(ruby_date + int , nil) ; end
28
- def > other ; ruby_date > other.ruby_date ; end
29
- def < other ; ruby_date < other.ruby_date ; end
30
- def == other ; ruby_date == other.ruby_date ; end
31
- def <=> 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 == other ; is_date?(other) && ruby_date == other.ruby_date ; end
31
+ def <=> other ; is_date?(other) && ruby_date <=> other.ruby_date ; end
32
32
  def eql? d ; self == d ; end
33
33
  def hash ; ruby_date.hash ; end
34
-
35
- def - other
36
- if other.is_a? Nydp::Date
37
- r2n(ruby_date - other.ruby_date, nil)
38
- else
39
- r2n(ruby_date - other, nil)
40
- end
41
- end
34
+ def is_date? other ; other.is_a? Nydp::Date ; end
35
+ def - other ; r2n(ruby_date - (is_date?(other) ? other.ruby_date : other), nil) ; end
42
36
 
43
37
  @@pass_through = %i{ monday? tuesday? wednesday? thursday? friday? saturday? sunday? }
44
38
  @@keys = Set.new %i{
data/lib/nydp/parser.rb CHANGED
@@ -44,11 +44,11 @@ module Nydp
44
44
  [
45
45
  [ /%/, "percent-syntax" ],
46
46
  [ /\!/, "bang-syntax" ],
47
+ [ /::/, "colon-colon-syntax"],
48
+ [ /:/, "colon-syntax" ],
47
49
  [ /&/, "ampersand-syntax" ],
48
50
  [ /\./, "dot-syntax" ],
49
51
  [ /\$/, "dollar-syntax" ],
50
- [ /::/, "colon-colon-syntax"],
51
- [ /:/, "colon-syntax" ],
52
52
  [ /->/, "arrow-syntax" ],
53
53
  [ /[=][>]/, "rocket-syntax" ],
54
54
  ]
data/lib/nydp/truth.rb CHANGED
@@ -1,13 +1,15 @@
1
1
  module Nydp
2
2
  class Truth
3
- def to_s ; 't' ; end
4
- def inspect ; 't[nydp::Truth]' ; end
5
- def assign *_ ; self ; end
6
- def nydp_type ; :truth ; end
7
- def to_ruby ; true ; end
3
+ def init_with *; Nydp.T ; end
4
+ def to_s ; 't' ; end
5
+ def inspect ; 't[nydp::Truth]' ; end
6
+ def assign *_ ; self ; end
7
+ def nydp_type ; :truth ; end
8
+ def to_ruby ; true ; end
8
9
  end
9
10
 
10
11
  class Nil
12
+ def init_with * ; Nydp.NIL ; end
11
13
  def car ; self ; end
12
14
  def cdr ; self ; end
13
15
  def size ; 0 ; end
data/lib/nydp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nydp
2
- VERSION = "0.1.11"
2
+ VERSION = "0.1.12"
3
3
  end
data/spec/date_spec.rb CHANGED
@@ -46,36 +46,56 @@ describe Nydp::Date do
46
46
  expect(diff).to eq 6
47
47
  end
48
48
 
49
- it "works with builtin greater-than when true" do
50
- f = Nydp::Builtin::GreaterThan.new
49
+ describe "'>" do
50
+ it "works with builtin greater-than when true" do
51
+ f = Nydp::Builtin::GreaterThan.new
51
52
 
52
- f.invoke vm, pair_list([d1, d0])
53
+ f.invoke vm, pair_list([d1, d0])
53
54
 
54
- expect(vm.pop_arg).to eq Nydp.T
55
- end
55
+ expect(vm.pop_arg).to eq Nydp.T
56
+ end
56
57
 
57
- it "works with builtin greater-than when false" do
58
- f = Nydp::Builtin::GreaterThan.new
58
+ it "compares with nil" do
59
+ f = Nydp::Builtin::GreaterThan.new
59
60
 
60
- f.invoke vm, pair_list([d0, d1])
61
+ f.invoke vm, pair_list([d1, Nydp.NIL])
61
62
 
62
- expect(vm.pop_arg).to eq Nydp.NIL
63
- end
63
+ expect(vm.pop_arg).to eq Nydp.NIL
64
+ end
64
65
 
65
- it "works with builtin less-than when true" do
66
- f = Nydp::Builtin::LessThan.new
66
+ it "works with builtin greater-than when false" do
67
+ f = Nydp::Builtin::GreaterThan.new
67
68
 
68
- f.invoke vm, pair_list([d0, d1])
69
+ f.invoke vm, pair_list([d0, d1])
69
70
 
70
- expect(vm.pop_arg).to eq Nydp.T
71
+ expect(vm.pop_arg).to eq Nydp.NIL
72
+ end
71
73
  end
72
74
 
73
- it "works with builtin less-than when false" do
74
- f = Nydp::Builtin::LessThan.new
75
+ describe "'<" do
76
+ it "works with builtin less-than when true" do
77
+ f = Nydp::Builtin::LessThan.new
78
+
79
+ f.invoke vm, pair_list([d0, d1])
80
+
81
+ expect(vm.pop_arg).to eq Nydp.T
82
+ end
83
+
84
+ it "works with builtin less-than when false" do
85
+ f = Nydp::Builtin::LessThan.new
86
+
87
+ f.invoke vm, pair_list([d1, d0])
88
+
89
+ expect(vm.pop_arg).to eq Nydp.NIL
90
+ end
91
+
92
+ it "compares with nil" do
93
+ f = Nydp::Builtin::LessThan.new
75
94
 
76
- f.invoke vm, pair_list([d1, d0])
95
+ f.invoke vm, pair_list([d1, Nydp.NIL])
77
96
 
78
- expect(vm.pop_arg).to eq Nydp.NIL
97
+ expect(vm.pop_arg).to eq Nydp.NIL
98
+ end
79
99
  end
80
100
 
81
101
  it "works with builtin plus" do
@@ -0,0 +1,88 @@
1
+ require "spec_helper"
2
+
3
+ describe Nydp::Hash do
4
+ let(:vm) { Nydp::VM.new }
5
+
6
+ describe "foreign hashes" do
7
+ let(:ahash) { Hash.new }
8
+
9
+ describe "hash set" do
10
+ it "returns a new Nydp hash" do
11
+ k = Nydp::Symbol.mk "keysym", ns
12
+ v = Nydp::StringAtom.new "foobar"
13
+ args = pair_list [ahash, k, v]
14
+ Nydp::Builtin::HashSet.new.invoke vm, args
15
+
16
+ expect(ahash[:keysym]). to eq "foobar"
17
+ expect(ahash[:keysym].class).to eq String
18
+ expect(ahash.keys). to eq [:keysym]
19
+
20
+ expect(vm.pop_arg).to eq v
21
+ end
22
+ end
23
+
24
+ describe "hash get" do
25
+ it "converts ruby value to nydp value" do
26
+ ahash[:keysym] = "avalue"
27
+ k = sym("keysym")
28
+ args = [ ahash, k ]
29
+
30
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
31
+
32
+ expect(vm.pop_arg).to eq Nydp::StringAtom.new("avalue")
33
+ end
34
+
35
+ it "converts ruby nil to nydp value" do
36
+ k = sym("keysym")
37
+ args = [ ahash, k ]
38
+
39
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
40
+
41
+ expect(vm.pop_arg).to eq Nydp.NIL
42
+ end
43
+
44
+ it "converts ruby true to nydp value" do
45
+ ahash[:keysym] = true
46
+ k = sym("keysym")
47
+ args = [ ahash, k ]
48
+
49
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
50
+
51
+ expect(vm.pop_arg).to eq Nydp.T
52
+ end
53
+ end
54
+
55
+ describe "key?" do
56
+ it "returns t when key is present" do
57
+ ahash[:simon] = 24
58
+ k = sym("simon")
59
+ args = [ ahash, k ]
60
+
61
+ Nydp::Builtin::HashKeyPresent.new(ns).invoke vm, pair_list(args)
62
+
63
+ expect(vm.pop_arg).to eq Nydp.T
64
+ end
65
+
66
+ it "returns nil when key is absent" do
67
+ k = sym("simon")
68
+ args = [ ahash, k ]
69
+
70
+ Nydp::Builtin::HashKeyPresent.new(ns).invoke vm, pair_list(args)
71
+
72
+ expect(vm.pop_arg).to eq Nydp.NIL
73
+ end
74
+ end
75
+
76
+ describe "hash keys" do
77
+ it "returns a list of keys" do
78
+ ahash[:k0] = 42
79
+ ahash[:k1] = 84
80
+ args = [ahash]
81
+
82
+ Nydp::Builtin::HashKeys.new(ns).invoke vm, pair_list(args)
83
+
84
+ expect(vm.pop_arg).to eq pair_list [sym("k0"), sym("k1")]
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+
3
+ describe Nydp::Hash do
4
+ let(:vm) { Nydp::VM.new }
5
+
6
+ describe "friendly non-hashes" do
7
+ let(:ahash) { TestThing.new 123, "hello there", "private" }
8
+
9
+ describe "hash get" do
10
+ it "returns a plain number" do
11
+ k = Nydp::Symbol.mk "a", ns
12
+ args = [ ahash, k ]
13
+
14
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
15
+ expect(vm.pop_arg).to eq 123
16
+ end
17
+
18
+ it "converts ruby value to nydp value" do
19
+ k = Nydp::Symbol.mk "b", ns
20
+ args = [ ahash, k ]
21
+
22
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
23
+ expect(vm.pop_arg).to eq Nydp::StringAtom.new("hello there")
24
+ end
25
+
26
+ it "converts string keys to method names" do
27
+ k = Nydp::StringAtom.new "b"
28
+ args = [ ahash, k ]
29
+
30
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
31
+ expect(vm.pop_arg).to eq Nydp::StringAtom.new("hello there")
32
+ end
33
+
34
+ it "returns nil for unavailable methods" do
35
+ k = Nydp::Symbol.mk "c", ns
36
+ args = [ ahash, k ]
37
+
38
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
39
+ expect(vm.pop_arg).to eq Nydp.NIL
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "unfriendly non-hash" do
45
+ let(:ahash) { Nydp::StringAtom.new "this here ain't no hash, hombre" }
46
+
47
+ describe "hash set" do
48
+ it "does nothing, returns its value" do
49
+ k = Nydp::Symbol.mk "keysym", ns
50
+ v = Nydp::StringAtom.new "foobar"
51
+ args = pair_list [ahash, k, v]
52
+
53
+ begin
54
+ Nydp::Builtin::HashSet.new.invoke vm, args
55
+ rescue Exception => e
56
+ error = e
57
+ end
58
+
59
+ expect(error.message.gsub(/at \/.*:in `builtin_invoke'/, '<error info>')).to eq "Called builtin/hash-set
60
+ with args (\"this here ain't no hash, hombre\" keysym \"foobar\")
61
+ raised
62
+ hash-set: Not a hash: Nydp::StringAtom
63
+ <error info>"
64
+ end
65
+ end
66
+
67
+ describe "hash get" do
68
+ it "converts ruby value to nydp value" do
69
+ k = Nydp::Symbol.mk "keysym", ns
70
+ args = [ ahash, k ]
71
+
72
+ begin
73
+ Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
74
+ rescue Exception => e
75
+ error = e
76
+ end
77
+
78
+ expect(error.message.gsub(/at \/.*:in `ruby_call'/, '<error info>')).to eq "Called builtin/hash-get
79
+ with args (\"this here ain't no hash, hombre\" keysym)
80
+ raised
81
+ hash-get: Not a hash: Nydp::StringAtom
82
+ <error info>"
83
+ end
84
+ end
85
+ end
86
+ end
data/spec/hash_spec.rb CHANGED
@@ -130,89 +130,6 @@ describe Nydp::Hash do
130
130
  end
131
131
  end
132
132
 
133
- describe "foreign hashes" do
134
- let(:ahash) { Hash.new }
135
-
136
- describe "hash set" do
137
- it "returns a new Nydp hash" do
138
- k = Nydp::Symbol.mk "keysym", ns
139
- v = Nydp::StringAtom.new "foobar"
140
- args = pair_list [ahash, k, v]
141
- Nydp::Builtin::HashSet.new.invoke vm, args
142
-
143
- expect(ahash[:keysym]). to eq "foobar"
144
- expect(ahash[:keysym].class).to eq String
145
- expect(ahash.keys). to eq [:keysym]
146
-
147
- expect(vm.pop_arg).to eq v
148
- end
149
- end
150
-
151
- describe "hash get" do
152
- it "converts ruby value to nydp value" do
153
- ahash[:keysym] = "avalue"
154
- k = sym("keysym")
155
- args = [ ahash, k ]
156
-
157
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
158
-
159
- expect(vm.pop_arg).to eq Nydp::StringAtom.new("avalue")
160
- end
161
-
162
- it "converts ruby nil to nydp value" do
163
- k = sym("keysym")
164
- args = [ ahash, k ]
165
-
166
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
167
-
168
- expect(vm.pop_arg).to eq Nydp.NIL
169
- end
170
-
171
- it "converts ruby true to nydp value" do
172
- ahash[:keysym] = true
173
- k = sym("keysym")
174
- args = [ ahash, k ]
175
-
176
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
177
-
178
- expect(vm.pop_arg).to eq Nydp.T
179
- end
180
- end
181
-
182
- describe "key?" do
183
- it "returns t when key is present" do
184
- ahash[:simon] = 24
185
- k = sym("simon")
186
- args = [ ahash, k ]
187
-
188
- Nydp::Builtin::HashKeyPresent.new(ns).invoke vm, pair_list(args)
189
-
190
- expect(vm.pop_arg).to eq Nydp.T
191
- end
192
-
193
- it "returns nil when key is absent" do
194
- k = sym("simon")
195
- args = [ ahash, k ]
196
-
197
- Nydp::Builtin::HashKeyPresent.new(ns).invoke vm, pair_list(args)
198
-
199
- expect(vm.pop_arg).to eq Nydp.NIL
200
- end
201
- end
202
-
203
- describe "hash keys" do
204
- it "returns a list of keys" do
205
- ahash[:k0] = 42
206
- ahash[:k1] = 84
207
- args = [ahash]
208
-
209
- Nydp::Builtin::HashKeys.new(ns).invoke vm, pair_list(args)
210
-
211
- expect(vm.pop_arg).to eq pair_list [sym("k0"), sym("k1")]
212
- end
213
- end
214
- end
215
-
216
133
  describe "get/set nil" do
217
134
  let(:ahash) { Nydp.NIL }
218
135
 
@@ -239,85 +156,4 @@ describe Nydp::Hash do
239
156
  end
240
157
  end
241
158
  end
242
-
243
- describe "friendly non-hashes" do
244
- let(:ahash) { TestThing.new 123, "hello there", "private" }
245
-
246
- describe "hash get" do
247
- it "returns a plain number" do
248
- k = Nydp::Symbol.mk "a", ns
249
- args = [ ahash, k ]
250
-
251
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
252
- expect(vm.pop_arg).to eq 123
253
- end
254
-
255
- it "converts ruby value to nydp value" do
256
- k = Nydp::Symbol.mk "b", ns
257
- args = [ ahash, k ]
258
-
259
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
260
- expect(vm.pop_arg).to eq Nydp::StringAtom.new("hello there")
261
- end
262
-
263
- it "converts string keys to method names" do
264
- k = Nydp::StringAtom.new "b"
265
- args = [ ahash, k ]
266
-
267
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
268
- expect(vm.pop_arg).to eq Nydp::StringAtom.new("hello there")
269
- end
270
-
271
- it "returns nil for unavailable methods" do
272
- k = Nydp::Symbol.mk "c", ns
273
- args = [ ahash, k ]
274
-
275
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
276
- expect(vm.pop_arg).to eq Nydp.NIL
277
- end
278
- end
279
- end
280
-
281
- describe "non-hash" do
282
- let(:ahash) { Nydp::StringAtom.new "this here ain't no hash, hombre" }
283
-
284
- describe "hash set" do
285
- it "does nothing, returns its value" do
286
- k = Nydp::Symbol.mk "keysym", ns
287
- v = Nydp::StringAtom.new "foobar"
288
- args = pair_list [ahash, k, v]
289
-
290
- begin
291
- Nydp::Builtin::HashSet.new.invoke vm, args
292
- rescue Exception => e
293
- error = e
294
- end
295
-
296
- expect(error.message.gsub(/at \/.*:in `builtin_invoke'/, '<error info>')).to eq "Called builtin/hash-set
297
- with args (\"this here ain't no hash, hombre\" keysym \"foobar\")
298
- raised
299
- hash-set: Not a hash: Nydp::StringAtom
300
- <error info>"
301
- end
302
- end
303
-
304
- describe "hash get" do
305
- it "converts ruby value to nydp value" do
306
- k = Nydp::Symbol.mk "keysym", ns
307
- args = [ ahash, k ]
308
-
309
- begin
310
- Nydp::Builtin::HashGet.new(ns).invoke vm, pair_list(args)
311
- rescue Exception => e
312
- error = e
313
- end
314
-
315
- expect(error.message.gsub(/at \/.*:in `ruby_call'/, '<error info>')).to eq "Called builtin/hash-get
316
- with args (\"this here ain't no hash, hombre\" keysym)
317
- raised
318
- hash-get: Not a hash: Nydp::StringAtom
319
- <error info>"
320
- end
321
- end
322
- end
323
159
  end
data/spec/parser_spec.rb CHANGED
@@ -146,23 +146,20 @@ describe Nydp::Parser do
146
146
 
147
147
  it "should spot numbers hiding in special syntax" do
148
148
  parsed = parse("foo.2:3:4")
149
- expect(parsed.inspect).to eq "(dot-syntax foo (colon-syntax 2 3 4))"
149
+ expect(parsed.inspect).to eq "(colon-syntax (dot-syntax foo 2) 3 4)"
150
150
 
151
- numbers = parsed.cdr.cdr.car.cdr
152
- two = numbers.car
153
- three = numbers.cdr.car
154
- four = numbers.cdr.cdr.car
155
-
156
- expect([two, three, four].map &:class).to eq [Fixnum, Fixnum, Fixnum]
151
+ expect(parsed.map &:class).to eq [Nydp::Symbol, Nydp::Pair, Fixnum, Fixnum]
152
+ expect(parsed.cdr.car.map &:class).to eq [Nydp::Symbol, Nydp::Symbol, Fixnum]
157
153
  end
158
154
 
159
155
  it "should handle prefix and postfix syntax also" do
160
156
  parsed = parse(".foo123:")
161
- expect(parsed.inspect).to eq "(dot-syntax || (colon-syntax foo123 ||))"
157
+ expect(parsed.inspect).to eq "(colon-syntax (dot-syntax || foo123) ||)"
162
158
  end
163
159
 
164
160
  it "should parse a dotted symbol" do
165
- expect(parse "(list a b foo.bar c)").to eq pair_list([sym(:list), a, b, pair_list([dotsyn, foo, bar]), c])
161
+ expected = parse "(list a b (dot-syntax foo bar) c)"
162
+ expect(parse "(list a b foo.bar c)").to eq expected
166
163
  end
167
164
 
168
165
  it "should parse a colon-colon symbol" do
@@ -170,7 +167,8 @@ describe Nydp::Parser do
170
167
  end
171
168
 
172
169
  it "should parse a colon-symbol within a colon-colon within a dotted symbol" do
173
- expect(parse "aa.foo:foo::bar:bar.zz").to eq pair_list([dotsyn, aa, pair_list([cocosyn, pair_list([colosyn, foo, foo]), pair_list([colosyn, bar, bar])]), zz])
170
+ expected = parse "(colon-colon-syntax (colon-syntax (dot-syntax aa foo) foo) (colon-syntax bar (dot-syntax bar zz)))"
171
+ expect(parse "aa.foo:foo::bar:bar.zz").to eq expected
174
172
  end
175
173
 
176
174
  it "should quote symbols" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nydp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conan Dalton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-23 00:00:00.000000000 Z
11
+ date: 2016-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,6 +99,7 @@ files:
99
99
  - lib/lisp/core-090-hook.nydp
100
100
  - lib/lisp/core-100-utils.nydp
101
101
  - lib/lisp/tests/add-hook-examples.nydp
102
+ - lib/lisp/tests/auto-hash-examples.nydp
102
103
  - lib/lisp/tests/best-examples.nydp
103
104
  - lib/lisp/tests/boot-tests.nydp
104
105
  - lib/lisp/tests/builtin-tests.nydp
@@ -117,6 +118,7 @@ files:
117
118
  - lib/lisp/tests/error-tests.nydp
118
119
  - lib/lisp/tests/explain-mac-examples.nydp
119
120
  - lib/lisp/tests/foundation-test.nydp
121
+ - lib/lisp/tests/group-by-examples.nydp
120
122
  - lib/lisp/tests/hash-examples.nydp
121
123
  - lib/lisp/tests/include-examples.nydp
122
124
  - lib/lisp/tests/invocation-tests.nydp
@@ -129,6 +131,7 @@ files:
129
131
  - lib/lisp/tests/pretty-print-tests.nydp
130
132
  - lib/lisp/tests/quasiquote-examples.nydp
131
133
  - lib/lisp/tests/range-examples.nydp
134
+ - lib/lisp/tests/relative-months-examples.nydp
132
135
  - lib/lisp/tests/returning-examples.nydp
133
136
  - lib/lisp/tests/rfnwith-tests.nydp
134
137
  - lib/lisp/tests/sort-examples.nydp
@@ -159,6 +162,7 @@ files:
159
162
  - lib/nydp/builtin/load_tests.rb
160
163
  - lib/nydp/builtin/millisecs.rb
161
164
  - lib/nydp/builtin/minus.rb
165
+ - lib/nydp/builtin/modulo.rb
162
166
  - lib/nydp/builtin/parse.rb
163
167
  - lib/nydp/builtin/parse_in_string.rb
164
168
  - lib/nydp/builtin/plus.rb
@@ -209,6 +213,8 @@ files:
209
213
  - spec/date_spec.rb
210
214
  - spec/embedded_spec.rb
211
215
  - spec/error_spec.rb
216
+ - spec/foreign_hash_spec.rb
217
+ - spec/hash_non_hash_behaviour_spec.rb
212
218
  - spec/hash_spec.rb
213
219
  - spec/literal_spec.rb
214
220
  - spec/nydp_spec.rb
@@ -247,6 +253,8 @@ test_files:
247
253
  - spec/date_spec.rb
248
254
  - spec/embedded_spec.rb
249
255
  - spec/error_spec.rb
256
+ - spec/foreign_hash_spec.rb
257
+ - spec/hash_non_hash_behaviour_spec.rb
250
258
  - spec/hash_spec.rb
251
259
  - spec/literal_spec.rb
252
260
  - spec/nydp_spec.rb