subtle-lang 0.0.1

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.
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: