nydp 0.0.9 → 0.0.10

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: 815a0a959a0678c7fc8a7e4ad5cd50fa0a5aa0fb
4
- data.tar.gz: 23c872b0c3126bfc18c9859e617ba645751e38ad
3
+ metadata.gz: 878f0dba9573b146bf3bf438d5c8d7792f9fc1e9
4
+ data.tar.gz: 57c14a21f93ec56968f9f4e3bae5ee634eac9608
5
5
  SHA512:
6
- metadata.gz: 2980ea82cc715d36febeaa27a008fef8e2eb507caad76a030ba46b52ddcb690b311c6313018c589790d9d49db3497fd0c044b2fe3ca284024dadd237fe5e5594
7
- data.tar.gz: 3ba9d1749f05d877749af1ec35ee0a2cbdb8fa0ba818c194a8d0f3d773c674d1ea85b185a7eeea24e923781328ed4a61bcb03f38540088393d8dd9b9f9129b9c
6
+ metadata.gz: 2f8fa342fe36104a3d957bb3bd354b79f185948fc9779abd7c146dbe092065a29ad31cb4193ae8a8aeded94b4a4671c3075d05e9a112404dde554dbbe1887290
7
+ data.tar.gz: 6999b8761df3c3d19909d0341d208b08fb9793e926066838ab99329c6b87fece28dd085e56ba82970e96ebbd10a439137ce76b12f6513c853fd83f09eb7dbbff
data/lib/lisp/boot.nydp CHANGED
@@ -23,7 +23,6 @@
23
23
  (assign cddr (fn (arg) (cdr (cdr arg))))
24
24
  (assign no (fn (arg) (cond arg nil t)))
25
25
  (assign just (fn (arg) arg))
26
- (assign pargs (fn args (apply p args) (last args)))
27
26
 
28
27
  (assign mac-expand (fn (macfn name body)
29
28
  (cond macfn
@@ -32,12 +31,6 @@
32
31
 
33
32
  (assign macs (hash))
34
33
 
35
- (assign debug-pre-compile
36
- (fn (arg)
37
- (assign *debug-pre-compile* arg)))
38
-
39
- (assign *debug-pre-compile* nil)
40
-
41
34
  (assign pre-compile-expr
42
35
  (fn (name body)
43
36
  (mac-expand (hash-get macs name) name body)))
@@ -51,18 +44,27 @@
51
44
  args))))
52
45
 
53
46
  (assign pre-compile-msg
54
- (fn args
55
- (cond *debug-pre-compile* (apply p args))
56
- (last args)))
47
+ (fn (src compiled)
48
+ (pre-compile-msg "pre-compile" src "\n -> " compiled)
49
+ compiled))
50
+
51
+ (assign pre-compile-raw
52
+ (fn (arg)
53
+ (cond (pair? arg)
54
+ (cond (eq? (car arg) 'quote)
55
+ arg
56
+ (pre-compile-each (pre-compile-expr (car arg) (cdr arg))))
57
+ arg)))
57
58
 
58
- (assign pre-compile
59
+ (assign pre-compile-debug
59
60
  (fn (arg)
60
- (pre-compile-msg "pre-compile" arg "\n -> "
61
- (cond (pair? arg)
62
- (cond (eq? (car arg) 'quote)
63
- arg
64
- (pre-compile-each (pre-compile-expr (car arg) (cdr arg))))
65
- arg))))
61
+ (pre-compile-msg arg (pre-compile-raw arg))))
62
+
63
+ (assign debug-pre-compile
64
+ (fn (arg)
65
+ (assign pre-compile (cond arg pre-compile-debug pre-compile-raw))))
66
+
67
+ (debug-pre-compile nil)
66
68
 
67
69
  (hash-set macs 'def
68
70
  (fn (name args . body)
@@ -151,6 +153,9 @@
151
153
  `(cond ,(car args) ,(cadr args)))
152
154
  (car args))))
153
155
 
156
+ (mac unless (arg . body)
157
+ `(if (no ,arg) (do ,@body)))
158
+
154
159
  (def expand-colon-syntax (first rest)
155
160
  (if (no rest)
156
161
  `(apply ,first args)
@@ -351,7 +356,7 @@
351
356
  (def dot-syntax-assignment (names value-expr)
352
357
  (let rnames (rev names)
353
358
  `(hash-set ,(build-hash-getters (rev (cdr rnames)) nil)
354
- ',(car rnames)
359
+ ,(build-hash-get-key:car rnames)
355
360
  ,value-expr)))
356
361
 
357
362
  (mac = (name value)
@@ -31,6 +31,31 @@
31
31
 
32
32
  (register-test
33
33
  '(suite "Boot Tests"
34
+ (suite "conditionals"
35
+ ("single-expr 'if is just the expr"
36
+ (pre-compile '(if a))
37
+ a)
38
+
39
+ ("two-expr 'if expands to 'cond"
40
+ (pre-compile '(if a b))
41
+ (cond a b))
42
+
43
+ ("three-expr 'if expands to 'cond"
44
+ (pre-compile '(if a b c))
45
+ (cond a b c))
46
+
47
+ ("four-expr 'if expands to nested 'cond"
48
+ (pre-compile '(if a b c d))
49
+ (cond a b (cond c d)))
50
+
51
+ ("five-expr 'if expands to nested 'cond"
52
+ (pre-compile '(if a b c d e))
53
+ (cond a b (cond c d e)))
54
+
55
+ ("'unless expands to 'if"
56
+ (pre-compile '(unless x y z))
57
+ (cond (no x) ((fn () y z)))))
58
+
34
59
  (suite "hashtables"
35
60
  ("build a hash table from brace-list syntax"
36
61
  (let hsh { foo 1 bar 2 }
@@ -111,7 +136,8 @@
111
136
  (suite "mapx"
112
137
  ("provides a convenient simplification for 'map"
113
138
  (mapx '(1 2 3 4) n (* n 2))
114
- (2 4 6 8)))
139
+ (2 4 6 8))))
140
+
115
141
 
116
142
  (suite "pre-compile"
117
143
  (suite "bang-syntax"
@@ -88,6 +88,10 @@
88
88
  (pre-compile '(= a.b 42))
89
89
  (hash-set a 'b 42))
90
90
 
91
+ ("hash assignment with unquote"
92
+ (pre-compile '(= a.,b 42))
93
+ (hash-set a b 42))
94
+
91
95
  ("recursive hash assignment"
92
96
  (pre-compile '(= a.b.c.d 42))
93
97
  (hash-set (hash-get (hash-get a 'b) 'c) 'd 42))
data/lib/nydp.rb CHANGED
@@ -24,12 +24,16 @@ module Nydp
24
24
  end
25
25
 
26
26
  def self.apply_function ns, function_name, *args
27
- function = Nydp::Symbol.mk(function_name, ns).value
28
- args = Nydp::Pair.from_list args
27
+ function = r2n(function_name.to_sym, ns).value
28
+ args = r2n args, ns
29
29
  vm = VM.new
30
30
 
31
31
  function.invoke vm, args
32
- return vm.pop_arg
32
+ vm.thread
33
+ end
34
+
35
+ def self.eval_src ns, src_txt
36
+ Nydp::Runner.new(VM.new, ns, Nydp::StringReader.new(src_txt)).run
33
37
  end
34
38
 
35
39
  def self.repl
@@ -1,6 +1,5 @@
1
1
  class Nydp::Builtin::Error
2
2
  def invoke vm, args
3
- s = args.map { |a| a.to_s }
4
- raise Nydp::Error.new("#{args.inspect}\n\n#{vm.error}")
3
+ raise Nydp::Error.new(args.inspect)
5
4
  end
6
5
  end
data/lib/nydp/date.rb CHANGED
@@ -17,6 +17,7 @@ module Nydp
17
17
  end
18
18
 
19
19
  def to_s ; ruby_date.to_s ; end
20
+ def to_ruby ; ruby_date ; end
20
21
  def inspect ; ruby_date.inspect ; end
21
22
  def nydp_type ; :date ; end
22
23
 
@@ -73,7 +73,7 @@ module Nydp
73
73
 
74
74
  def inspect; to_s; end
75
75
  def to_s
76
- "(fn #{arg_names.to_s} #{body.map { |b| b.inspect}.join(' ')})"
76
+ "(fn #{arg_names.inspect} #{body.map { |b| b.inspect}.join(' ')})"
77
77
  end
78
78
  end
79
79
  end
data/lib/nydp/runner.rb CHANGED
@@ -47,14 +47,12 @@ module Nydp
47
47
  end
48
48
 
49
49
  def compile_and_eval expr
50
- result = vm.thread Pair.new(Compiler.compile(expr, Nydp.NIL), Nydp.NIL)
51
- e = vm.unhandled_error
52
- vm.unhandled_error = nil
53
- if e
50
+ begin
51
+ vm.thread Pair.new(Compiler.compile(expr, Nydp.NIL), Nydp.NIL)
52
+ rescue Exception => e
54
53
  new_msg = "failed to eval #{expr.inspect}\nerror was #{Nydp.indent_text e.message}"
55
54
  raise e.class, new_msg, e.backtrace
56
55
  end
57
- result
58
56
  end
59
57
 
60
58
  def quote expr
@@ -86,6 +84,13 @@ module Nydp
86
84
  @printer.puts val.inspect if @printer
87
85
  end
88
86
 
87
+ def handle_run_error e
88
+ puts e.message
89
+ e.backtrace.each do |b|
90
+ puts b
91
+ end
92
+ end
93
+
89
94
  def run
90
95
  res = Nydp.NIL
91
96
  while !@tokens.finished
@@ -94,14 +99,17 @@ module Nydp
94
99
  begin
95
100
  print(res = evaluate(expr))
96
101
  rescue Exception => e
97
- puts e.message
98
- e.backtrace.each do |b|
99
- puts b
100
- end
102
+ handle_run_error e
101
103
  end
102
104
  end
103
105
  end
104
106
  res
105
107
  end
106
108
  end
109
+
110
+ class ExplodeRunner < Runner
111
+ def handle_run_error e
112
+ raise e
113
+ end
114
+ end
107
115
  end
data/lib/nydp/symbol.rb CHANGED
@@ -21,7 +21,6 @@ class Nydp::Symbol
21
21
  @value || Nydp.NIL
22
22
  end
23
23
 
24
-
25
24
  def self.mk name, ns
26
25
  name = name.to_sym
27
26
  return Nydp.NIL if name == :nil
data/lib/nydp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nydp
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
data/lib/nydp/vm.rb CHANGED
@@ -10,11 +10,11 @@ module Nydp
10
10
  @instructions = []
11
11
  @args = []
12
12
  @contexts = []
13
- @locals = { }
13
+ @locals = Nydp::Hash.new
14
14
  end
15
15
 
16
- def thread expr
17
- instructions.push expr
16
+ def thread expr=nil
17
+ instructions.push expr if expr
18
18
  while instructions.length > 0
19
19
  begin
20
20
  self.current_context = contexts.last
@@ -26,6 +26,7 @@ module Nydp
26
26
  handle_error e
27
27
  end
28
28
  end
29
+ raise unhandled_error if unhandled_error
29
30
  pop_arg
30
31
  end
31
32
 
@@ -50,11 +51,12 @@ module Nydp
50
51
  end
51
52
  end
52
53
 
53
- def peek_context; current_context; end
54
- def pop_context; contexts.pop; end
55
- def push_arg a; args.push a; end
56
- def peek_arg; args.last; end
57
- def pop_arg; args.pop; end
54
+ def peek_context ; current_context ; end
55
+ def pop_context ; contexts.pop ; end
56
+ def push_arg a ; args.push a ; end
57
+ def args! ; args.empty? ? (raise "illegal operation: no args") : args ; end
58
+ def peek_arg ; args!.last ; end
59
+ def pop_arg ; args!.pop ; end
58
60
 
59
61
  def push_instructions ii, ctx
60
62
  instructions.push ii
data/spec/date_spec.rb CHANGED
@@ -11,6 +11,7 @@ describe Nydp::Date do
11
11
  expect(nd). to be_a Nydp::Date
12
12
  expect(nd.to_s). to eq "2015-06-08"
13
13
  expect(nd.inspect).to eq "#<Date: 2015-06-08 ((2457182j,0s,0n),+0s,2299161j)>"
14
+ expect(nd.to_ruby).to eq Date.parse("2015-06-08")
14
15
  end
15
16
 
16
17
  it "returns date components" do
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Nydp::VM do
4
+ let(:ns) { { } }
5
+ let(:vm) { Nydp::VM.new }
6
+
7
+ def run txt
8
+ Nydp.setup ns
9
+ Nydp::ExplodeRunner.new(vm, ns, Nydp::StringReader.new(txt)).run
10
+ end
11
+
12
+ describe "unhandled_error" do
13
+ it "raises a helpful error" do
14
+ proc = Proc.new { run "dflkjdgjeirgjeoi" }
15
+ msg = "failed to eval dflkjdgjeirgjeoi\nerror was unbound symbol: dflkjdgjeirgjeoi"
16
+ expect(proc).to raise_error RuntimeError, msg
17
+ end
18
+ end
19
+ end
data/spec/nydp_spec.rb CHANGED
@@ -6,7 +6,7 @@ describe Nydp do
6
6
 
7
7
  def run txt
8
8
  Nydp.setup ns
9
- Nydp::Runner.new(vm, ns, Nydp::StringReader.new(txt)).run
9
+ Nydp.eval_src ns, txt
10
10
  end
11
11
 
12
12
  it "should make a symbol from a string" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nydp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conan Dalton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-23 00:00:00.000000000 Z
11
+ date: 2015-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -160,6 +160,7 @@ files:
160
160
  - nydp.gemspec
161
161
  - spec/date_spec.rb
162
162
  - spec/embedded_spec.rb
163
+ - spec/error_spec.rb
163
164
  - spec/hash_spec.rb
164
165
  - spec/literal_spec.rb
165
166
  - spec/nydp_spec.rb
@@ -197,6 +198,7 @@ summary: A civilised yet somewhat dangerous kind of Lisp for a new generation
197
198
  test_files:
198
199
  - spec/date_spec.rb
199
200
  - spec/embedded_spec.rb
201
+ - spec/error_spec.rb
200
202
  - spec/hash_spec.rb
201
203
  - spec/literal_spec.rb
202
204
  - spec/nydp_spec.rb