nil 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # nil
2
2
 
3
- nil is a brain**** language macro language and interpreter. ## Installation
3
+ nil is a brain**** language macro language and interpreter.
4
4
 
5
5
  ## Macro language
6
6
 
@@ -43,6 +43,17 @@ looking like such are comments:
43
43
 
44
44
  Comments *must* include both semicolons.
45
45
 
46
+ ### Modes
47
+
48
+ The original brain**** specification calls for buffers to be output as ASCII
49
+ text. However, sometimes outputting numbers is more useful. Nil allows modes to
50
+ be set. In the nil code, the line:
51
+
52
+ .mode(mode)
53
+
54
+ Will be used to set the mode. The `mode` can either be `num` or `ascii`. The
55
+ default mode is `ascii`.
56
+
46
57
  ## Interpreter
47
58
 
48
59
  nil is also a brain**** interpreter. It does the interpreting in its own special
@@ -97,7 +108,7 @@ interpreter.compile code
97
108
  interpreter.run
98
109
  ```
99
110
 
100
- Executable coming soon!
111
+ Run `nil -h` for command line tool usage.
101
112
 
102
113
  ## Contributing
103
114
 
data/TODO.md CHANGED
@@ -1,7 +1,3 @@
1
1
  # Future Features
2
2
 
3
3
  - Passing parameters to macros.
4
-
5
- # Issues
6
- - The `[` and `]` characters cause the interpreter to fail hard when used inside
7
- a macro, the interpreter believing that they are invalid characters
@@ -2,10 +2,22 @@ module Nil
2
2
  class Interpreter
3
3
  attr_reader :compiled_ruby
4
4
 
5
+ def self.mode=(x)
6
+ @@mode = x
7
+ end
8
+
9
+ def self.mode
10
+ @@mode
11
+ end
12
+
5
13
  def run
6
14
  eval(@compiled_ruby)
7
15
  end
8
16
 
17
+ def initialize
18
+ @@mode = 'ascii'
19
+ end
20
+
9
21
  def handle_command(command, count)
10
22
  case command[0]
11
23
  when '+'
@@ -21,13 +33,18 @@ module Nil
21
33
  when ']'
22
34
  "end\n"
23
35
  when '.'
24
- "puts stack[sp]\n"
36
+ if @@mode == 'num'
37
+ "puts stack[sp]\n"
38
+ else
39
+ "puts stack[sp].chr\n"
40
+ end
25
41
  when ','
26
42
  "stack[sp] = gets[0]\n"
27
43
  end
28
44
  end
29
45
 
30
- def compile(code)
46
+ def compile(code, mode)
47
+ @@mode = mode
31
48
  @compiled_ruby = <<RB
32
49
  sp = 0
33
50
  stack = [0] * 10_000
data/lib/nil/macro.rb CHANGED
@@ -1,9 +1,8 @@
1
1
  module Nil
2
2
  class MacroParser
3
- attr_accessor :original_code, :compiled_code
3
+ attr_accessor :original_code, :compiled_code, :mode
4
4
 
5
5
  def initialize
6
- # This method intentionally left blank.
7
6
  end
8
7
 
9
8
  def compile_subroutines(code)
@@ -27,6 +26,13 @@ module Nil
27
26
  code.gsub(sub_def_regex, '')
28
27
  end
29
28
 
29
+ def interpret_mode_definition(code)
30
+ code.match /\.mode\((ascii|num)\)/i do |m|
31
+ $1 == 'num' ? Nil::Interpreter.mode = 'num' : Nil::Interpreter.mode = 'ascii'
32
+ end
33
+ code.gsub(/\.mode\((ascii|num)\)/i, '')
34
+ end
35
+
30
36
  def expand_included_files(code)
31
37
  c = code
32
38
  include_regex = Regexp.new '\.include\(([^\)]+)\)'
@@ -51,6 +57,8 @@ module Nil
51
57
 
52
58
  compiled_code.gsub!(/\s/, '')
53
59
 
60
+ compiled_code = interpret_mode_definition(compiled_code)
61
+
54
62
  compiled_code = expand_included_files(compiled_code)
55
63
 
56
64
  compiled_code = strip_comments(compiled_code)
data/lib/nil/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nil
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.5"
3
3
  end
data/test/nil_test.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'nil'
2
2
  require 'riot'
3
3
 
4
- # Riot.pretty_dots
4
+ Riot.pretty_dots
5
5
 
6
6
  BOILERPLATE = <<RB
7
7
  sp = 0
@@ -10,19 +10,23 @@ RB
10
10
 
11
11
  context "Interpreter" do
12
12
  setup { Nil::Interpreter.new }
13
- asserts("invalid characters in code cause failure") { topic.compile "a++" }.raises SyntaxError
13
+
14
+ asserts("invalid characters in code cause failure") { topic.compile "a++", 'num' }.raises SyntaxError
15
+
14
16
  asserts("creates boilerplate code") { topic.compiled_ruby == BOILERPLATE }
15
- asserts("handles .") { topic.compile('.') == (BOILERPLATE + "puts stack[sp]\n") }
16
- asserts("handles ,") { topic.compile(',') == (BOILERPLATE + "stack[sp] = gets[0]\n") }
17
- asserts("handles >") { topic.compile('>') == (BOILERPLATE + "sp += 1\n") }
18
- asserts("handles <") { topic.compile('<') == (BOILERPLATE + "sp -= 1\n") }
19
- asserts("handles +") { topic.compile('+') == (BOILERPLATE + "stack[sp] += 1\n") }
20
- asserts("handles -") { topic.compile('-') == (BOILERPLATE + "stack[sp] -= 1\n") }
21
- asserts("handles [") { topic.compile('[') == (BOILERPLATE + "while stack[sp] != 0\n" ) }
22
- asserts("handles ]") { topic.compile(']') == (BOILERPLATE + "end\n" ) }
17
+
18
+ asserts("handles . in numerical mode") { topic.compile('.', 'num') == (BOILERPLATE + "puts stack[sp]\n") }
19
+ asserts("handles . in ascii mode") { topic.compile('.', 'ascii') == (BOILERPLATE + "puts stack[sp].chr\n") }
20
+ asserts("handles ,") { topic.compile(',', 'num') == (BOILERPLATE + "stack[sp] = gets[0]\n") }
21
+ asserts("handles >") { topic.compile('>', 'num') == (BOILERPLATE + "sp += 1\n") }
22
+ asserts("handles <") { topic.compile('<', 'num') == (BOILERPLATE + "sp -= 1\n") }
23
+ asserts("handles +") { topic.compile('+', 'num') == (BOILERPLATE + "stack[sp] += 1\n") }
24
+ asserts("handles -") { topic.compile('-', 'num') == (BOILERPLATE + "stack[sp] -= 1\n") }
25
+ asserts("handles [") { topic.compile('[', 'num') == (BOILERPLATE + "while stack[sp] != 0\n" ) }
26
+ asserts("handles ]") { topic.compile(']', 'num') == (BOILERPLATE + "end\n" ) }
23
27
 
24
28
  asserts("handles multiple operators smartly") do
25
- code = topic.compile "++++---->>>><<<<"
29
+ code = topic.compile "++++---->>>><<<<", 'num'
26
30
  code == BOILERPLATE + <<CODE
27
31
  stack[sp] += 4
28
32
  stack[sp] -= 4
@@ -33,7 +37,7 @@ CODE
33
37
 
34
38
  asserts("handles multiple printing statements") do
35
39
  code = "++++.>+++."
36
- code = topic.compile(code)
40
+ code = topic.compile(code, 'num')
37
41
  code == BOILERPLATE + <<CODE
38
42
  stack[sp] += 4
39
43
  puts stack[sp]
@@ -71,6 +75,26 @@ context "MacroParser" do
71
75
  end
72
76
  end
73
77
 
78
+ context "Modes" do
79
+ asserts("that numerical mode is correctly set") do
80
+ code = ".mode(num)"
81
+ compiled = topic.parse code
82
+ Nil::Interpreter.mode == 'num'
83
+ end
84
+
85
+ asserts("that ascii mode is correctly set") do
86
+ code = ".mode(ascii)"
87
+ compiled = topic.parse code
88
+ Nil::Interpreter.mode == 'ascii'
89
+ end
90
+
91
+ asserts("that ascii mode is set by default") do
92
+ code = "+"
93
+ compiled = topic.parse code
94
+ Nil::Interpreter.mode == 'ascii'
95
+ end
96
+ end
97
+
74
98
  context "Subroutines" do
75
99
  asserts("that subroutines are expanded") do
76
100
  code = ":test{++--><}++test:"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nil
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-01 00:00:00.000000000 Z
12
+ date: 2012-06-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: trollop