mll 0.0.1 → 0.1.0

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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -15
  3. data/lib/mll.rb +57 -20
  4. data/mll.gemspec +2 -2
  5. data/spec/_spec.rb +132 -16
  6. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7adfea3942afe7d69c17c7eb21543b42e550b97b
4
- data.tar.gz: a435aa21974c01485aea5ade3ebd024cb101b0f0
3
+ metadata.gz: d8b4f658534716d142d0dedb616584ab5a016b71
4
+ data.tar.gz: 5253d8e36e96f2e4dba389268d64215a41b2befb
5
5
  SHA512:
6
- metadata.gz: c56f1539a27872154f60e742346852a5ee3d3fae77f330361b76dd7e289427c84ef569917cb8b8763a49c3f249fa0e886432c621d5ee008c4e2670fac45dea89
7
- data.tar.gz: 8d7bdb509af3a9206dfa2b31c5f1aa428b7763c26ac75f6d7e48536a14b52fab99c3cf511e8201443e8219a9dc2082a26be9089efedf63fad3c12c92fcedd312
6
+ metadata.gz: 34e4ede0875ae7a9e5500bf10f081f4cb5dcecf9b357bc39b420886a190480b0e0ee07b499be9bf59cbb93cdea70aeeba5cb3a6b946a00cce7d7077076b96ef9
7
+ data.tar.gz: fe4688d9b0b2bcba1383bd7f8f6cfb51ff69e96be8d55d970adbe84fab34f80cdbfd7ee86f4d3d39840b097aa37c40effbe3ebcb37e15eebcfdfab70d884fe38
data/README.md CHANGED
@@ -4,25 +4,21 @@
4
4
 
5
5
  ## Usage
6
6
 
7
- Планируется несколько способов использования этой библиотеки -- как доступ к ней через `MLL::`, так и манкипатчинг стандартных типов, таких как Numeric и Array.
7
+ ~~Планируется несколько способов использования этой библиотеки -- как доступ к ней через `MLL::`, так и манкипатчинг стандартных типов, таких как Numeric и Array.~~
8
8
 
9
9
  ### Examples:
10
10
 
11
- MLL::range(3).to_a #=> [1, 2, 3]
12
- MLL::range(range(3)).map(&:to_a) #=> [[1], [1, 2], [1, 2, 3]]
11
+ MLL::range(3).to_a #=> [1, 2, 3]
12
+ MLL::range(2, 3).to_a #=> [
13
+ #<Enumerator: 1..2:step(1)>,
14
+ #<Enumerator: 1..3:step(1)>,
15
+ ]
16
+ MLL::range(1..3) #=> [
17
+ #<Enumerator: 1..1:step(1)>,
18
+ #<Enumerator: 1..2:step(1)>,
19
+ #<Enumerator: 1..3:step(1)>
20
+ ]
13
21
 
14
22
  ## Installation
15
23
 
16
- Add this line to your application's Gemfile:
17
-
18
- ```ruby
19
- gem 'mll'
20
- ```
21
-
22
- And then execute:
23
-
24
- $ bundle
25
-
26
- Or install it yourself as:
27
-
28
24
  $ gem install mll
data/lib/mll.rb CHANGED
@@ -1,30 +1,67 @@
1
- # http://reference.wolfram.com/language/guide/LanguageOverview.html
2
1
  module MLL
3
2
 
4
- # http://reference.wolfram.com/language/guide/ListManipulation.html
5
-
6
- # http://reference.wolfram.com/language/guide/ConstructingLists.html
7
-
8
- # http://reference.wolfram.com/language/ref/Range.html
9
- def self.range *args
10
- # see also http://ruby-doc.org/core-1.9.3/Range.html#method-i-step
11
- raise ArgumentError.new("wrong number of arguments (#{args.size} for 1..3)") unless (1..3).include? args.size
12
- if args.size == 1
13
- if args[0].respond_to?(:map)
14
- args[0].map &method(:range)
3
+ def self.define_function_that_can_enumerate name, &block
4
+ # http://stackoverflow.com/a/12792313/322020
5
+ (class << self; self end).class_eval do
6
+ define_method name do |*args|
7
+ if args.size == 1 && args.first.respond_to?(:map)
8
+ args.first.map &method(name)
15
9
  else
16
- range 1, args[0]
10
+ block.call *args
17
11
  end
18
- else
19
- Range.new(args[0], args[1]).step(args[2] || 1)
20
12
  end
21
13
  end
14
+ end
15
+
16
+ define_function_that_can_enumerate :range do |*args|
17
+ raise ArgumentError.new("wrong number of arguments (#{args.size} for 1..3)") unless (1..3).include? args.size
18
+ next range 1, args[0] if args.size == 1
19
+ Range.new(args[0], args[1]).step(args[2] || 1)
20
+ end
21
+
22
+ end
23
+
22
24
 
23
- # http://reference.wolfram.com/language/guide/ElementsOfLists.html
24
- # http://reference.wolfram.com/language/guide/RearrangingAndRestructuringLists.html
25
- # http://reference.wolfram.com/language/guide/ApplyingFunctionsToLists.html
26
- # http://reference.wolfram.com/language/guide/MathematicalAndCountingOperationsOnLists.html
25
+ =begin
27
26
 
28
- # http://reference.wolfram.com/language/guide/FunctionalProgramming.html
27
+ # http://reference.wolfram.com/language/guide/HandlingArraysOfData.html
28
+ # http://reference.wolfram.com/language/guide/ComputationWithStructuredDatasets.html
29
29
 
30
+ module Enumerable
31
+ STDERR.puts "WARNING: #{name}#range was already defined" if method_defined? "range"
32
+ def range
33
+ # if self.respond_to? :each
34
+ if self.first.respond_to? :each
35
+ raise ArgumentError.new("if the first #range parameter responds to :each, it should be the only argument") \
36
+ if self.size > 1
37
+ self.first.zip.map &:range
38
+ else
39
+ case self.size
40
+ when 1 ; [1,self.first].range
41
+ when 2 ; Range.new(*self.take(2)).step(1) # to convert Rage into Enumerator
42
+ when 3 ; Range.new(*self.take(2)).step(self.drop(2).first)
43
+ when 4 ; raise ArgumentError.new("wrong number of arguments (#{self.size} for 1..3)")
44
+ end
45
+ end
46
+ # else
47
+ # [1, self].range
48
+ # end
49
+ end
30
50
  end
51
+
52
+ class Fixnum
53
+ STDERR.puts "WARNING: #{name}#range was already defined" if method_defined? "range"
54
+ def range
55
+ # if self.respond_to? :each
56
+ # if self.first.respond_to? :each
57
+ # self.map &:range
58
+ # else
59
+ # Range.new(*self[0,2]).step(self[2] || 1)
60
+ # end
61
+ # else
62
+ [self].range
63
+ # end
64
+ end
65
+ end
66
+
67
+ =end
@@ -1,11 +1,11 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "mll"
3
- spec.version = "0.0.1"
3
+ spec.version = "0.1.0"
4
4
  spec.authors = ["Victor Maslov"]
5
5
  spec.email = ["nakilon@gmail.com"]
6
6
  spec.summary = "Mathematica Language Library in Ruby"
7
7
  spec.description = ""
8
- # spec.homepage = ""
8
+ spec.homepage = "https://github.com/Nakilon/mll"
9
9
  spec.license = "MIT"
10
10
 
11
11
  spec.files = `git ls-files -z`.split("\x0")
@@ -1,26 +1,142 @@
1
1
  require_relative File.join "..", "lib", "mll"
2
2
 
3
- describe "mll" do
4
3
 
5
- describe "range" do
4
+ # http://reference.wolfram.com/language/guide/LanguageOverview.html
5
+ describe MLL do
6
+
7
+ # http://reference.wolfram.com/language/guide/ListManipulation.html
8
+ describe "List Manipulation" do
9
+
10
+ # http://reference.wolfram.com/language/guide/ConstructingLists.html
11
+ describe "Constructing Lists" do
12
+
13
+ # http://reference.wolfram.com/language/ref/Range.html
14
+ describe "range" do
15
+
16
+ example "range( >3 args )" do
17
+ expect{ MLL::range(1,2,3,4) }.to raise_error ArgumentError
18
+ end
19
+
20
+ describe "Basic Examples" do
21
+
22
+ example "range(n)" do
23
+ expect(MLL::range(4)).to be_a Enumerator
24
+ expect(MLL::range(4).to_a).to eq [1,2,3,4]
25
+ end
26
+ example "range(imin, imax)" do
27
+ expect(MLL::range(2,5)).to be_a Enumerator
28
+ expect(MLL::range(2,5).to_a).to eq [2,3,4,5]
29
+ end
30
+ example "range(imin, imax, id)" do
31
+ expect(MLL::range(1,2,3)).to be_a Enumerator
32
+ expect(MLL::range(1,2,0.5).to_a).to eq [1,1.5,2]
33
+ expect(MLL::range(2,6,2).to_a).to eq [2,4,6]
34
+ expect(MLL::range(-4,9,3).to_a).to eq [-4,-1,2,5,8]
35
+ end
36
+ # example "range(imin, imax, id)" do
37
+ # expect(MLL::range(2,5,2)).to be_a Enumerator
38
+ # expect(MLL::range(2,5,2).to_a).to eq [2,4]
39
+ # expect(MLL::range(2,6,2).to_a).to eq [2,4,6]
40
+ # end
41
+ end
42
+
43
+ describe "Generalizations & Extensions" do
44
+
45
+ example "range([n1, n2, n3, n4])" do
46
+ # expect(MLL::range([2,3])).to be_a Enumerator # TODO revive me
47
+ MLL::range([5,2,6,3]).each do |i|
48
+ expect(i).to be_a Enumerator
49
+ end
50
+ expect(MLL::range([5,2,6,3]).map(&:to_a)).to eq [[1,2,3,4,5],[1,2],[1,2,3,4,5,6],[1,2,3]]
51
+ end
52
+
53
+ end
54
+
55
+ describe "Applications" do
56
+
57
+ example "power(2, range(5))" do
58
+ pending "#power is yet to be implemented"
59
+ p power(2, range(5))
60
+ expect(power(2, range(5))).to eq [2,4,8,16,32]
61
+ end
62
+
63
+ end
64
+
65
+ describe "Neat Examples" do
66
+
67
+ example "range(1..3)" do
68
+ # expect(MLL::range(MLL::range(3))).to be_a Enumerator # TODO revive me
69
+ MLL::range(MLL::range(3)).each do |i|
70
+ expect(i).to be_a Enumerator
71
+ end
72
+ expect(MLL::range(1..3).map(&:to_a)).to eq [[1],[1,2],[1,2,3]]
73
+ end
74
+ example "range(range(range(n)))" do
75
+ # expect(MLL::range(MLL::range(3))).to be_a Enumerator # TODO revive me
76
+ # MLL::range(MLL::range(MLL::range(3))).each do |i|
77
+ # expect(i).to be_a Enumerator
78
+ # end
79
+ expect(MLL::range(MLL::range(MLL::range(3))).map{ |i| i.map(&:to_a) }).to eq [[[1]],[[1],[1,2]],[[1],[1,2],[1,2,3]]]
80
+ end
81
+
82
+ # TODO Nest[Range,3,6]
83
+
84
+ end
85
+
86
+ # TODO "Find an inverse permutation:"
87
+ # TODO "Use Range or Span (;;) as Part specification:"
88
+
89
+ end
6
90
 
7
- example "range(n)" do
8
- expect(MLL::range(5).to_a).to eq [1,2,3,4,5]
9
- end
10
- example "range(imin, imax)" do
11
- expect(MLL::range(2,5).to_a).to eq [2,3,4,5]
12
- end
13
- example "range(imin, imax, id)" do
14
- expect(MLL::range(2,5,2).to_a).to eq [2,4]
15
- expect(MLL::range(2,6,2).to_a).to eq [2,4,6]
16
- end
17
- example "range([n1,n2])" do
18
- expect(MLL::range([2,3]).map(&:to_a)).to eq [[1,2],[1,2,3]]
19
91
  end
20
- example "range(range(n))" do
21
- expect(MLL::range(MLL::range(3)).map(&:to_a)).to eq [[1],[1,2],[1,2,3]]
92
+
93
+ # http://reference.wolfram.com/language/guide/ElementsOfLists.html
94
+ # http://reference.wolfram.com/language/guide/RearrangingAndRestructuringLists.html
95
+ # http://reference.wolfram.com/language/guide/ApplyingFunctionsToLists.html
96
+ # http://reference.wolfram.com/language/guide/MathematicalAndCountingOperationsOnLists.html
97
+
98
+ end
99
+
100
+ # http://reference.wolfram.com/language/guide/FunctionalProgramming.html
101
+
102
+ end
103
+
104
+
105
+ =begin
106
+
107
+ describe "range" do
108
+
109
+ example "n.range" do
110
+ expect(5.range).to be_a Enumerator
111
+ expect(5.range.to_a).to eq [1,2,3,4,5]
112
+ end
113
+
114
+ example "[imin, imax].range" do
115
+ expect([2,5].range).to be_a Enumerator
116
+ expect([2,5].range.to_a).to eq [2,3,4,5]
117
+ end
118
+ example "[imin, imax, id].range" do
119
+ expect([2,5,2].range).to be_a Enumerator
120
+ expect([2,5,2].range.to_a).to eq [2,4]
121
+ expect([2,6,2].range.to_a).to eq [2,4,6]
122
+ end
123
+ example "[[n1,n2]].range" do
124
+ # expect([[2,3]].range).to be_a Enumerator # TODO revive me
125
+ [[2,3]].range.each do |i|
126
+ expect(i).to be_a Enumerator
22
127
  end
128
+ # expect([[2,3]].range.map(&:to_a)).to eq [[1,2],[1,2,3]]
129
+ expect([[2,3]].range.map(&:to_a)).to eq [[1,2],[1,2,3]]
130
+ end
23
131
 
132
+ # using methods instead of functions helps us with method_missing but forces to add []
133
+ example "n.range.range" do
134
+ # expect([3.range].range).to be_a Enumerator # TODO revive me
135
+ expect([3.range].range.map(&:to_a)).to eq [[1],[1,2],[1,2,3]]
24
136
  end
25
137
 
138
+ # TODO 4 args should fail
139
+
26
140
  end
141
+
142
+ =end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mll
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-04 00:00:00.000000000 Z
11
+ date: 2015-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,7 +52,7 @@ files:
52
52
  - lib/mll.rb
53
53
  - mll.gemspec
54
54
  - spec/_spec.rb
55
- homepage:
55
+ homepage: https://github.com/Nakilon/mll
56
56
  licenses:
57
57
  - MIT
58
58
  metadata: {}