nydp 0.5.1 → 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 +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
data/spec/symbol_spec.rb CHANGED
@@ -1,108 +1,83 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Nydp::Symbol do
4
- let(:bar) { Nydp::Symbol.mk :BAR, ns }
5
- let(:foo) { Nydp::Symbol.mk :FOO, ns }
6
- let(:vm) { Nydp::VM.new(ns) }
4
+ let(:bar) { :BAR }
5
+ let(:foo) { :FOO }
7
6
 
8
7
  describe "#inspect" do
9
8
  it "wraps itself in pipe chars if empty" do
10
- sym = Nydp::Symbol.mk "", ns
11
- expect(sym.inspect).to eq "||"
9
+ sym = :""
10
+ expect(sym._nydp_inspect).to eq "||"
12
11
  end
13
12
  it "wraps itself in pipe chars if nil" do
14
- sym = Nydp::Symbol.mk nil, ns
15
- expect(sym.inspect).to eq "||"
13
+ sym = nil.to_s.to_sym
14
+ expect(sym._nydp_inspect).to eq "||"
16
15
  end
17
16
  it "wraps itself in pipe chars if it has spaces" do
18
- sym = Nydp::Symbol.mk "hello world", ns
19
- expect(sym.inspect).to eq "|hello world|"
17
+ sym = :"hello world"
18
+ expect(sym._nydp_inspect).to eq "|hello world|"
20
19
  end
21
20
  it "wraps itself in pipe chars if it has pipe chars" do
22
- sym = Nydp::Symbol.mk "hello|world", ns
23
- expect(sym.inspect).to eq '|hello\|world|'
21
+ sym = :"hello|world"
22
+ expect(sym._nydp_inspect).to eq '|hello\|world|'
24
23
  end
25
24
  it "wraps itself in pipe chars if it contains quote chars" do
26
- sym = Nydp::Symbol.mk "hello 'world'", ns
27
- expect(sym.inspect).to eq "|hello 'world'|"
25
+ sym = :"hello 'world'"
26
+ expect(sym._nydp_inspect).to eq "|hello 'world'|"
28
27
  end
29
28
  it "wraps itself in pipe chars if it contains doublequote chars" do
30
- sym = Nydp::Symbol.mk 'hello "world"', ns
31
- expect(sym.inspect).to eq '|hello "world"|'
29
+ sym = :'hello "world"'
30
+ expect(sym._nydp_inspect).to eq '|hello "world"|'
32
31
  end
33
32
  it "wraps itself in pipe chars if it has other punctuation" do
34
- sym = Nydp::Symbol.mk 'hello,(world)', ns
35
- expect(sym.inspect).to eq '|hello,(world)|'
33
+ sym = :'hello,(world)'
34
+ expect(sym._nydp_inspect).to eq '|hello,(world)|'
36
35
  end
37
36
  end
38
37
 
39
- it "returns a ruby symbol in #to_ruby" do
40
- sym = Nydp::Symbol.mk :foo, ns
41
- expect(sym.to_ruby).to eq :foo
42
- end
43
-
44
- it "should not recognise an unknown symbol" do
45
- sym = Nydp::Symbol.find :foo, ns
46
- expect(sym).to eq nil
47
- end
48
-
49
- it "should create a new symbol" do
50
- sym = Nydp::Symbol.mk :foo, ns
51
- expect(sym.name).to eq :foo
52
- end
53
-
54
- it "should not create a new symbol when the symbol already exists" do
55
- sym1 = Nydp::Symbol.mk :baz, ns
56
- sym2 = Nydp::Symbol.mk :baz, ns
57
-
58
- expect(sym1).to eq sym2
59
- expect(sym1).to equal sym2
60
- end
61
-
62
38
  it "should consider symbols == when they share the same name" do
63
39
  ns1 = { }
64
40
  ns2 = { }
65
41
 
66
- sym1 = Nydp::Symbol.mk :baz, ns1
67
- sym2 = Nydp::Symbol.mk :baz, ns2
42
+ sym1 = :baz
43
+ sym2 = :baz
68
44
 
69
45
  expect(sym1.hash).to eq sym2.hash
70
46
 
71
47
  expect(sym1 == sym2).to eq true
72
48
  expect(sym1.eql? sym2).to eq true
73
- expect(sym1.equal? sym2).to eq false
49
+ expect(sym1.equal? sym2).to eq true
74
50
  end
75
51
 
76
52
  it "works with builtin greater-than when true" do
77
53
  f = Nydp::Builtin::GreaterThan.instance
78
54
 
79
- f.invoke vm, pair_list([foo, bar])
55
+ a = f.call foo, bar
80
56
 
81
- expect(vm.args.pop).to eq bar
57
+ expect(a).to eq bar
82
58
  end
83
59
 
84
60
  it "works with builtin greater-than when false" do
85
61
  f = Nydp::Builtin::GreaterThan.instance
86
62
 
87
- f.invoke vm, pair_list([bar, foo])
63
+ a = f.call bar, foo
88
64
 
89
- expect(vm.args.pop).to eq Nydp::NIL
65
+ expect(a).to eq Nydp::NIL
90
66
  end
91
67
 
92
68
  it "works with builtin less-than when true" do
93
69
  f = Nydp::Builtin::LessThan.instance
94
70
 
95
- f.invoke vm, pair_list([bar, foo])
71
+ a = f.call bar, foo
96
72
 
97
- expect(vm.args.pop).to eq foo
73
+ expect(a).to eq foo
98
74
  end
99
75
 
100
76
  it "works with builtin less-than when false" do
101
77
  f = Nydp::Builtin::LessThan.instance
102
78
 
103
- f.invoke vm, pair_list([foo, bar])
79
+ a = f.call foo, bar
104
80
 
105
- expect(vm.args.pop).to eq Nydp::NIL
81
+ expect(a).to eq Nydp::NIL
106
82
  end
107
-
108
83
  end
@@ -1,21 +1,36 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Nydp do
4
- def run vm, txt
5
- Nydp::Runner.new(vm, ns, Nydp::StringReader.new(txt)).run
4
+ def run txt
5
+ Nydp::Runner.new(ns, Nydp::StringReader.new("test", txt)).run
6
6
  end
7
7
 
8
8
  it "should isolate threadlocal values" do
9
+
10
+ # note : this test is mostly on principle, it can't guarantee
11
+ # correctness insofar as it doesn't guarantee that the threads
12
+ # run in a way such that they would interfere with each other
13
+ # if thread_locals were not used...
14
+
9
15
  Nydp.setup ns
10
16
 
11
- vm0 = Nydp::VM.new ns
12
- vm1 = Nydp::VM.new ns
13
17
 
14
- run vm0, "(hash-set (thread-locals) 'testing (+ 1 2 3))"
15
- run vm1, "(hash-set (thread-locals) 'testing (+ 6 7 8))"
18
+ t0 = Thread.new {
19
+ run "(hash-set (thread-locals) 'testing (+ 1 2 3))"
20
+ sleep 0.1
21
+ run "(hash-get (thread-locals) 'testing)"
22
+ }
23
+
24
+ t1 = Thread.new {
25
+ run "(hash-set (thread-locals) 'testing (+ 6 7 8))"
26
+ run "(hash-get (thread-locals) 'testing)"
27
+ }
28
+
29
+ t0.join
30
+ t1.join
16
31
 
17
- val0 = run vm0, "(hash-get (thread-locals) 'testing)"
18
- val1 = run vm1, "(hash-get (thread-locals) 'testing)"
32
+ val0 = t0.value
33
+ val1 = t1.value
19
34
 
20
35
  expect(val0).to eq 6
21
36
  expect(val1).to eq 21
data/spec/time_spec.rb CHANGED
@@ -2,8 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Nydp::Date do
4
4
 
5
- let(:ns) { { } }
6
- let(:vm) { Nydp::VM.new(ns) }
7
5
  let(:timef) { Nydp::Builtin::Time.instance }
8
6
 
9
7
  it "r2n does not convert ruby Time" do
@@ -15,16 +13,14 @@ describe Nydp::Date do
15
13
  end
16
14
 
17
15
  it "creates a new Time instance" do
18
- timef.invoke vm, Nydp::Pair.from_list([2015, 11, 18, 18, 30, 17])
19
- nd = vm.args.pop
16
+ nd = timef.call 2015, 11, 18, 18, 30, 17
20
17
  expect(nd).to be_a Time
21
18
  expect(nd).to eq Time.new(2015, 11, 18, 18, 30, 17)
22
19
  end
23
20
 
24
21
  it "creates a new Time instance for #now" do
25
22
  t0 = Time.now
26
- timef.invoke_1 vm
27
- nd = vm.args.pop
23
+ nd = timef.call
28
24
  t1 = Time.now
29
25
  expect(nd).to be_a Time
30
26
  expect(nd).to be_between(t0, t1)
@@ -32,16 +28,14 @@ describe Nydp::Date do
32
28
 
33
29
  it "creates a new Time instance for #now plus offset" do
34
30
  t0 = Time.now
35
- timef.invoke_2 vm, 3.14
36
- nd = vm.args.pop
31
+ nd = timef.call 3.14
37
32
  t1 = Time.now
38
33
  expect(nd).to be_a Time
39
34
  expect(nd).to be_between((t0 + 3.14), (t1 + 3.14))
40
35
  end
41
36
 
42
37
  it "creates a new Time instance for a given Date" do
43
- timef.invoke_2 vm, Nydp::Date.new(Date.parse "2006-06-21")
44
- nd = vm.args.pop
38
+ nd = timef.call Date.parse "2006-06-21"
45
39
  expect(nd).to be_a Time
46
40
  expect(nd).to eq Time.new(2006, 6, 21)
47
41
  end
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe "tokenising" do
4
4
  it "should return another stream of tokens" do
5
5
  tt = []
6
- reader = Nydp::StringReader.new "(a b c 1 2 3)"
6
+ reader = Nydp::StringReader.new "test", "(a b c 1 2 3)"
7
7
  t = Nydp::Tokeniser.new reader
8
8
  tt = []
9
9
  tok = t.next_token
@@ -22,7 +22,7 @@ describe "tokenising" do
22
22
  end
23
23
 
24
24
  it "should return a stream of tokens, including whitespace before right-paren" do
25
- reader = Nydp::StringReader.new "foo )"
25
+ reader = Nydp::StringReader.new "test", "foo )"
26
26
  t = Nydp::Tokeniser.new reader
27
27
  tt = []
28
28
  tok = t.next_token
@@ -35,33 +35,33 @@ describe "tokenising" do
35
35
  end
36
36
 
37
37
  it "returns nothing at all" do
38
- s = Nydp::StringReader.new ""
38
+ s = Nydp::StringReader.new "test", ""
39
39
  tkz = Nydp::Tokeniser.new s
40
40
  expect(tkz.next_token).to be_nil
41
41
  end
42
42
 
43
43
  it "returns a whitespace token" do
44
- s = Nydp::StringReader.new " "
44
+ s = Nydp::StringReader.new "test", " "
45
45
  tkz = Nydp::Tokeniser.new s
46
46
  expect(tkz.next_token).to be_nil
47
47
  end
48
48
 
49
49
  it "returns a symbol token" do
50
- s = Nydp::StringReader.new "hello"
50
+ s = Nydp::StringReader.new "test", "hello"
51
51
  tkz = Nydp::Tokeniser.new s
52
52
  expect(tkz.next_token).to eq [:symbol, "hello"]
53
53
  expect(tkz.next_token).to be_nil
54
54
  end
55
55
 
56
56
  it "returns symbol then whitespace" do
57
- s = Nydp::StringReader.new "hello "
57
+ s = Nydp::StringReader.new "test", "hello "
58
58
  tkz = Nydp::Tokeniser.new s
59
59
  expect(tkz.next_token).to eq [:symbol, "hello"]
60
60
  expect(tkz.next_token).to be_nil
61
61
  end
62
62
 
63
63
  it "returns whitespace symbol whitespace symbol whitespace" do
64
- s = Nydp::StringReader.new " hello world "
64
+ s = Nydp::StringReader.new "test", " hello world "
65
65
  tkz = Nydp::Tokeniser.new s
66
66
  expect(tkz.next_token).to eq [:symbol, "hello"]
67
67
  expect(tkz.next_token).to eq [:symbol, "world"]
@@ -69,7 +69,7 @@ describe "tokenising" do
69
69
  end
70
70
 
71
71
  it "returns whitespace left_paren symbol whitespace symbol right_paren whitespace" do
72
- s = Nydp::StringReader.new " (hello world) "
72
+ s = Nydp::StringReader.new "test", " (hello world) "
73
73
  tkz = Nydp::Tokeniser.new s
74
74
  expect(tkz.next_token).to eq [:left_paren, ""]
75
75
  expect(tkz.next_token).to eq [:symbol, "hello"]
@@ -79,7 +79,7 @@ describe "tokenising" do
79
79
  end
80
80
 
81
81
  it "returns whitespace left_paren with prefix symbol whitespace symbol right_paren whitespace" do
82
- s = Nydp::StringReader.new " %w(hello world) "
82
+ s = Nydp::StringReader.new "test", " %w(hello world) "
83
83
  tkz = Nydp::Tokeniser.new s
84
84
  expect(tkz.next_token).to eq [:left_paren, "%w"]
85
85
  expect(tkz.next_token).to eq [:symbol, "hello"]
@@ -89,7 +89,7 @@ describe "tokenising" do
89
89
  end
90
90
 
91
91
  it "returns a comment" do
92
- s = Nydp::StringReader.new "hello
92
+ s = Nydp::StringReader.new "test", "hello
93
93
  ; observe!
94
94
  world"
95
95
  tkz = Nydp::Tokeniser.new s
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nydp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conan Dalton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-02 00:00:00.000000000 Z
11
+ date: 2024-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: irb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rake
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '12'
33
+ version: '13'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '12'
40
+ version: '13'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -82,6 +96,7 @@ files:
82
96
  - lib/lisp/core-120-settings.nydp
83
97
  - lib/lisp/core-130-validations.nydp
84
98
  - lib/lisp/core-900-benchmarking.nydp
99
+ - lib/lisp/tests/000-empty-args-examples.nydp
85
100
  - lib/lisp/tests/accum-examples.nydp
86
101
  - lib/lisp/tests/add-hook-examples.nydp
87
102
  - lib/lisp/tests/aif-examples.nydp
@@ -147,6 +162,7 @@ files:
147
162
  - lib/lisp/tests/relative-months-examples.nydp
148
163
  - lib/lisp/tests/returning-examples.nydp
149
164
  - lib/lisp/tests/rfnwith-tests.nydp
165
+ - lib/lisp/tests/rotate-2d-array-examples.nydp
150
166
  - lib/lisp/tests/seqf-examples.nydp
151
167
  - lib/lisp/tests/set-difference-examples.nydp
152
168
  - lib/lisp/tests/set-intersection-examples.nydp
@@ -181,12 +197,12 @@ files:
181
197
  - lib/nydp/builtin/inspect.rb
182
198
  - lib/nydp/builtin/is_equal.rb
183
199
  - lib/nydp/builtin/less_than.rb
200
+ - lib/nydp/builtin/log.rb
184
201
  - lib/nydp/builtin/math_ceiling.rb
185
202
  - lib/nydp/builtin/math_floor.rb
186
203
  - lib/nydp/builtin/math_power.rb
187
204
  - lib/nydp/builtin/math_round.rb
188
205
  - lib/nydp/builtin/minus.rb
189
- - lib/nydp/builtin/modulo.rb
190
206
  - lib/nydp/builtin/parse.rb
191
207
  - lib/nydp/builtin/parse_in_string.rb
192
208
  - lib/nydp/builtin/plus.rb
@@ -195,16 +211,13 @@ files:
195
211
  - lib/nydp/builtin/quit.rb
196
212
  - lib/nydp/builtin/rand.rb
197
213
  - lib/nydp/builtin/random_string.rb
198
- - lib/nydp/builtin/regexp.rb
214
+ - lib/nydp/builtin/rng.rb
199
215
  - lib/nydp/builtin/ruby_wrap.rb
200
216
  - lib/nydp/builtin/script_run.rb
201
217
  - lib/nydp/builtin/set_intersection.rb
202
218
  - lib/nydp/builtin/set_union.rb
203
219
  - lib/nydp/builtin/sort.rb
204
- - lib/nydp/builtin/sqrt.rb
205
220
  - lib/nydp/builtin/string_match.rb
206
- - lib/nydp/builtin/string_pad_left.rb
207
- - lib/nydp/builtin/string_pad_right.rb
208
221
  - lib/nydp/builtin/string_replace.rb
209
222
  - lib/nydp/builtin/string_split.rb
210
223
  - lib/nydp/builtin/sym.rb
@@ -224,13 +237,13 @@ files:
224
237
  - lib/nydp/date.rb
225
238
  - lib/nydp/error.rb
226
239
  - lib/nydp/function_invocation.rb
227
- - lib/nydp/hash.rb
228
240
  - lib/nydp/helper.rb
229
- - lib/nydp/image_store.rb
230
241
  - lib/nydp/interpreted_function.rb
231
242
  - lib/nydp/lexical_context.rb
232
243
  - lib/nydp/lexical_context_builder.rb
233
244
  - lib/nydp/literal.rb
245
+ - lib/nydp/loop.rb
246
+ - lib/nydp/namespace.rb
234
247
  - lib/nydp/pair.rb
235
248
  - lib/nydp/parser.rb
236
249
  - lib/nydp/plugin.rb
@@ -243,7 +256,6 @@ files:
243
256
  - lib/nydp/tokeniser.rb
244
257
  - lib/nydp/truth.rb
245
258
  - lib/nydp/version.rb
246
- - lib/nydp/vm.rb
247
259
  - lib/tasks/tests.rake
248
260
  - nydp.gemspec
249
261
  - spec/date_spec.rb
@@ -283,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
283
295
  - !ruby/object:Gem::Version
284
296
  version: '0'
285
297
  requirements: []
286
- rubygems_version: 3.0.3
298
+ rubygems_version: 3.0.3.1
287
299
  signing_key:
288
300
  specification_version: 4
289
301
  summary: A civilised yet somewhat dangerous kind of Lisp for a new generation
@@ -1,11 +0,0 @@
1
- class Nydp::Builtin::Modulo
2
- include Nydp::Builtin::Base, Singleton
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
@@ -1,7 +0,0 @@
1
- class Nydp::Builtin::Regexp
2
- include Nydp::Builtin::Base, Singleton
3
-
4
- def builtin_invoke vm, args
5
- vm.push_arg Regexp.compile(args.car.to_s)
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- class Nydp::Builtin::Sqrt
2
- include Nydp::Builtin::Base, Singleton
3
-
4
- def builtin_invoke vm, args
5
- vm.push_arg Math.sqrt args.car
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- class Nydp::Builtin::StringPadLeft
2
- include Nydp::Builtin::Base, Singleton
3
-
4
- def builtin_invoke_4 vm, str, len, padding
5
- vm.push_arg str.to_s.rjust(len, padding.to_s)
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- class Nydp::Builtin::StringPadRight
2
- include Nydp::Builtin::Base, Singleton
3
-
4
- def builtin_invoke_4 vm, str, len, padding
5
- vm.push_arg str.to_s.ljust(len, padding.to_s)
6
- end
7
- end
data/lib/nydp/hash.rb DELETED
@@ -1,9 +0,0 @@
1
- class Nydp::Hash < ::Hash
2
- include Nydp::Helper
3
-
4
- def nydp_type ; :hash ; end
5
- def to_ruby ; each_with_object({}) {|(k,v),h| h[n2r k] = n2r v} ; end
6
- def _nydp_get a ; self[a] ; end
7
- def _nydp_set a, v ; self[a] = v ; end
8
- def _nydp_keys ; keys ; end
9
- end
@@ -1,21 +0,0 @@
1
- require 'digest'
2
-
3
- module Nydp
4
- class ImageStore
5
- attr_accessor :store
6
-
7
- def initialize store=nil
8
- @store = store
9
- FileUtils.mkdir_p(store, mode: 0775) if store
10
- end
11
-
12
- def digest ; Digest::MD5.hexdigest(Nydp.all_files.map { |f| File.read f }.join) ; end
13
- def file_name id ; File.join @store, "#{id}.nydp_image" ; end
14
- def load? fname ; File.binread(fname) if File.exists?(fname) ; end
15
- def load id ; load?(file_name id) if @store ; end
16
- def store id, image ; File.open(file_name(id), "wb") { |f| f.write(image) } if @store ; end
17
- def generate id ; Marshal.dump(::Nydp.build_nydp).tap { |im| store id, im } ; end
18
- def resurrect id ; load(id) || generate(id) ; end
19
- def get ; Marshal.load(@image ||= resurrect(digest)) ; end
20
- end
21
- end
data/lib/nydp/vm.rb DELETED
@@ -1,129 +0,0 @@
1
- module Nydp
2
- class VM
3
- NIL = Nydp::NIL
4
- include Helper
5
- attr_accessor :instructions, :args, :contexts, :current_context, :locals, :unhandled_error, :last_error, :ns, :thisi
6
-
7
- module Finally ; end
8
- module HandleError ; end
9
-
10
- def initialize ns
11
- @instructions = []
12
- @args = []
13
- @contexts = []
14
- @locals = Nydp::Hash.new
15
- @ns = ns
16
- end
17
-
18
- def push_instructions ii, ctx
19
- if @current_instructions && NIL != @current_instructions
20
- @instructions.push @current_instructions
21
- @contexts.push @current_context
22
- end
23
-
24
- @current_instructions = ii
25
- @current_context = ctx
26
- end
27
-
28
- def push_ctx_instructions ii
29
- if @current_instructions && NIL != @current_instructions
30
- @instructions.push @current_instructions
31
- @contexts.push @current_context
32
- end
33
-
34
- @current_instructions = ii
35
- end
36
-
37
- def thread_with_expr expr
38
- @current_instructions = expr
39
- thread
40
- end
41
-
42
- def thread
43
- while @current_instructions
44
- begin
45
- if NIL == @current_instructions
46
- @current_instructions = @instructions.pop
47
- @current_context = @contexts.pop
48
- else
49
- now = @current_instructions.car
50
- @current_instructions = @current_instructions.cdr
51
- now.execute(self)
52
- end
53
-
54
- rescue StandardError => e
55
- handle_error e
56
- end
57
- end
58
-
59
- if @unhandled_error
60
- e = @unhandled_error
61
- @unhandled_error = nil
62
- raise e
63
- end
64
-
65
- args.pop
66
- end
67
-
68
- def handle_error ex
69
- @unhandled_error = ex
70
-
71
- protecti = []
72
- protectc = []
73
-
74
- while (@instructions.length > 0) && !(@instructions.last.car.is_a? HandleError)
75
- if @instructions.last.car.is_a? Finally
76
- protecti << @instructions.last
77
- protectc << @contexts.last
78
- end
79
-
80
- @instructions.pop
81
- @contexts.pop
82
- end
83
-
84
- while protecti.length > 0
85
- push_instructions protecti.pop, protectc.pop
86
- end
87
- end
88
-
89
- def push_arg a ; args.push a ; end
90
- def args! ; args.empty? ? (raise "illegal operation: no args") : args ; end
91
- def peek_arg ; args!.last ; end
92
-
93
- def pop_args count, tail=Nydp::NIL
94
- case count
95
- when 0
96
- tail
97
- else
98
- pop_args(count - 1, cons(args.pop, tail))
99
- end
100
- end
101
-
102
- def vm_info
103
- msg = ""
104
- msg << "\n"
105
- msg << "\ninstruction stack"
106
- msg << "\n================="
107
- instructions.each_with_index do |ii, ix|
108
- msg << "\ninstructions##{ix} : #{ii} #{ii.source if ii.respond_to?(:source)}"
109
- end
110
- msg << "\n"
111
- msg << "\n"
112
- msg << "\ncontext stack"
113
- msg << "\n================="
114
- contexts.each_with_index do |ctx, ix|
115
- msg << "\ncontext##{ix} :\n#{ctx}"
116
- end
117
- msg << "\n"
118
- msg << "\n"
119
- msg << "\nargs stack"
120
- msg << "\n================="
121
- args.each_with_index do |args, ix|
122
- msg << "\args##{ix} :\n#{args}"
123
- end
124
- msg << "\n"
125
- msg << "\n"
126
- msg
127
- end
128
- end
129
- end