nydp 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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