nydp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +58 -0
  7. data/Rakefile +1 -0
  8. data/bin/nydp +5 -0
  9. data/bin/nydp-tests +5 -0
  10. data/lib/lisp/boot.nydp +219 -0
  11. data/lib/lisp/test-runner.nydp +39 -0
  12. data/lib/lisp/tests/foundation-test.nydp +28 -0
  13. data/lib/nydp.rb +143 -0
  14. data/lib/nydp/assignment.rb +40 -0
  15. data/lib/nydp/builtin.rb +8 -0
  16. data/lib/nydp/builtin/apply.rb +16 -0
  17. data/lib/nydp/builtin/car.rb +5 -0
  18. data/lib/nydp/builtin/cdr.rb +5 -0
  19. data/lib/nydp/builtin/cdr_set.rb +8 -0
  20. data/lib/nydp/builtin/comment.rb +5 -0
  21. data/lib/nydp/builtin/cons.rb +16 -0
  22. data/lib/nydp/builtin/divide.rb +13 -0
  23. data/lib/nydp/builtin/error.rb +6 -0
  24. data/lib/nydp/builtin/eval.rb +14 -0
  25. data/lib/nydp/builtin/greater_than.rb +10 -0
  26. data/lib/nydp/builtin/hash.rb +30 -0
  27. data/lib/nydp/builtin/inspect.rb +5 -0
  28. data/lib/nydp/builtin/is_equal.rb +5 -0
  29. data/lib/nydp/builtin/less_than.rb +10 -0
  30. data/lib/nydp/builtin/millisecs.rb +7 -0
  31. data/lib/nydp/builtin/minus.rb +13 -0
  32. data/lib/nydp/builtin/plus.rb +28 -0
  33. data/lib/nydp/builtin/pre_compile.rb +5 -0
  34. data/lib/nydp/builtin/puts.rb +7 -0
  35. data/lib/nydp/builtin/quit.rb +5 -0
  36. data/lib/nydp/builtin/random_string.rb +11 -0
  37. data/lib/nydp/builtin/times.rb +13 -0
  38. data/lib/nydp/builtin/to_string.rb +12 -0
  39. data/lib/nydp/builtin/to_sym.rb +21 -0
  40. data/lib/nydp/builtin/vm_info.rb +13 -0
  41. data/lib/nydp/closure.rb +17 -0
  42. data/lib/nydp/compiler.rb +49 -0
  43. data/lib/nydp/cond.rb +56 -0
  44. data/lib/nydp/context_symbol.rb +22 -0
  45. data/lib/nydp/error.rb +4 -0
  46. data/lib/nydp/function_invocation.rb +52 -0
  47. data/lib/nydp/helper.rb +32 -0
  48. data/lib/nydp/interpreted_function.rb +79 -0
  49. data/lib/nydp/lexical_context.rb +38 -0
  50. data/lib/nydp/literal.rb +40 -0
  51. data/lib/nydp/pair.rb +112 -0
  52. data/lib/nydp/parser.rb +123 -0
  53. data/lib/nydp/string_atom.rb +24 -0
  54. data/lib/nydp/string_token.rb +21 -0
  55. data/lib/nydp/symbol.rb +47 -0
  56. data/lib/nydp/symbol_lookup.rb +43 -0
  57. data/lib/nydp/tokeniser.rb +80 -0
  58. data/lib/nydp/truth.rb +37 -0
  59. data/lib/nydp/version.rb +3 -0
  60. data/lib/nydp/vm.rb +76 -0
  61. data/nydp.gemspec +27 -0
  62. data/spec/boot_spec.rb +119 -0
  63. data/spec/embedded_spec.rb +106 -0
  64. data/spec/nypd_spec.rb +127 -0
  65. data/spec/pair_spec.rb +102 -0
  66. data/spec/parser_spec.rb +191 -0
  67. data/spec/spec_helper.rb +10 -0
  68. data/spec/symbol_spec.rb +32 -0
  69. metadata +176 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 070df0ab7e597dbbcb8e80aca7f4c6dbc444d0e9
4
+ data.tar.gz: a772c25f02d36b78842698bd798704dda414490c
5
+ SHA512:
6
+ metadata.gz: 50400bf553e7bf65c4514f7922c0ab57f2a31ea7971f2626b45e55747bdc1994172dbae3a111350ce3a33d9933653845b19654099309991f164dae1e81f611a9
7
+ data.tar.gz: cf5d1475f6c57fd4dde96969ca0b469e3a1a3b9f8a338d1af237931b88d4e1eaab9ad49da6cc69872dbda56afe90f40f9468ba829b6290b10d42c7a1160a6684
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .#*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in nydp.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 conanite
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,58 @@
1
+ # Nydp
2
+
3
+ NYDP is "Not Your Daddy's Parentheses", a reference to [Xkcd 297](http://xkcd.com/297/) (itself a reference
4
+ to Star Wars), as well as to the meme [Not Your Daddy's Q](http://tvtropes.org/pmwiki/pmwiki.php/Main/NotYourDaddysX), where Q is a modern,
5
+ improved Q unlike the Q your daddy used. "NYDP" also shamelessly piggypacks on the
6
+ catchiness and popularity of the [NYPD](https://en.wikipedia.org/wiki/NYPD_Blue) abbreviation ("New York Police Department",
7
+ for those who have no interest in popular US TV or authoritarian politics).
8
+
9
+ Macro-expansion is not built-in to the interpreter; however, the compiler will invoke 'pre-compile before compiling, passing
10
+ the expression to compile as an argument. You can override 'pre-compile to transform the expression in any way you wish. By default,
11
+ nydp provides an implementation of 'pre-compile that performs macro-expansion.
12
+
13
+ ```
14
+ (def pre-compile (expr)
15
+ (map pre-compile
16
+ (if (mac-names (car expr))
17
+ (pre-compile (mac-expand (car expr) (cdr expr)))
18
+ expr)))
19
+ ```
20
+
21
+ ; blah blah
22
+
23
+ ```
24
+ ==> (comment "blah blah")
25
+
26
+ ==> (mac comment (txt) nil)
27
+ ```
28
+
29
+ We do not wish to suggest by "Not Your Daddy's Parentheses" that Common Lisp,
30
+ Scheme, Racket, Arc, Clojure or your favourite other lisp are somehow
31
+ old-fashioned, inferior, or in need of improvement in any way.
32
+
33
+
34
+ ## Installation
35
+
36
+ Add this line to your application's Gemfile:
37
+
38
+ gem 'nydp'
39
+
40
+ And then execute:
41
+
42
+ $ bundle
43
+
44
+ Or install it yourself as:
45
+
46
+ $ gem install nydp
47
+
48
+ ## Usage
49
+
50
+ TODO: Write usage instructions here
51
+
52
+ ## Contributing
53
+
54
+ 1. Fork it
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nydp'
4
+
5
+ Nydp.repl
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nydp'
4
+
5
+ Nydp.tests
@@ -0,0 +1,219 @@
1
+ ; -*- lisp -*-
2
+
3
+ (assign last-cons (fn (xs)
4
+ (cond (pair? (cdr xs))
5
+ (last-cons (cdr xs))
6
+ xs)))
7
+
8
+ (assign append-list! (fn (list-1 list-2)
9
+ (cdr-set (last-cons list-1) list-2)
10
+ list-1))
11
+
12
+ (assign list (fn args args))
13
+
14
+ (assign caar (fn (arg) (car (car arg))))
15
+ (assign cadr (fn (arg) (car (cdr arg))))
16
+ (assign cddr (fn (arg) (cdr (cdr arg))))
17
+ (assign no (fn (arg) (eq? arg nil)))
18
+ (assign just (fn (arg) arg))
19
+
20
+ (assign mac-expand (fn (macfn name body)
21
+ (cond macfn
22
+ (pre-compile-do (apply macfn body))
23
+ (cons name body))))
24
+
25
+ (assign macs (hash))
26
+
27
+ (assign debug-pre-compile
28
+ (fn (arg)
29
+ (assign *debug-pre-compile* arg)))
30
+
31
+ (assign pre-compile-expr
32
+ (fn (name body)
33
+ (mac-expand (hash-get macs name) name body)))
34
+
35
+ (assign pre-compile-each
36
+ (fn (args)
37
+ (cond args
38
+ (cond (pair? args)
39
+ (cons (pre-compile-do (car args))
40
+ (pre-compile-each (cdr args)))
41
+ args))))
42
+
43
+ (assign pre-compile-msg
44
+ (fn args
45
+ (cond *debug-pre-compile* (apply p args) (car args))))
46
+
47
+ (assign pre-compile-do
48
+ (fn (arg)
49
+ (cond (pair? arg)
50
+ (cond (eq? (car arg) 'quote)
51
+ arg
52
+ (pre-compile-each (pre-compile-expr (car arg) (cdr arg))))
53
+ arg)))
54
+
55
+ (assign pre-compile
56
+ (fn (arg)
57
+ (pre-compile-msg "pre-compile" arg)
58
+ (pre-compile-msg (pre-compile-do arg))))
59
+
60
+ (hash-set macs 'def
61
+ (fn (name args . body)
62
+ (list 'assign
63
+ name
64
+ (+ (list 'fn args)
65
+ body))))
66
+
67
+ (def qq-unquote-recurse (arg rest)
68
+ (list 'cons
69
+ (qq-quasiquote arg)
70
+ (qq-quasiquote rest)))
71
+
72
+ (def qq-unquote? (arg rest)
73
+ (cond (pair? arg)
74
+ (cond (eq? (car arg) 'unquote)
75
+ (list 'cons (cadr arg) (qq-quasiquote rest))
76
+ (cond (eq? (car arg) 'unquote-splicing)
77
+ (cond (no rest)
78
+ (cadr arg)
79
+ (list '+
80
+ (cadr arg)
81
+ (qq-quasiquote rest)))
82
+ (qq-unquote-recurse arg rest)))
83
+ (list 'cons
84
+ (list 'quote arg)
85
+ (qq-quasiquote rest))))
86
+
87
+ (def qq-quasiquote (xs)
88
+ (cond (no xs)
89
+ nil
90
+ (cond (pair? xs)
91
+ (cond (eq? (car xs) 'unquote)
92
+ (cadr xs)
93
+ (qq-unquote? (car xs) (cdr xs)))
94
+ (list 'quote xs))))
95
+
96
+ (hash-set macs 'quasiquote (fn (arg)
97
+ (qq-quasiquote arg)))
98
+
99
+ (hash-set macs 'mac (fn (name args . body)
100
+ `(hash-set macs ',name (fn ,args ,@body))))
101
+
102
+ (mac if args
103
+ (cond (no args) nil
104
+ (cond (cdr args)
105
+ (cond (cddr args)
106
+ `(cond ,(car args) ,(cadr args) (if ,@(cddr args)))
107
+ `(cond ,(car args) ,(cadr args)))
108
+ (car args))))
109
+
110
+ (mac and args
111
+ (if args
112
+ (if (cdr args)
113
+ `(if ,(car args) (and ,@(cdr args)))
114
+ (car args))
115
+ 't))
116
+
117
+ (mac do args
118
+ `((fn nil ,@args)))
119
+
120
+ (mac when (condition . body)
121
+ `(cond ,condition (do ,@body)))
122
+
123
+ (def map (f things)
124
+ (if (no things)
125
+ nil
126
+ (pair? things)
127
+ (cons (f (car things)) (map f (cdr things)))
128
+ (map f (list things))))
129
+
130
+ (def pairs (things)
131
+ (if (no things) nil
132
+ (no (cdr things)) (list (list (car things)))
133
+ (cons (list (car things) (cadr things))
134
+ (pairs (cddr things)))))
135
+
136
+ (mac with (parms . body)
137
+ `((fn ,(map car (pairs parms))
138
+ ,@body)
139
+ ,@(map cadr (pairs parms))))
140
+
141
+ (mac let (var val . body)
142
+ `(with (,var ,val) ,@body))
143
+
144
+ ;; (debug-pre-compile t)
145
+ ;; (let a b c d e)
146
+ ;; (debug-pre-compile nil)
147
+
148
+ (def each (f acc things)
149
+ (if things
150
+ (each f (f acc (car things)) (cdr things))
151
+ acc))
152
+
153
+ (def eachr (f things)
154
+ (when things
155
+ (eachr f (cdr things))
156
+ (f (car things))))
157
+
158
+ (def zip (a b)
159
+ (if a
160
+ (cons (list (car a) (car b))
161
+ (zip (cdr a) (cdr b)))))
162
+
163
+ (mac push (x things)
164
+ `(assign ,things (cons ,x ,things)))
165
+
166
+ (def flatten (things)
167
+ (let acc nil
168
+ (let flattenize nil
169
+ (assign flattenize (fn (x)
170
+ (if (pair? x)
171
+ (eachr flattenize x)
172
+ (push x acc))))
173
+ (flattenize things))
174
+ acc))
175
+
176
+ (def joinstr (txt things)
177
+ (apply +
178
+ (to-string (car things))
179
+ (flatten (zip (map (fn (_) txt) (cdr things))
180
+ (map to-string (cdr things))))))
181
+
182
+ (let uniq-counter 0
183
+ (def uniq (prefix)
184
+ (sym (joinstr "-"
185
+ (list prefix
186
+ (assign uniq-counter
187
+ (+ uniq-counter 1))))))
188
+ (def reset-uniq-counter ()
189
+ (assign uniq-counter 0)))
190
+
191
+ (mac w/uniq (vars . body)
192
+ (if (pair? vars)
193
+ `(with ,(apply + (map (fn (n) (list n '(uniq ',n))) vars))
194
+ ,@body)
195
+ `(let ,vars (uniq ',vars) ,@body)))
196
+
197
+ (mac or args
198
+ (cond args
199
+ (w/uniq ora
200
+ `(let ,ora ,(car args)
201
+ (cond ,ora ,ora (or ,@(cdr args)))))))
202
+
203
+ (mac pop (xs)
204
+ (w/uniq gp
205
+ `(let ,gp (car ,xs)
206
+ (assign ,xs (cdr ,xs))
207
+ ,gp)))
208
+
209
+ (def nth (n things)
210
+ (if (eq? n 0)
211
+ (car things)
212
+ (nth (- n 1) (cdr things))))
213
+
214
+ (def iso (x y)
215
+ (or (eq? x y)
216
+ (and (pair? x)
217
+ (pair? y)
218
+ (iso (car x) (car y))
219
+ (iso (cdr x) (cdr y)))))
@@ -0,0 +1,39 @@
1
+ (assign show-failed-only t)
2
+ (assign all-tests nil)
3
+
4
+ (def register-test (test)
5
+ "register a test to be run later by 'run-all-tests"
6
+ (push test all-tests))
7
+
8
+ (def run-all-tests ()
9
+ "runs all tests that have been registered with 'register-test"
10
+ (with (passed 0 failed 0)
11
+ (with (f-pass (fn nil (assign passed (+ 1 passed)))
12
+ f-fail (fn nil (assign failed (+ 1 failed))))
13
+ (run-tests `(suite "all tests" ,@all-tests) f-pass f-fail)
14
+ (p "passed: " passed)
15
+ (p "failed: " failed)
16
+ (/ passed (+ passed failed)))))
17
+
18
+ (def run-tests (tests passf failf)
19
+ (execute-test "" tests passf failf)
20
+ results)
21
+
22
+ (def execute-test (desc test passf failf)
23
+ (if (eq? 'suite (car test))
24
+ (execute-tests (+ desc " - " (cadr test)) (cddr test) passf failf)
25
+ (execute-single-test desc test passf failf)))
26
+
27
+ (def execute-single-test (desc test passf failf)
28
+ (with (expected (nth 2 test) result (eval (nth 1 test)))
29
+ (if (iso result expected)
30
+ (passf)
31
+ (do (p desc " - " (car test) " - FAILED:
32
+ expected " (inspect expected) ",
33
+ got " (inspect result) "
34
+ ")
35
+ (failf)))))
36
+
37
+ (def execute-tests (desc tests passf failf)
38
+ (execute-test desc (car tests) passf failf)
39
+ (if (cdr tests) (execute-tests desc (cdr tests) passf failf)))
@@ -0,0 +1,28 @@
1
+ (register-test '(suite "Foundation Tests"
2
+ (suite "Lists"
3
+ (suite "cons"
4
+ ("cons creates a list"
5
+ (cons 'a '(b c))
6
+ (a b c))
7
+
8
+ ("cons conses two strings"
9
+ (cons "a" "b")
10
+ ("a" . "b")))
11
+
12
+ (suite "car"
13
+ ("car of nil is nil"
14
+ (car nil)
15
+ nil)
16
+
17
+ ("car of empty list is nil"
18
+ (car '())
19
+ nil)
20
+
21
+ ("car - no need to quote empty list"
22
+ (car ())
23
+ nil)
24
+
25
+ ("car returns car of argument"
26
+ (car '(foo 12.34 "bar"))
27
+ foo)
28
+ ))))
@@ -0,0 +1,143 @@
1
+ module Nydp
2
+ def self.compile_and_eval vm, expr
3
+ vm.thread Pair.new(Compiler.compile(expr, Nydp.NIL), Nydp.NIL)
4
+ end
5
+
6
+ def self.setup ns
7
+ Symbol.mk(:cons, ns).assign(Nydp::Builtin::Cons.new)
8
+ Symbol.mk(:car, ns).assign(Nydp::Builtin::Car.new)
9
+ Symbol.mk(:cdr, ns).assign(Nydp::Builtin::Cdr.new)
10
+ Symbol.mk(:+, ns).assign(Nydp::Builtin::Plus.new)
11
+ Symbol.mk(:-, ns).assign(Nydp::Builtin::Minus.new)
12
+ Symbol.mk(:*, ns).assign(Nydp::Builtin::Times.new)
13
+ Symbol.mk(:/, ns).assign(Nydp::Builtin::Divide.new)
14
+ Symbol.mk(:>, ns).assign(Nydp::Builtin::GreaterThan.new)
15
+ Symbol.mk(:<, ns).assign(Nydp::Builtin::LessThan.new)
16
+ Symbol.mk(:eval, ns).assign(Nydp::Builtin::Eval.new(ns))
17
+ Symbol.mk(:hash, ns).assign(Nydp::Builtin::Hash.new)
18
+ Symbol.mk(:apply, ns).assign(Nydp::Builtin::Apply.new)
19
+ Symbol.mk(:error, ns).assign(Nydp::Builtin::Error.new)
20
+ Symbol.mk(:quit, ns).assign(Nydp::Builtin::Quit.new)
21
+ Symbol.mk(:p, ns).assign(Nydp::Builtin::Puts.new)
22
+ Symbol.mk(:PI, ns).assign Literal.new(3.1415)
23
+ Symbol.mk(:nil, ns).assign Nydp.NIL
24
+ Symbol.mk(:t, ns).assign Nydp.T
25
+ Symbol.mk(:sym, ns).assign Nydp::Builtin::ToSym.new(ns)
26
+ Symbol.mk(:inspect, ns).assign(Nydp::Builtin::Inspect.new)
27
+ Symbol.mk(:comment, ns).assign(Nydp::Builtin::Comment.new)
28
+ Symbol.mk(:millisecs, ns).assign(Nydp::Builtin::Millisecs.new)
29
+ Symbol.mk("random-string",ns).assign(Nydp::Builtin::RandomString.new)
30
+ Symbol.mk("to-string", ns).assign(Nydp::Builtin::ToString.new)
31
+ Symbol.mk(:"eq?", ns).assign(Nydp::Builtin::IsEqual.new)
32
+ Symbol.mk(:"pair?", ns).assign(Nydp::Builtin::IsPair.new)
33
+ Symbol.mk(:"cdr-set", ns).assign(Nydp::Builtin::CdrSet.new)
34
+ Symbol.mk(:"hash-get", ns).assign(Nydp::Builtin::HashGet.new)
35
+ Symbol.mk(:"hash-set", ns).assign(Nydp::Builtin::HashSet.new)
36
+ Symbol.mk(:"hash-keys", ns).assign(Nydp::Builtin::HashKeys.new)
37
+ Symbol.mk(:"vm-info", ns).assign Nydp::Builtin::VmInfo.new
38
+ Symbol.mk(:"pre-compile", ns).assign Nydp::Builtin::PreCompile.new
39
+ end
40
+
41
+ class Runner
42
+ attr_accessor :vm, :ns
43
+
44
+ def initialize vm, ns
45
+ @vm = vm
46
+ @ns = ns
47
+ @precompile = Symbol.mk(:"pre-compile", ns)
48
+ @quote = Symbol.mk(:quote, ns)
49
+ end
50
+
51
+ def quote expr
52
+ Pair.from_list [@quote, expr]
53
+ end
54
+
55
+ def precompile expr
56
+ Pair.from_list [@precompile, quote(expr)]
57
+ end
58
+
59
+ def pre_compile expr
60
+ Nydp.compile_and_eval(vm, precompile(expr))
61
+ end
62
+
63
+ def evaluate expr
64
+ Nydp.compile_and_eval(vm, pre_compile(expr))
65
+ end
66
+ end
67
+
68
+ class StreamRunner < Runner
69
+ attr_accessor :stream, :parser
70
+
71
+ def initialize vm, ns, stream
72
+ super vm, ns
73
+ @stream = stream
74
+ @parser = Nydp::Parser.new(ns)
75
+ @tokens = Nydp::Tokeniser.new stream
76
+ end
77
+
78
+ def prompt *_
79
+ end
80
+
81
+ def run
82
+ res = Nydp.NIL
83
+ prompt
84
+ while !@tokens.finished
85
+ expr = parser.expression(@tokens)
86
+ unless expr.nil?
87
+ res = evaluate expr
88
+ prompt res
89
+ end
90
+ end
91
+ res
92
+ end
93
+ end
94
+
95
+ class Repl < StreamRunner
96
+ def prompt val=nil
97
+ puts val if val
98
+ print "nydp > "
99
+ end
100
+ end
101
+
102
+ def self.repl
103
+ puts "welcome to nydp"
104
+ root_ns = { }
105
+ setup(root_ns)
106
+ vm = VM.new
107
+ boot_path = File.join File.expand_path(File.dirname(__FILE__)), 'lisp/boot.nydp'
108
+ StreamRunner.new(vm, root_ns, File.new(boot_path)).run
109
+ Repl.new(vm, root_ns, $stdin).run
110
+ end
111
+
112
+ def self.tests
113
+ puts "welcome to nydp : running tests"
114
+ root_ns = { }
115
+ setup(root_ns)
116
+ vm = VM.new
117
+ boot_path = File.join File.expand_path(File.dirname(__FILE__)), 'lisp/boot.nydp'
118
+ test_runner_path = File.join File.expand_path(File.dirname(__FILE__)), 'lisp/test-runner.nydp'
119
+ tests = Dir.glob(File.join File.expand_path(File.dirname(__FILE__)), 'lisp/tests/**/*.nydp')
120
+ StreamRunner.new(vm, root_ns, File.new(boot_path)).run
121
+ StreamRunner.new(vm, root_ns, File.new(test_runner_path)).run
122
+ tests.each do |tst|
123
+ StreamRunner.new(vm, root_ns, File.new(tst)).run
124
+ end
125
+ StreamRunner.new(vm, root_ns, "(run-all-tests)").run
126
+ end
127
+ end
128
+
129
+ require "nydp/error"
130
+ require "nydp/truth"
131
+ require "nydp/version"
132
+ require "nydp/helper"
133
+ require "nydp/symbol"
134
+ require "nydp/symbol_lookup"
135
+ require "nydp/pair"
136
+ require "nydp/assignment"
137
+ require "nydp/builtin"
138
+ require "nydp/string_atom"
139
+ require "nydp/string_token"
140
+ require "nydp/tokeniser"
141
+ require "nydp/parser"
142
+ require "nydp/compiler"
143
+ require "nydp/vm"