subtle-lang 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in subtle.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,3 @@
1
+ guard 'rspec' do
2
+ watch(/^(lib|spec)/) { "spec" }
3
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Utkarsh Kukreti
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.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Subtle
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'subtle'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install subtle
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :pry do
4
+ prelude = "include Subtle; pa = Parser.new; t = Transform.new;" +
5
+ "e = Evaluator.new;"
6
+ system "pry -Ilib -rsubtle -e '#{prelude}; puts \"#{prelude}\"'"
7
+ end
8
+
9
+ task default: :pry
data/bin/subtle ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'subtle'
3
+
4
+ Subtle::CLI.new ARGV
data/lib/subtle.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "parslet"
2
+
3
+ require "subtle/parser"
4
+ require "subtle/transform"
5
+ require "subtle/evaluator"
6
+
7
+ require "subtle/cli"
8
+
9
+ require "subtle/version"
data/lib/subtle/cli.rb ADDED
@@ -0,0 +1,34 @@
1
+ module Subtle
2
+ class CLI
3
+ def initialize(argv)
4
+ repl # Just start the REPL for now
5
+ end
6
+
7
+ def repl
8
+ require "readline"
9
+ prompt = "> "
10
+
11
+ evaluator = Evaluator.new
12
+ loop do
13
+ line = Readline::readline(prompt)
14
+
15
+ if line.nil? or line == "exit"
16
+ puts if line.nil?
17
+ puts "Bye!"
18
+ exit 0
19
+ end
20
+
21
+ next if line.empty?
22
+
23
+ Readline::HISTORY << line
24
+
25
+ begin
26
+ p evaluator.eval line
27
+ rescue Exception => e
28
+ puts e.message
29
+ puts e.backtrace
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,174 @@
1
+ module Subtle
2
+ class Evaluator
3
+ def initialize
4
+ @parser = Parser.new
5
+ @transform = Transform.new
6
+ end
7
+
8
+ def eval(string_or_tree)
9
+ if String === string_or_tree
10
+ parsed = @parser.parse string_or_tree
11
+ t = @transform.apply parsed
12
+ else
13
+ t = string_or_tree
14
+ end
15
+
16
+ if Hash === t
17
+ type = t[:type]
18
+ case type
19
+ when :monad
20
+ verb = t[:verb]
21
+ adverb = t[:adverb]
22
+ right = try_eval t[:right]
23
+
24
+ # `^` in Subtle is `**` in Ruby.
25
+ verb = "**" if verb == "^"
26
+
27
+ if adverb
28
+ if Array === right
29
+ if right.size < 2
30
+ ae! t, "Need Array of size atleast 2 for a monadic adverb." +
31
+ " Your Array had #{right.size} items."
32
+ end
33
+ else
34
+ ae! t, "Can only apply monadic adverb on Arrays." +
35
+ " You passed in #{right.class}."
36
+ end
37
+ case adverb
38
+ when "/"
39
+ right.reduce do |fold, r|
40
+ eval type: :dyad, verb: verb, left: fold, right: r
41
+ end
42
+ end
43
+ else
44
+ if Array === right
45
+ else
46
+ ae! t, "Can only apply monadic verb on Arrays." +
47
+ " You passed in #{right.class}."
48
+ end
49
+ case verb
50
+ when "&"
51
+ [].tap do |ret|
52
+ right.each_with_index do |r, i|
53
+ r.times { ret << i }
54
+ end
55
+ end
56
+ when "~"
57
+ right.map do |r|
58
+ r == 0 ? 1 : 0
59
+ end
60
+ else
61
+ nie! "Verb #{verb} without Adverb not implemented as a Monad"
62
+ end
63
+ end
64
+ when :dyad
65
+ left = try_eval t[:left]
66
+ verb = t[:verb]
67
+ adverb = t[:adverb]
68
+ right = try_eval t[:right]
69
+
70
+ # `^` in Subtle is `**` in Ruby.
71
+ verb = "**" if verb == "^"
72
+
73
+ if adverb
74
+ if Array === left && Array === right
75
+ else
76
+ ae! t, "Adverb `#{adverb}` must have arrays on both left and" +
77
+ " right. You passed in #{left.class} and #{right.class}."
78
+ end
79
+
80
+ case adverb
81
+ when "/:" # Map each over right
82
+ right.map do |r|
83
+ eval({ type: :dyad, left: left, verb: verb, right: r })
84
+ end
85
+ when "\\:" # Map each over left
86
+ left.map do |l|
87
+ eval({ type: :dyad, left: l, verb: verb, right: right })
88
+ end
89
+ else
90
+ nie! t, "Invalid Adverb #{adverb}"
91
+ end
92
+ else
93
+ case verb
94
+ when "+", "-", "*", "/", "%", "**"
95
+ if Numeric === left && Numeric === right
96
+ left.send(verb, right)
97
+ elsif Array === left && Array === right
98
+ if left.size != right.size
99
+ ae! t, "Size of left array must be the same as the size of" +
100
+ " right one, but #{left.size} != #{right.size}."
101
+ end
102
+
103
+ left.zip(right).map do |x, y|
104
+ x.send(verb, y)
105
+ end
106
+ elsif Array === left && Numeric === right
107
+ left.map do |l|
108
+ l.send(verb, right)
109
+ end
110
+ elsif Numeric === left && Array === right
111
+ right.map do |r|
112
+ left.send(verb, r)
113
+ end
114
+ else
115
+ nie! t
116
+ end
117
+ when "&", "|"
118
+ verb = "min" if verb == "&"
119
+ verb = "max" if verb == "|"
120
+
121
+ if Numeric === left && Numeric === right
122
+ [left, right].send(verb)
123
+ elsif Array === left && Array === right
124
+ if left.size != right.size
125
+ ae! t, "Size of left array must be the same as the size of" +
126
+ " right one, but #{left.size} != #{right.size}."
127
+ end
128
+
129
+ left.zip(right).map do |x, y|
130
+ [x, y].send(verb)
131
+ end
132
+ elsif Array === left && Numeric === right
133
+ left.map do |l|
134
+ [l, right].send(verb)
135
+ end
136
+ elsif Numeric === left && Array === right
137
+ right.map do |r|
138
+ [left, r].send(verb)
139
+ end
140
+ else
141
+ nie! t
142
+ end
143
+ else
144
+ nie! t, "Invalid verb #{verb}."
145
+ end
146
+ end
147
+ when :enumerate
148
+ last = try_eval t[:last]
149
+ if Numeric === last
150
+ (0...last.floor).to_a
151
+ else
152
+ nie! t
153
+ end
154
+ else
155
+ nie! t
156
+ end
157
+ else
158
+ t
159
+ end
160
+ end
161
+
162
+ def try_eval(t)
163
+ Hash === t ? eval(t) : t
164
+ end
165
+
166
+ def ae!(tree, message = "")
167
+ raise ArgumentError.new message << "\n" << tree.to_yaml
168
+ end
169
+
170
+ def nie!(tree, message = "")
171
+ raise NotImplementedError.new message << "\n" << tree.to_yaml
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,64 @@
1
+ module Subtle
2
+ class Parser < Parslet::Parser
3
+ def initialize
4
+ @monadic_verbs = %w{+ - * / % ^ | & ~}
5
+ @monadic_adverbs = %w{/}
6
+ @dyadic_verbs = %w{+ - * / % ^ | &}
7
+ @dyadic_adverbs = %w{/: \:}
8
+ end
9
+
10
+ rule(:spaces) { match["\\s"].repeat(1) }
11
+ rule(:spaces?) { spaces.maybe }
12
+ rule(:digits) { match["0-9"].repeat(1) }
13
+ rule(:minus) { str("-") }
14
+
15
+ rule(:integer) { (minus.maybe >> digits).as(:integer) >> spaces? }
16
+ rule(:float) { (minus.maybe >> digits >> str(".") >> digits).as(:float) >>
17
+ spaces? }
18
+ rule(:atom) { float | integer }
19
+ rule(:array) { (atom >> spaces?).repeat(2).as(:array) >> spaces? }
20
+
21
+ rule :enumerate do
22
+ (str("!") >> spaces? >> (float | integer).as(:last)).as(:enumerate)
23
+ end
24
+
25
+ rule(:noun) { enumerate | array | atom }
26
+
27
+ rule :monadic_verb do
28
+ @monadic_verbs.map { |verb| str(verb) }.reduce(:|).as(:verb) >> spaces?
29
+ end
30
+
31
+ rule :monadic_adverb do
32
+ @monadic_adverbs.map { |adverb| str(adverb) }.reduce(:|).as(:adverb) >>
33
+ spaces?
34
+ end
35
+
36
+ rule :dyadic_verb do
37
+ @dyadic_verbs.map { |verb| str(verb) }.reduce(:|).as(:verb) >> spaces?
38
+ end
39
+
40
+ rule :dyadic_adverb do
41
+ @dyadic_adverbs.map { |adverb| str(adverb) }.reduce(:|).as(:adverb) >>
42
+ spaces?
43
+ end
44
+
45
+ rule :dyad do
46
+ (noun.as(:left) >> dyadic_verb >> dyadic_adverb.maybe >>
47
+ word.as(:right)).as(:dyad)
48
+ end
49
+
50
+ rule :monad do
51
+ (monadic_verb >> monadic_adverb.maybe >> word.as(:right)).as(:monad)
52
+ end
53
+
54
+ rule :word do
55
+ dyad | noun | monad
56
+ end
57
+
58
+ rule :sentence do
59
+ word
60
+ end
61
+
62
+ root :sentence
63
+ end
64
+ end
@@ -0,0 +1,30 @@
1
+ module Subtle
2
+ class Transform < Parslet::Transform
3
+ rule(integer: simple(:x)) { x.to_i }
4
+ rule(float: simple(:x)) { x.to_f }
5
+ rule(array: subtree(:x)) { x }
6
+
7
+ rule monad: { verb: simple(:verb), right: subtree(:right) } do
8
+ { type: :monad, verb: verb.to_s, right: right }
9
+ end
10
+
11
+ rule monad: { verb: simple(:verb), adverb: simple(:adverb),
12
+ right: subtree(:right) } do
13
+ { type: :monad, verb: verb.to_s, adverb: adverb.to_s, right: right }
14
+ end
15
+
16
+ rule dyad: { left: subtree(:left), verb: simple(:verb),
17
+ right: subtree(:right) } do
18
+ { type: :dyad, left: left, verb: verb.to_s, right: right }
19
+ end
20
+
21
+ rule dyad: { left: subtree(:left), verb: simple(:verb),
22
+ adverb: simple(:adverb), right: subtree(:right) } do
23
+ { type: :dyad, left: left, verb: verb.to_s, adverb: adverb, right: right }
24
+ end
25
+
26
+ rule enumerate: { last: subtree(:last) } do
27
+ { type: :enumerate, last: last }
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module Subtle
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe Subtle do
4
+ describe "Examples" do
5
+ describe "Project Euler" do
6
+ describe "Problem 1:" +
7
+ " Find the sum of all the multiples of 3 or 5 below 1000." do
8
+ e "+/&~&/!1000%/:3 5", 233168
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ require "bundler/setup"
2
+
3
+ require "simplecov"
4
+ SimpleCov.start do
5
+ add_group "Libraries", "/lib"
6
+ end
7
+
8
+ require "subtle"
9
+
10
+ RSpec.configure do |config|
11
+ def e(input, output)
12
+ it "should evaluate #{input.inspect} to #{output.inspect}" do
13
+ evaluator = Subtle::Evaluator.new
14
+ evaluator.eval(input).should eq output
15
+ end
16
+ end
17
+
18
+ def ae!(input)
19
+ it "should raise ArgumentError on evaluating #{input.inspect}" do
20
+ expect do
21
+ evaluator = Subtle::Evaluator.new
22
+ evaluator.eval(input).should eq output
23
+ end.to raise_exception(ArgumentError)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,92 @@
1
+ require "spec_helper"
2
+
3
+ describe Subtle::Evaluator do
4
+ describe "Dyads" do
5
+ describe "Simple Arithmetic" do
6
+ describe "on Atoms" do
7
+ e "1 + 1", 2
8
+ e "1 + 2 - -3 * 8 + 5 % 4", 30
9
+ e "-1 * 5.0 / 4", -1.25
10
+ end
11
+
12
+ describe "on Arrays" do
13
+ e "1 1 1 + 2 2 2 * 3 3 3", [7, 7, 7]
14
+ end
15
+
16
+ describe "on Atoms and Arrays" do
17
+ e "1.1 1 + -2 + 2 2 * 3 % 4 ^ 2 3 + 1 - -1 -1", [5.1, 5]
18
+ end
19
+ end
20
+
21
+ describe "And/Min (`&`) and Or/Max(`|`)" do
22
+ describe "on Atoms" do
23
+ e "1 & 2 - 3", -1
24
+ e "7 & 8 | 0", 7
25
+ end
26
+
27
+ describe "on Arrays" do
28
+ e "1 12 & 7 8", [1, 8]
29
+ e "1 12 | 7 8", [7, 12]
30
+ end
31
+
32
+ describe "on Atoms and Arrays" do
33
+ e "1 | 7 0 & 8 2 | 8 & 6 7 & 1", [7, 1]
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "Enumerate (`!`)" do
39
+ describe "Precedence" do
40
+ e "!4", [0, 1, 2, 3]
41
+ e "1 - !2 + 2", [-1, -2]
42
+ end
43
+
44
+ describe "on Floats" do
45
+ e "!2.1", [0, 1]
46
+ end
47
+ end
48
+
49
+ describe "Adverbs" do
50
+ describe "Map over each right (`/:`)" do
51
+ e "1 2 3 +/: 5 6", [[6, 7, 8], [7, 8, 9]]
52
+ e "1 2 3 -/: 0 1", [[1, 2, 3], [0, 1, 2]]
53
+ e "3 2 3 ^/: 2 3", [[9, 4, 9], [27, 8, 27]]
54
+ e "3 2 3 &/: 2 3", [[2, 2, 2], [3, 2, 3]]
55
+ e "1 2 3 |/: 0 3", [[1, 2, 3], [3, 3, 3]]
56
+ end
57
+
58
+ describe "Map over each left (`\:`)" do
59
+ e "1 2 3 +\\: 5 6", [[6, 7, 8], [7, 8, 9]].transpose
60
+ e "1 2 3 -\\: 0 1", [[1, 2, 3], [0, 1, 2]].transpose
61
+ e "3 2 3 ^\\: 2 3", [[9, 4, 9], [27, 8, 27]].transpose
62
+ e "3 2 3 &\\: 2 3", [[2, 2, 2], [3, 2, 3]].transpose
63
+ e "1 2 3 |\\: 0 3", [[1, 2, 3], [3, 3, 3]].transpose
64
+ end
65
+
66
+ describe "Fold (`/`)" do
67
+ e "+/1 2 3", 6
68
+ # +/3 4 => 7; 1 2 + 7 => 8 9; +/8 9 => 17;
69
+ e "+/1 2 + +/3 4", 17
70
+ e "^/2 3 4", 4096
71
+ e "&/1 2 3", 1
72
+ e "|/1 2 3", 3
73
+ end
74
+ end
75
+
76
+ describe "Monads" do
77
+ describe "Where (`&`)" do
78
+ e "&1 0 1", [0, 2]
79
+ e "&1 3 2", [0, 1, 1, 1, 2, 2]
80
+ end
81
+
82
+ describe "Not (`~`)" do
83
+ e "~1 0 -1 1 7 8 0 0", [0, 1, 0, 0, 0, 0, 1, 1]
84
+ end
85
+ end
86
+ describe "Errors" do
87
+ describe "on Arrays" do
88
+ ae! "1 2 + 2 3 4"
89
+ ae! "1 2 | 2 3 4"
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe Subtle do
4
+ it "should have a VERSION" do
5
+ Subtle::VERSION.should be_a String
6
+ end
7
+ end
data/subtle.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'subtle/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "subtle-lang"
8
+ gem.version = Subtle::VERSION
9
+ gem.authors = ["Utkarsh Kukreti"]
10
+ gem.email = ["utkarshkukreti@gmail.com"]
11
+ gem.description = %q{Subtle is a Terse, Array based Programming Language,
12
+ heavily inspired by the K Programming Language, and
13
+ partly by APL and J.}
14
+ gem.summary = %q{Subtle is a Terse, Array based Programming Language,
15
+ heavily inspired by the K Programming Language, and
16
+ partly by APL and J.}
17
+ gem.homepage = "https://github.com/utkarshkukreti/subtle-lang"
18
+
19
+ gem.files = `git ls-files`.split($/)
20
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
22
+ gem.require_paths = ["lib"]
23
+
24
+ gem.add_dependency "parslet"
25
+
26
+ %w{rspec guard-rspec simplecov pry pry-debugger}.each do |name|
27
+ gem.add_development_dependency name
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: subtle-lang
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Utkarsh Kukreti
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: parslet
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: guard-rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: pry
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: pry-debugger
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: ! "Subtle is a Terse, Array based Programming Language,\n heavily
111
+ inspired by the K Programming Language, and\n partly by
112
+ APL and J."
113
+ email:
114
+ - utkarshkukreti@gmail.com
115
+ executables:
116
+ - subtle
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - .gitignore
121
+ - .rspec
122
+ - Gemfile
123
+ - Guardfile
124
+ - LICENSE.txt
125
+ - README.md
126
+ - Rakefile
127
+ - bin/subtle
128
+ - lib/subtle.rb
129
+ - lib/subtle/cli.rb
130
+ - lib/subtle/evaluator.rb
131
+ - lib/subtle/parser.rb
132
+ - lib/subtle/transform.rb
133
+ - lib/subtle/version.rb
134
+ - spec/examples/project_euler_spec.rb
135
+ - spec/spec_helper.rb
136
+ - spec/subtle/evaluator_spec.rb
137
+ - spec/subtle_spec.rb
138
+ - subtle.gemspec
139
+ homepage: https://github.com/utkarshkukreti/subtle-lang
140
+ licenses: []
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 1.8.24
160
+ signing_key:
161
+ specification_version: 3
162
+ summary: Subtle is a Terse, Array based Programming Language, heavily inspired by
163
+ the K Programming Language, and partly by APL and J.
164
+ test_files:
165
+ - spec/examples/project_euler_spec.rb
166
+ - spec/spec_helper.rb
167
+ - spec/subtle/evaluator_spec.rb
168
+ - spec/subtle_spec.rb
169
+ has_rdoc: