nydp 0.0.2 → 0.0.3

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: 33480122f9608ad9c13fe61c3ed534ce73765ddd
4
- data.tar.gz: 27712f0e21be0cb53af53fb37bb8dc89c72c71fd
3
+ metadata.gz: 373997c8dcd5597d8742b347ef75b0b68ef312e7
4
+ data.tar.gz: 69ab87494d38291aa35786f835489095ce1ccd71
5
5
  SHA512:
6
- metadata.gz: f4f0fb3458cf76450c64e19cddd0dc03633108aa45cc7d1f5a72fb546d446c7e0ea435e8dc913af54efaddbb707aae8ac588a0d0f2492415e0f00ca664da4fa2
7
- data.tar.gz: 9cfd74432153243de497df5e50451248dc8ae0555a2032631243b102fc1af3358ba6734530ee55fd8d467cdbb49054e1b62a5de7c13bc9fa788bdea42a8a41a2
6
+ metadata.gz: 801258418b77c34f8521e8dc5f6e6218156b690fa7d1fa3a584a8b77102df8af4021f56f19c27f33be944d88c8fff33443a888c25ccf6b3f20934b5cae17628e
7
+ data.tar.gz: 3ddf5f9e89f7159a74ef6a2f163afcbc289ca6b4330b6b1307f3be5043f97e9ec023f2ce2fc2f3aae28fb37c05bc36a6410f6ddf8610673d558034f1c37ea65b
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "nydp"
3
3
 
4
- Nydp.rake_tasks
4
+ Nydp.load_rake_tasks
@@ -174,6 +174,8 @@
174
174
  acc))
175
175
 
176
176
  (def joinstr (txt things)
177
+ (if (no (pair? things))
178
+ (error "joinstr : 'things is a %%(type-of things) expected a list : %%(inspect things)"))
177
179
  (apply +
178
180
  (to-string (car things))
179
181
  (flatten (zip (map (fn (_) txt) (cdr things))
@@ -217,3 +219,12 @@
217
219
  (pair? y)
218
220
  (iso (car x) (car y))
219
221
  (iso (cdr x) (cdr y)))))
222
+
223
+ (def isa (type obj) (eq? (type-of obj) type))
224
+ (mac just (arg) arg)
225
+ (def quotify (arg) `(quote ,arg))
226
+
227
+ (def len (xs)
228
+ (if (pair? xs)
229
+ (+ 1 (len (cdr xs)))
230
+ 0))
@@ -5,26 +5,27 @@
5
5
  "register a test to be run later by 'run-all-tests"
6
6
  (push test all-tests))
7
7
 
8
- (def run-all-tests ()
8
+ (def run-all-tests (verbose)
9
9
  "runs all tests that have been registered with 'register-test"
10
10
  (with (passed 0 failed 0)
11
11
  (with (f-pass (fn nil (assign passed (+ 1 passed)))
12
12
  f-fail (fn nil (assign failed (+ 1 failed))))
13
- (run-tests `(suite "all tests" ,@all-tests) f-pass f-fail)
13
+ (run-tests `(suite "all tests" ,@all-tests) f-pass f-fail verbose)
14
14
  (p "passed: " passed)
15
15
  (p "failed: " failed)
16
16
  (/ passed (+ passed failed)))))
17
17
 
18
- (def run-tests (tests passf failf)
19
- (execute-test "" tests passf failf)
18
+ (def run-tests (tests passf failf verbose)
19
+ (execute-test "" tests passf failf verbose)
20
20
  results)
21
21
 
22
- (def execute-test (desc test passf failf)
22
+ (def execute-test (desc test passf failf verbose)
23
23
  (if (eq? 'suite (car test))
24
- (execute-tests (+ desc " - " (cadr test)) (cddr test) passf failf)
25
- (execute-single-test desc test passf failf)))
24
+ (execute-tests (+ desc " - " (cadr test)) (cddr test) passf failf verbose)
25
+ (execute-single-test desc test passf failf verbose)))
26
26
 
27
- (def execute-single-test (desc test passf failf)
27
+ (def execute-single-test (desc test passf failf verbose)
28
+ (if verbose (p desc " - " (car test)))
28
29
  (with (expected (nth 2 test) result (eval (nth 1 test)))
29
30
  (if (iso result expected)
30
31
  (passf)
@@ -34,6 +35,6 @@
34
35
  ")
35
36
  (failf)))))
36
37
 
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)))
38
+ (def execute-tests (desc tests passf failf verbose)
39
+ (execute-test desc (car tests) passf failf verbose)
40
+ (if (cdr tests) (execute-tests desc (cdr tests) passf failf verbose)))
@@ -1,4 +1,45 @@
1
1
  (register-test '(suite "Foundation Tests"
2
+ (suite "strings"
3
+ (suite "string-split"
4
+ ("splits a string using given expression"
5
+ (string-split "a and b and c and d" " and ")
6
+ ("a" "b" "c" "d")))
7
+
8
+ (suite "string-replace"
9
+ ("replaces parts of a string with the given replacement"
10
+ (string-replace "and" "or" "a and b and c and d")
11
+ "a or b or c or d"))
12
+
13
+ (suite "type-of"
14
+ ("returns 'string"
15
+ (type-of "foobar")
16
+ string)
17
+
18
+ ("interpolates a string"
19
+ "foobar %%(+ 1 2) you know"
20
+ "foobar 3 you know")
21
+
22
+ ("returns 'string for an interpolated string"
23
+ (type-of "foobar %%(+ 1 2)")
24
+ string)))
25
+
26
+ (suite "truth and nil"
27
+ ("t is boolean true"
28
+ (if t "hello" "goodbye")
29
+ "hello")
30
+
31
+ ("nil is boolean fale"
32
+ (if nil "hello" "goodbye")
33
+ "goodbye")
34
+
35
+ ("t is Truth"
36
+ (type-of t)
37
+ truth)
38
+
39
+ ("nil is nil"
40
+ (type-of nil)
41
+ nil))
42
+
2
43
  (suite "Lists"
3
44
  (suite "cons"
4
45
  ("cons creates a list"
@@ -7,7 +48,15 @@
7
48
 
8
49
  ("cons conses two strings"
9
50
  (cons "a" "b")
10
- ("a" . "b")))
51
+ ("a" . "b"))
52
+
53
+ ("len returns length of proper list"
54
+ (len (cons "a" (cons "b" nil)))
55
+ 2)
56
+
57
+ ("type-of returns pair"
58
+ (type-of (cons "a" "b"))
59
+ pair))
11
60
 
12
61
  (suite "car"
13
62
  ("car of nil is nil"
@@ -1,137 +1,40 @@
1
1
  module Nydp
2
- LOADFILES = []
2
+ PLUGINS = []
3
3
 
4
- def self.rake_tasks
5
- load relative_path 'tasks/tests.rake'
6
- end
7
-
8
- def self.relative_path name
9
- File.join File.expand_path(File.dirname(__FILE__)), name
10
- end
11
-
12
- LOADFILES << relative_path('lisp/boot.nydp')
13
- LOADFILES << relative_path('lisp/test-runner.nydp')
14
- Dir.glob(relative_path 'lisp/tests/**/*.nydp').each { |f| LOADFILES << f }
15
-
16
- def self.compile_and_eval vm, expr
17
- vm.thread Pair.new(Compiler.compile(expr, Nydp.NIL), Nydp.NIL)
18
- end
19
-
20
- def self.setup ns
21
- Symbol.mk(:cons, ns).assign(Nydp::Builtin::Cons.new)
22
- Symbol.mk(:car, ns).assign(Nydp::Builtin::Car.new)
23
- Symbol.mk(:cdr, ns).assign(Nydp::Builtin::Cdr.new)
24
- Symbol.mk(:+, ns).assign(Nydp::Builtin::Plus.new)
25
- Symbol.mk(:-, ns).assign(Nydp::Builtin::Minus.new)
26
- Symbol.mk(:*, ns).assign(Nydp::Builtin::Times.new)
27
- Symbol.mk(:/, ns).assign(Nydp::Builtin::Divide.new)
28
- Symbol.mk(:>, ns).assign(Nydp::Builtin::GreaterThan.new)
29
- Symbol.mk(:<, ns).assign(Nydp::Builtin::LessThan.new)
30
- Symbol.mk(:eval, ns).assign(Nydp::Builtin::Eval.new(ns))
31
- Symbol.mk(:hash, ns).assign(Nydp::Builtin::Hash.new)
32
- Symbol.mk(:apply, ns).assign(Nydp::Builtin::Apply.new)
33
- Symbol.mk(:error, ns).assign(Nydp::Builtin::Error.new)
34
- Symbol.mk(:quit, ns).assign(Nydp::Builtin::Quit.new)
35
- Symbol.mk(:p, ns).assign(Nydp::Builtin::Puts.new)
36
- Symbol.mk(:PI, ns).assign Literal.new(3.1415)
37
- Symbol.mk(:nil, ns).assign Nydp.NIL
38
- Symbol.mk(:t, ns).assign Nydp.T
39
- Symbol.mk(:sym, ns).assign Nydp::Builtin::ToSym.new(ns)
40
- Symbol.mk(:inspect, ns).assign(Nydp::Builtin::Inspect.new)
41
- Symbol.mk(:comment, ns).assign(Nydp::Builtin::Comment.new)
42
- Symbol.mk(:millisecs, ns).assign(Nydp::Builtin::Millisecs.new)
43
- Symbol.mk("random-string",ns).assign(Nydp::Builtin::RandomString.new)
44
- Symbol.mk("to-string", ns).assign(Nydp::Builtin::ToString.new)
45
- Symbol.mk(:"eq?", ns).assign(Nydp::Builtin::IsEqual.new)
46
- Symbol.mk(:"pair?", ns).assign(Nydp::Builtin::IsPair.new)
47
- Symbol.mk(:"cdr-set", ns).assign(Nydp::Builtin::CdrSet.new)
48
- Symbol.mk(:"hash-get", ns).assign(Nydp::Builtin::HashGet.new)
49
- Symbol.mk(:"hash-set", ns).assign(Nydp::Builtin::HashSet.new)
50
- Symbol.mk(:"hash-keys", ns).assign(Nydp::Builtin::HashKeys.new)
51
- Symbol.mk(:"vm-info", ns).assign Nydp::Builtin::VmInfo.new
52
- Symbol.mk(:"pre-compile", ns).assign Nydp::Builtin::PreCompile.new
53
- end
54
-
55
- class Runner
56
- attr_accessor :vm, :ns
57
-
58
- def initialize vm, ns
59
- @vm = vm
60
- @ns = ns
61
- @precompile = Symbol.mk(:"pre-compile", ns)
62
- @quote = Symbol.mk(:quote, ns)
63
- end
64
-
65
- def quote expr
66
- Pair.from_list [@quote, expr]
67
- end
68
-
69
- def precompile expr
70
- Pair.from_list [@precompile, quote(expr)]
71
- end
72
-
73
- def pre_compile expr
74
- Nydp.compile_and_eval(vm, precompile(expr))
75
- end
76
-
77
- def evaluate expr
78
- Nydp.compile_and_eval(vm, pre_compile(expr))
79
- end
80
- end
81
-
82
- class StreamRunner < Runner
83
- attr_accessor :stream, :parser
84
-
85
- def initialize vm, ns, stream
86
- super vm, ns
87
- @stream = stream
88
- @parser = Nydp::Parser.new(ns)
89
- @tokens = Nydp::Tokeniser.new stream
90
- end
91
-
92
- def prompt *_
93
- end
94
-
95
- def run
96
- res = Nydp.NIL
97
- prompt
98
- while !@tokens.finished
99
- expr = parser.expression(@tokens)
100
- unless expr.nil?
101
- res = evaluate expr
102
- prompt res
103
- end
104
- end
105
- res
106
- end
107
- end
108
-
109
- class Repl < StreamRunner
110
- def prompt val=nil
111
- puts val if val
112
- print "nydp > "
113
- end
4
+ def self.plug_in plugin ; PLUGINS << plugin ; end
5
+ def self.load_rake_tasks; PLUGINS.each &:load_rake_tasks ; end
6
+ def self.setup ns; PLUGINS.each { |plg| plg.setup ns } ; end
7
+ def self.loadfiles; PLUGINS.map(&:loadfiles).flatten ; end
8
+ def self.testfiles; PLUGINS.map(&:testfiles).flatten ; end
9
+ def self.plugin_names ; PLUGINS.map(&:name) ; end
10
+ def self.loadall vm, ns, files
11
+ files.each { |f| StreamRunner.new(vm, ns, File.new(f)).run }
114
12
  end
115
13
 
116
14
  def self.repl
117
15
  puts "welcome to nydp"
118
- root_ns = { }
119
- setup(root_ns)
16
+ ns = { }
17
+ setup(ns)
120
18
  vm = VM.new
121
- LOADFILES.each { |f| StreamRunner.new(vm, root_ns, File.new(f)).run }
122
- Repl.new(vm, root_ns, $stdin).run
19
+ loadall vm, ns, loadfiles
20
+ Repl.new(vm, ns, $stdin).run
123
21
  end
124
22
 
125
- def self.tests
23
+ def self.tests *options
24
+ verbose = options.include?(:verbose) ? "t" : "nil"
126
25
  puts "welcome to nydp : running tests"
127
- root_ns = { }
128
- setup(root_ns)
26
+ ns = { }
27
+ setup(ns)
129
28
  vm = VM.new
130
- LOADFILES.each { |f| StreamRunner.new(vm, root_ns, File.new(f)).run }
131
- StreamRunner.new(vm, root_ns, "(run-all-tests)").run
29
+ loadall vm, ns, loadfiles
30
+ loadall vm, ns, testfiles
31
+ StreamRunner.new(vm, ns, "(run-all-tests #{verbose})").run
132
32
  end
33
+
133
34
  end
134
35
 
36
+ require "nydp/core"
37
+ require "nydp/runner"
135
38
  require "nydp/error"
136
39
  require "nydp/truth"
137
40
  require "nydp/version"
@@ -1,6 +1,6 @@
1
1
  class Nydp::Builtin::Error
2
2
  def invoke vm, args
3
3
  s = args.map { |a| a.to_s }
4
- raise Nydp::Error.new(args.inspect)
4
+ raise Nydp::Error.new("#{args.inspect}\n\n#{vm.error}")
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  class Nydp::Builtin::Inspect
2
2
  def invoke vm, args
3
- vm.push_arg args.car.inspect
3
+ vm.push_arg Nydp::StringAtom.new(args.car.inspect)
4
4
  end
5
5
  end
@@ -2,10 +2,8 @@ class Nydp::Builtin::RandomString
2
2
  @@random_chars = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","2","3","4","5","6","7","8","9"]
3
3
 
4
4
  def invoke vm, args
5
- s = ""
6
- 1.upto(10) {
7
- s << @@random_chars[rand(@@random_chars.size)]
8
- }
9
- Nydp::StringAtom.new s
5
+ length = args.car unless Nydp.NIL.is?(args)
6
+ s = (0...(length || 10)).map { @@random_chars[rand(@@random_chars.size)] }.join
7
+ vm.push_arg Nydp::StringAtom.new s
10
8
  end
11
9
  end
@@ -0,0 +1,14 @@
1
+ class Nydp::Builtin::StringReplace
2
+ def invoke vm, args
3
+ to_remove = args.car.to_s
4
+ to_insert = args.cdr.car.to_s
5
+ target = args.cdr.cdr.car.to_s
6
+ result = target.to_s.gsub to_remove, to_insert
7
+
8
+ vm.push_arg Nydp::StringAtom.new result
9
+ end
10
+
11
+ def to_s
12
+ "Builtin:string-replace"
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class Nydp::Builtin::StringSplit
2
+ def invoke vm, args
3
+ target = args.car.to_s
4
+ separator = args.cdr.car.to_s
5
+ result = target.split separator
6
+ list = result.map { |s| Nydp::StringAtom.new s }
7
+
8
+ vm.push_arg Nydp::Pair.from_list list
9
+ end
10
+
11
+ def to_s
12
+ "Builtin:string-split"
13
+ end
14
+ end
@@ -10,3 +10,17 @@ class Nydp::Builtin::ToString
10
10
  vm.push_arg val
11
11
  end
12
12
  end
13
+
14
+ class Nydp::Builtin::StringPieces
15
+ def to_string first, rest
16
+ if Nydp.NIL.is? rest
17
+ first.to_s
18
+ else
19
+ "#{first.to_s}#{to_string rest.car, rest.cdr}"
20
+ end
21
+ end
22
+
23
+ def invoke vm, args
24
+ vm.push_arg Nydp::StringAtom.new to_string(args.car, args.cdr)
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ class Nydp::Builtin::TypeOf
2
+ def initialize ns
3
+ @ns = ns
4
+ end
5
+
6
+ def invoke vm, args
7
+ arg = args.car
8
+ type = Nydp::Symbol.mk(arg.nydp_type.to_sym, @ns) if arg.respond_to?(:nydp_type)
9
+ vm.push_arg(type || Nydp.NIL)
10
+ end
11
+ end
@@ -0,0 +1,66 @@
1
+ require 'nydp'
2
+
3
+ module Nydp
4
+ class Core
5
+ def name ; "Nydp Core" ; end
6
+
7
+ def relative_path name
8
+ File.join File.expand_path(File.dirname(__FILE__)), name
9
+ end
10
+
11
+ def load_rake_tasks
12
+ load relative_path '../tasks/tests.rake'
13
+ end
14
+
15
+ def loadfiles
16
+ b = relative_path('../lisp/boot.nydp')
17
+ t = relative_path('../lisp/test-runner.nydp')
18
+ [b,t]
19
+ end
20
+
21
+ def testfiles
22
+ Dir.glob(relative_path '../lisp/tests/**/*.nydp')
23
+ end
24
+
25
+ def setup ns
26
+ Symbol.mk(:cons, ns).assign(Nydp::Builtin::Cons.new)
27
+ Symbol.mk(:car, ns).assign(Nydp::Builtin::Car.new)
28
+ Symbol.mk(:cdr, ns).assign(Nydp::Builtin::Cdr.new)
29
+ Symbol.mk(:+, ns).assign(Nydp::Builtin::Plus.new)
30
+ Symbol.mk(:-, ns).assign(Nydp::Builtin::Minus.new)
31
+ Symbol.mk(:*, ns).assign(Nydp::Builtin::Times.new)
32
+ Symbol.mk(:/, ns).assign(Nydp::Builtin::Divide.new)
33
+ Symbol.mk(:>, ns).assign(Nydp::Builtin::GreaterThan.new)
34
+ Symbol.mk(:<, ns).assign(Nydp::Builtin::LessThan.new)
35
+ Symbol.mk(:eval, ns).assign(Nydp::Builtin::Eval.new(ns))
36
+ Symbol.mk(:hash, ns).assign(Nydp::Builtin::Hash.new)
37
+ Symbol.mk(:apply, ns).assign(Nydp::Builtin::Apply.new)
38
+ Symbol.mk(:error, ns).assign(Nydp::Builtin::Error.new)
39
+ Symbol.mk(:quit, ns).assign(Nydp::Builtin::Quit.new)
40
+ Symbol.mk(:p, ns).assign(Nydp::Builtin::Puts.new)
41
+ Symbol.mk(:PI, ns).assign Literal.new(3.1415)
42
+ Symbol.mk(:nil, ns).assign Nydp.NIL
43
+ Symbol.mk(:t, ns).assign Nydp.T
44
+ Symbol.mk(:sym, ns).assign Nydp::Builtin::ToSym.new(ns)
45
+ Symbol.mk(:inspect, ns).assign(Nydp::Builtin::Inspect.new)
46
+ Symbol.mk(:comment, ns).assign(Nydp::Builtin::Comment.new)
47
+ Symbol.mk(:millisecs, ns).assign(Nydp::Builtin::Millisecs.new)
48
+ Symbol.mk("random-string",ns).assign(Nydp::Builtin::RandomString.new)
49
+ Symbol.mk("to-string", ns).assign(Nydp::Builtin::ToString.new)
50
+ Symbol.mk("string-pieces",ns).assign(Nydp::Builtin::StringPieces.new)
51
+ Symbol.mk("string-replace", ns).assign(Nydp::Builtin::StringReplace.new)
52
+ Symbol.mk("string-split" , ns).assign(Nydp::Builtin::StringSplit.new )
53
+ Symbol.mk("type-of", ns).assign(Nydp::Builtin::TypeOf.new(ns))
54
+ Symbol.mk(:"eq?", ns).assign(Nydp::Builtin::IsEqual.new)
55
+ Symbol.mk(:"pair?", ns).assign(Nydp::Builtin::IsPair.new)
56
+ Symbol.mk(:"cdr-set", ns).assign(Nydp::Builtin::CdrSet.new)
57
+ Symbol.mk(:"hash-get", ns).assign(Nydp::Builtin::HashGet.new)
58
+ Symbol.mk(:"hash-set", ns).assign(Nydp::Builtin::HashSet.new)
59
+ Symbol.mk(:"hash-keys", ns).assign(Nydp::Builtin::HashKeys.new)
60
+ Symbol.mk(:"vm-info", ns).assign Nydp::Builtin::VmInfo.new
61
+ Symbol.mk(:"pre-compile", ns).assign Nydp::Builtin::PreCompile.new
62
+ end
63
+ end
64
+ end
65
+
66
+ Nydp.plug_in Nydp::Core.new