nydp 0.1.15 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lisp/core-015-documentation.nydp +11 -4
- data/lib/lisp/core-040-utils.nydp +3 -0
- data/lib/lisp/tests/builtin-tests.nydp +1 -1
- data/lib/lisp/tests/foundation-test.nydp +40 -0
- data/lib/lisp/tests/time-examples.nydp +21 -0
- data/lib/nydp.rb +10 -8
- data/lib/nydp/builtin.rb +3 -2
- data/lib/nydp/builtin/apply.rb +2 -2
- data/lib/nydp/builtin/car.rb +1 -1
- data/lib/nydp/builtin/cdr.rb +1 -1
- data/lib/nydp/builtin/cdr_set.rb +1 -1
- data/lib/nydp/builtin/comment.rb +2 -2
- data/lib/nydp/builtin/cons.rb +1 -1
- data/lib/nydp/builtin/date.rb +20 -0
- data/lib/nydp/builtin/divide.rb +2 -2
- data/lib/nydp/builtin/ensuring.rb +3 -3
- data/lib/nydp/builtin/error.rb +1 -1
- data/lib/nydp/builtin/eval.rb +2 -6
- data/lib/nydp/builtin/greater_than.rb +3 -3
- data/lib/nydp/builtin/handle_error.rb +2 -2
- data/lib/nydp/builtin/hash.rb +14 -20
- data/lib/nydp/builtin/inspect.rb +1 -1
- data/lib/nydp/builtin/is_equal.rb +10 -5
- data/lib/nydp/builtin/less_than.rb +3 -3
- data/lib/nydp/builtin/load_tests.rb +3 -7
- data/lib/nydp/builtin/millisecs.rb +1 -1
- data/lib/nydp/builtin/minus.rb +2 -2
- data/lib/nydp/builtin/modulo.rb +1 -1
- data/lib/nydp/builtin/parse.rb +3 -6
- data/lib/nydp/builtin/parse_in_string.rb +3 -6
- data/lib/nydp/builtin/plus.rb +3 -3
- data/lib/nydp/builtin/pre_compile.rb +2 -2
- data/lib/nydp/builtin/puts.rb +2 -2
- data/lib/nydp/builtin/random_string.rb +4 -4
- data/lib/nydp/builtin/sort.rb +1 -1
- data/lib/nydp/builtin/sqrt.rb +1 -1
- data/lib/nydp/builtin/string_match.rb +7 -10
- data/lib/nydp/builtin/string_replace.rb +1 -1
- data/lib/nydp/builtin/string_split.rb +1 -1
- data/lib/nydp/builtin/sym.rb +2 -6
- data/lib/nydp/builtin/thread_locals.rb +1 -1
- data/lib/nydp/builtin/time.rb +52 -0
- data/lib/nydp/builtin/times.rb +2 -2
- data/lib/nydp/builtin/to_string.rb +2 -2
- data/lib/nydp/builtin/type_of.rb +3 -7
- data/lib/nydp/builtin/vm_info.rb +1 -1
- data/lib/nydp/compiler.rb +2 -2
- data/lib/nydp/cond.rb +1 -1
- data/lib/nydp/core.rb +48 -48
- data/lib/nydp/function_invocation.rb +1 -1
- data/lib/nydp/helper.rb +5 -5
- data/lib/nydp/interpreted_function.rb +3 -3
- data/lib/nydp/lexical_context.rb +4 -4
- data/lib/nydp/lexical_context_builder.rb +2 -2
- data/lib/nydp/pair.rb +11 -11
- data/lib/nydp/runner.rb +2 -2
- data/lib/nydp/symbol.rb +2 -2
- data/lib/nydp/symbol_lookup.rb +1 -1
- data/lib/nydp/truth.rb +8 -11
- data/lib/nydp/version.rb +1 -1
- data/lib/nydp/vm.rb +4 -3
- data/spec/date_spec.rb +28 -20
- data/spec/error_spec.rb +1 -1
- data/spec/foreign_hash_spec.rb +12 -12
- data/spec/hash_non_hash_behaviour_spec.rb +8 -8
- data/spec/hash_spec.rb +14 -14
- data/spec/literal_spec.rb +2 -2
- data/spec/nydp_spec.rb +6 -6
- data/spec/pair_spec.rb +8 -8
- data/spec/parser_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/string_atom_spec.rb +9 -9
- data/spec/string_token_spec.rb +1 -1
- data/spec/symbol_spec.rb +9 -9
- data/spec/thread_local_spec.rb +2 -6
- data/spec/time_spec.rb +48 -0
- metadata +7 -3
- data/lib/nydp/builtin/today.rb +0 -18
data/lib/nydp/helper.rb
CHANGED
@@ -3,9 +3,9 @@ module Nydp
|
|
3
3
|
::Symbol => ->(obj, ns) { Nydp::Symbol.mk(obj, ns) },
|
4
4
|
Array => ->(obj, ns) { Nydp::Pair.from_list obj.map { |o| Nydp.r2n o, ns } },
|
5
5
|
String => ->(obj, ns) { Nydp::StringAtom.new obj.to_s },
|
6
|
-
NilClass => ->(obj, ns) { Nydp
|
7
|
-
FalseClass => ->(obj, ns) { Nydp
|
8
|
-
TrueClass => ->(obj, ns) { Nydp
|
6
|
+
NilClass => ->(obj, ns) { Nydp::NIL },
|
7
|
+
FalseClass => ->(obj, ns) { Nydp::NIL },
|
8
|
+
TrueClass => ->(obj, ns) { Nydp::T },
|
9
9
|
::Date => ->(obj, ns) { Nydp::Date.new obj },
|
10
10
|
}
|
11
11
|
|
@@ -38,7 +38,7 @@ module Nydp
|
|
38
38
|
expr.is_a?(Nydp::Pair)
|
39
39
|
end
|
40
40
|
|
41
|
-
def cons a, b=Nydp
|
41
|
+
def cons a, b=Nydp::NIL
|
42
42
|
Nydp::Pair.new a, b
|
43
43
|
end
|
44
44
|
|
@@ -52,7 +52,7 @@ module Nydp
|
|
52
52
|
|
53
53
|
def literal? expr
|
54
54
|
case expr
|
55
|
-
when String, Float, Integer, Fixnum, Nydp
|
55
|
+
when String, Float, Integer, Fixnum, Nydp::Symbol, Nydp::StringAtom, Nydp::Truth, Nydp::Nil
|
56
56
|
true
|
57
57
|
else
|
58
58
|
false
|
@@ -52,7 +52,7 @@ module Nydp
|
|
52
52
|
if pair? names
|
53
53
|
context.set names.car, values.car
|
54
54
|
setup_context context, names.cdr, values.cdr
|
55
|
-
elsif Nydp
|
55
|
+
elsif Nydp::NIL.isnt? names
|
56
56
|
context.set names, values
|
57
57
|
end
|
58
58
|
end
|
@@ -72,7 +72,7 @@ module Nydp
|
|
72
72
|
instructions << Nydp::Compiler.compile(body_forms.car, bindings)
|
73
73
|
|
74
74
|
rest = body_forms.cdr
|
75
|
-
if Nydp
|
75
|
+
if Nydp::NIL.is? rest
|
76
76
|
return Pair.from_list(instructions)
|
77
77
|
else
|
78
78
|
instructions << PopArg
|
@@ -84,7 +84,7 @@ module Nydp
|
|
84
84
|
if pair? arg_list
|
85
85
|
index_parameters arg_list.car, hsh
|
86
86
|
index_parameters arg_list.cdr, hsh
|
87
|
-
elsif Nydp
|
87
|
+
elsif Nydp::NIL.isnt? arg_list
|
88
88
|
hsh[arg_list] = hsh.size
|
89
89
|
end
|
90
90
|
end
|
data/lib/nydp/lexical_context.rb
CHANGED
@@ -20,7 +20,7 @@ class Nydp::LexicalContext
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def at_index index
|
23
|
-
values[index] || Nydp
|
23
|
+
values[index] || Nydp::NIL
|
24
24
|
end
|
25
25
|
|
26
26
|
def set name, value
|
@@ -31,7 +31,7 @@ class Nydp::LexicalContext
|
|
31
31
|
def set_args_1 names, arg
|
32
32
|
if pair? names
|
33
33
|
set names.car, arg
|
34
|
-
elsif Nydp
|
34
|
+
elsif Nydp::NIL.isnt? names
|
35
35
|
set names, cons(arg)
|
36
36
|
end
|
37
37
|
end
|
@@ -40,7 +40,7 @@ class Nydp::LexicalContext
|
|
40
40
|
if pair? names
|
41
41
|
set names.car, arg_0
|
42
42
|
set_args_1 names.cdr, arg_1
|
43
|
-
elsif Nydp
|
43
|
+
elsif Nydp::NIL.isnt? names
|
44
44
|
set names, cons(arg_0, cons(arg_1))
|
45
45
|
end
|
46
46
|
end
|
@@ -49,7 +49,7 @@ class Nydp::LexicalContext
|
|
49
49
|
if pair? names
|
50
50
|
set names.car, arg_0
|
51
51
|
set_args_2 names.cdr, arg_1, arg_2
|
52
|
-
elsif Nydp
|
52
|
+
elsif Nydp::NIL.isnt? names
|
53
53
|
set names, cons(arg_0, cons(arg_1, cons(arg_2)))
|
54
54
|
end
|
55
55
|
end
|
@@ -167,7 +167,7 @@ module Nydp::LexicalContextBuilder
|
|
167
167
|
_set_args lc, @param_names, args
|
168
168
|
end
|
169
169
|
def _set_args lc, names, args
|
170
|
-
unless Nydp
|
170
|
+
unless Nydp::NIL.is? names
|
171
171
|
lc.set names.car, args.car
|
172
172
|
_set_args lc, names.cdr, args.cdr
|
173
173
|
end
|
@@ -185,7 +185,7 @@ module Nydp::LexicalContextBuilder
|
|
185
185
|
if pair? names
|
186
186
|
lc.set names.car, args.car
|
187
187
|
_set_args lc, names.cdr, args.cdr
|
188
|
-
elsif Nydp
|
188
|
+
elsif Nydp::NIL.isnt? names
|
189
189
|
lc.set names, args
|
190
190
|
end
|
191
191
|
end
|
data/lib/nydp/pair.rb
CHANGED
@@ -27,7 +27,7 @@ class Nydp::Pair
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.from_list list, last=Nydp
|
30
|
+
def self.from_list list, last=Nydp::NIL, n=0
|
31
31
|
if n >= list.size
|
32
32
|
last
|
33
33
|
else
|
@@ -52,12 +52,12 @@ class Nydp::Pair
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def proper?
|
55
|
-
Nydp
|
55
|
+
Nydp::NIL.is?(cdr) || (cdr.is_a?(Nydp::Pair) && cdr.proper?)
|
56
56
|
end
|
57
57
|
|
58
58
|
def each &block
|
59
59
|
yield car
|
60
|
-
cdr.each(&block) unless Nydp
|
60
|
+
cdr.each(&block) unless Nydp::NIL.is?(cdr)
|
61
61
|
end
|
62
62
|
|
63
63
|
def inspect
|
@@ -66,31 +66,31 @@ class Nydp::Pair
|
|
66
66
|
|
67
67
|
def to_s
|
68
68
|
if car.is_a?(Nydp::Symbol) && car.is?(:quote)
|
69
|
-
if Nydp
|
69
|
+
if Nydp::NIL.is? cdr.cdr
|
70
70
|
"'#{cdr.car.to_s}"
|
71
71
|
else
|
72
72
|
"'#{cdr.to_s}"
|
73
73
|
end
|
74
74
|
elsif car.is_a?(Nydp::Symbol) && car.is?(:"brace-list")
|
75
|
-
if Nydp
|
75
|
+
if Nydp::NIL.is? cdr
|
76
76
|
"{}"
|
77
77
|
else
|
78
78
|
"{ #{cdr.to_s_rest} }"
|
79
79
|
end
|
80
80
|
elsif car.is_a?(Nydp::Symbol) && car.is?(:quasiquote)
|
81
|
-
if Nydp
|
81
|
+
if Nydp::NIL.is? cdr.cdr
|
82
82
|
"`#{cdr.car.to_s}"
|
83
83
|
else
|
84
84
|
"`#{cdr.to_s}"
|
85
85
|
end
|
86
86
|
elsif car.is_a?(Nydp::Symbol) && car.is?(:unquote)
|
87
|
-
if Nydp
|
87
|
+
if Nydp::NIL.is? cdr.cdr
|
88
88
|
",#{cdr.car.to_s}"
|
89
89
|
else
|
90
90
|
",#{cdr.to_s}"
|
91
91
|
end
|
92
92
|
elsif car.is_a?(Nydp::Symbol) && car.is?(:"unquote-splicing")
|
93
|
-
if Nydp
|
93
|
+
if Nydp::NIL.is? cdr.cdr
|
94
94
|
",@#{cdr.car.to_s}"
|
95
95
|
else
|
96
96
|
",@#{cdr.to_s}"
|
@@ -103,7 +103,7 @@ class Nydp::Pair
|
|
103
103
|
def to_s_rest
|
104
104
|
cdr_s = if cdr.is_a?(self.class)
|
105
105
|
cdr.to_s_rest
|
106
|
-
elsif Nydp
|
106
|
+
elsif Nydp::NIL.is? cdr
|
107
107
|
nil
|
108
108
|
else
|
109
109
|
". #{cdr.to_s}"
|
@@ -115,7 +115,7 @@ class Nydp::Pair
|
|
115
115
|
def inspect_rest
|
116
116
|
cdr_s = if cdr.is_a?(self.class)
|
117
117
|
cdr.inspect_rest
|
118
|
-
elsif cdr == Nydp
|
118
|
+
elsif cdr == Nydp::NIL
|
119
119
|
nil
|
120
120
|
else
|
121
121
|
". #{cdr.inspect}"
|
@@ -125,7 +125,7 @@ class Nydp::Pair
|
|
125
125
|
end
|
126
126
|
|
127
127
|
def append thing
|
128
|
-
if Nydp
|
128
|
+
if Nydp::NIL.is? self.cdr
|
129
129
|
self.cdr = thing
|
130
130
|
elsif pair? self.cdr
|
131
131
|
self.cdr.append thing
|
data/lib/nydp/runner.rb
CHANGED
@@ -48,7 +48,7 @@ module Nydp
|
|
48
48
|
|
49
49
|
def compile_and_eval expr
|
50
50
|
begin
|
51
|
-
vm.thread Pair.new(Compiler.compile(expr, Nydp
|
51
|
+
vm.thread Pair.new(Compiler.compile(expr, Nydp::NIL), Nydp::NIL)
|
52
52
|
rescue Exception => e
|
53
53
|
new_msg = "failed to eval #{expr.inspect}\nerror was #{Nydp.indent_text e.message}"
|
54
54
|
raise e.class, new_msg, e.backtrace
|
@@ -92,7 +92,7 @@ module Nydp
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def run
|
95
|
-
res = Nydp
|
95
|
+
res = Nydp::NIL
|
96
96
|
while !@tokens.finished
|
97
97
|
expr = @parser.expression(@tokens)
|
98
98
|
unless expr.nil?
|
data/lib/nydp/symbol.rb
CHANGED
data/lib/nydp/symbol_lookup.rb
CHANGED
data/lib/nydp/truth.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
1
3
|
module Nydp
|
2
4
|
class Truth
|
3
|
-
|
5
|
+
include Singleton
|
6
|
+
def init_with *; Nydp::T ; end
|
4
7
|
def to_s ; 't' ; end
|
5
8
|
def inspect ; 't[nydp::Truth]' ; end
|
6
9
|
def assign *_ ; self ; end
|
@@ -9,7 +12,8 @@ module Nydp
|
|
9
12
|
end
|
10
13
|
|
11
14
|
class Nil
|
12
|
-
|
15
|
+
include Singleton
|
16
|
+
def init_with * ; Nydp::NIL ; end
|
13
17
|
def car ; self ; end
|
14
18
|
def cdr ; self ; end
|
15
19
|
def size ; 0 ; end
|
@@ -25,13 +29,6 @@ module Nydp
|
|
25
29
|
def execute vm ; vm.push_arg self ; end
|
26
30
|
end
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
class Nil
|
32
|
-
def self.new ; raise "no" ; end
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.NIL; @@nil; end
|
36
|
-
def self.T; @@t; end
|
32
|
+
NIL = Nil.instance
|
33
|
+
T = Truth.instance
|
37
34
|
end
|
data/lib/nydp/version.rb
CHANGED
data/lib/nydp/vm.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module Nydp
|
2
2
|
class VM
|
3
3
|
include Helper
|
4
|
-
attr_accessor :instructions, :args, :contexts, :current_context, :locals, :unhandled_error
|
4
|
+
attr_accessor :instructions, :args, :contexts, :current_context, :locals, :unhandled_error, :ns
|
5
5
|
|
6
6
|
module Finally ; end
|
7
7
|
module HandleError ; end
|
8
8
|
|
9
|
-
def initialize
|
9
|
+
def initialize ns
|
10
10
|
@instructions = []
|
11
11
|
@args = []
|
12
12
|
@contexts = []
|
13
13
|
@locals = Nydp::Hash.new
|
14
|
+
@ns = ns
|
14
15
|
end
|
15
16
|
|
16
17
|
def thread expr=nil
|
@@ -67,7 +68,7 @@ module Nydp
|
|
67
68
|
def args! ; args.empty? ? (raise "illegal operation: no args") : args ; end
|
68
69
|
def peek_arg ; args!.last ; end
|
69
70
|
|
70
|
-
def pop_args count, tail=Nydp
|
71
|
+
def pop_args count, tail=Nydp::NIL
|
71
72
|
case count
|
72
73
|
when 0
|
73
74
|
tail
|
data/spec/date_spec.rb
CHANGED
@@ -2,8 +2,8 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Nydp::Date do
|
4
4
|
|
5
|
-
let(:ns) { { }
|
6
|
-
let(:vm) { Nydp::VM.new }
|
5
|
+
let(:ns) { { } }
|
6
|
+
let(:vm) { Nydp::VM.new(ns) }
|
7
7
|
|
8
8
|
it "converts ruby Date to Nydp::Date" do
|
9
9
|
rd = Date.parse "2015-06-08"
|
@@ -16,13 +16,21 @@ describe Nydp::Date do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it "creates a new date" do
|
19
|
-
df = Nydp::Builtin::Date.
|
20
|
-
df.
|
19
|
+
df = Nydp::Builtin::Date.instance
|
20
|
+
df.invoke_4 vm, 2015, 11, 18
|
21
21
|
nd = vm.args.pop
|
22
22
|
expect(nd).to be_a Nydp::Date
|
23
23
|
expect(nd.ruby_date).to eq Date.parse("2015-11-18")
|
24
24
|
end
|
25
25
|
|
26
|
+
it "returns today" do
|
27
|
+
df = Nydp::Builtin::Date.instance
|
28
|
+
df.invoke_1 vm
|
29
|
+
nd = vm.args.pop
|
30
|
+
expect(nd).to be_a Nydp::Date
|
31
|
+
expect(nd.ruby_date).to eq Date.today
|
32
|
+
end
|
33
|
+
|
26
34
|
it "returns date components" do
|
27
35
|
rd = Date.parse "2015-06-08"
|
28
36
|
nd = Nydp.r2n rd, ns
|
@@ -37,7 +45,7 @@ describe Nydp::Date do
|
|
37
45
|
let(:d1) { Nydp.r2n (Date.today + 6), ns }
|
38
46
|
|
39
47
|
it "works with builtin minus" do
|
40
|
-
minus = Nydp::Builtin::Minus.
|
48
|
+
minus = Nydp::Builtin::Minus.instance
|
41
49
|
|
42
50
|
minus.invoke vm, pair_list([d1, d0])
|
43
51
|
diff = vm.args.pop
|
@@ -48,58 +56,58 @@ describe Nydp::Date do
|
|
48
56
|
|
49
57
|
describe "'>" do
|
50
58
|
it "works with builtin greater-than when true" do
|
51
|
-
f = Nydp::Builtin::GreaterThan.
|
59
|
+
f = Nydp::Builtin::GreaterThan.instance
|
52
60
|
|
53
61
|
f.invoke vm, pair_list([d1, d0])
|
54
62
|
|
55
|
-
expect(vm.args.pop).to eq Nydp
|
63
|
+
expect(vm.args.pop).to eq Nydp::T
|
56
64
|
end
|
57
65
|
|
58
66
|
it "compares with nil" do
|
59
|
-
f = Nydp::Builtin::GreaterThan.
|
67
|
+
f = Nydp::Builtin::GreaterThan.instance
|
60
68
|
|
61
|
-
f.invoke vm, pair_list([d1, Nydp
|
69
|
+
f.invoke vm, pair_list([d1, Nydp::NIL])
|
62
70
|
|
63
|
-
expect(vm.args.pop).to eq Nydp
|
71
|
+
expect(vm.args.pop).to eq Nydp::NIL
|
64
72
|
end
|
65
73
|
|
66
74
|
it "works with builtin greater-than when false" do
|
67
|
-
f = Nydp::Builtin::GreaterThan.
|
75
|
+
f = Nydp::Builtin::GreaterThan.instance
|
68
76
|
|
69
77
|
f.invoke vm, pair_list([d0, d1])
|
70
78
|
|
71
|
-
expect(vm.args.pop).to eq Nydp
|
79
|
+
expect(vm.args.pop).to eq Nydp::NIL
|
72
80
|
end
|
73
81
|
end
|
74
82
|
|
75
83
|
describe "'<" do
|
76
84
|
it "works with builtin less-than when true" do
|
77
|
-
f = Nydp::Builtin::LessThan.
|
85
|
+
f = Nydp::Builtin::LessThan.instance
|
78
86
|
|
79
87
|
f.invoke vm, pair_list([d0, d1])
|
80
88
|
|
81
|
-
expect(vm.args.pop).to eq Nydp
|
89
|
+
expect(vm.args.pop).to eq Nydp::T
|
82
90
|
end
|
83
91
|
|
84
92
|
it "works with builtin less-than when false" do
|
85
|
-
f = Nydp::Builtin::LessThan.
|
93
|
+
f = Nydp::Builtin::LessThan.instance
|
86
94
|
|
87
95
|
f.invoke vm, pair_list([d1, d0])
|
88
96
|
|
89
|
-
expect(vm.args.pop).to eq Nydp
|
97
|
+
expect(vm.args.pop).to eq Nydp::NIL
|
90
98
|
end
|
91
99
|
|
92
100
|
it "compares with nil" do
|
93
|
-
f = Nydp::Builtin::LessThan.
|
101
|
+
f = Nydp::Builtin::LessThan.instance
|
94
102
|
|
95
|
-
f.invoke vm, pair_list([d1, Nydp
|
103
|
+
f.invoke vm, pair_list([d1, Nydp::NIL])
|
96
104
|
|
97
|
-
expect(vm.args.pop).to eq Nydp
|
105
|
+
expect(vm.args.pop).to eq Nydp::NIL
|
98
106
|
end
|
99
107
|
end
|
100
108
|
|
101
109
|
it "works with builtin plus" do
|
102
|
-
plus = Nydp::Builtin::Plus.
|
110
|
+
plus = Nydp::Builtin::Plus.instance
|
103
111
|
|
104
112
|
plus.invoke vm, pair_list([d0, 5])
|
105
113
|
sum = vm.args.pop
|