pyper 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +129 -0
- data/Rakefile +2 -0
- data/lib/pyper.rb +1131 -0
- data/lib/pyper/version.rb +3 -0
- data/pyper.gemspec +25 -0
- data/test/pyper_test.rb +109 -0
- metadata +75 -0
data/pyper.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/pyper/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["boris"]
|
6
|
+
gem.email = ["\"boris@iis.sinica.edu.tw\""]
|
7
|
+
gem.description = %q{Ruby extension of Lispy #car/#cdr methods.}
|
8
|
+
gem.summary = %q{Methods car, cdr, caar, cadr, cdar, caaar, caadr, ... are well known from Lisp.
|
9
|
+
Here, 'a' means first element of a collection, 'd' means rest of the collection. Now, imagine that there
|
10
|
+
would also be 'b' and 'c', meaning 2nd and 3rd element, 'e', 'f', meaning rest minus first 2, resp. first
|
11
|
+
3 elements. Imagine that instead of starting 'c' and ending 'r', Greek letter τ would be used: τaτ, τdτ, ...
|
12
|
+
to distinguish Pyper methods in the namespace. Imagine more more letters for more methods, imagine that
|
13
|
+
these methods can have arity higher than 0, imagine double-barrel pipeline instead of just single-barrel,
|
14
|
+
and you are getting to the spirit of Pyper (and APL).}
|
15
|
+
gem.homepage = ""
|
16
|
+
|
17
|
+
gem.files = `git ls-files`.split($\)
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
|
+
gem.name = "pyper"
|
21
|
+
gem.require_paths = ["lib"]
|
22
|
+
gem.version = Pyper::VERSION
|
23
|
+
|
24
|
+
gem.add_development_dependency "shoulda"
|
25
|
+
end
|
data/test/pyper_test.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
#! /usr/bin/ruby
|
2
|
+
#encoding: utf-8
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'shoulda'
|
6
|
+
# require_relative './../lib/pyper'
|
7
|
+
require 'pyper'
|
8
|
+
|
9
|
+
include Pyper
|
10
|
+
|
11
|
+
class YPiperTest < ::Test::Unit::TestCase
|
12
|
+
should "define basic methods" do
|
13
|
+
|
14
|
+
assert_equal 1, [1, 2, 3].car
|
15
|
+
assert_equal [2, 3], [1, 2, 3].cdr
|
16
|
+
assert_equal :a, {a: 1}.caar
|
17
|
+
assert_equal [1], {a: 1}.cdar
|
18
|
+
assert_equal [:b, 2], {a: 1, b: 2}.cadr
|
19
|
+
assert_equal [[:c, 3]], {a: 1, b: 2, c: 3}.cddr
|
20
|
+
assert_equal 1, [1, 2].τaτ
|
21
|
+
assert_equal 2, [*(1..10)].τbτ
|
22
|
+
assert_equal 3, [*(1..10)].τcτ
|
23
|
+
assert_equal [*(2..10)], [*(1..10)].τdτ
|
24
|
+
assert_equal [*(3..10)], [*(1..10)].τeτ
|
25
|
+
assert_equal [*(4..10)], [*(1..10)].τfτ
|
26
|
+
|
27
|
+
assert_equal [:a, :b, :c], [[:a, 1], [:b, 2], [:c, 3]].τmaτ
|
28
|
+
assert_equal ["a", "b", "c"], [[:a, 1], [:b, 2], [:c, 3]].τmaςτ
|
29
|
+
|
30
|
+
assert_equal [*(1..7)], [*(1..10)].τuτ
|
31
|
+
assert_equal [*(1..8)], [*(1..10)].τvτ
|
32
|
+
assert_equal [*(1..9)], [*(1..10)].τwτ
|
33
|
+
assert_equal 8, [*(1..10)].τxτ
|
34
|
+
assert_equal 9, [*(1..10)].τyτ
|
35
|
+
assert_equal 10, [*(1..10)].τzτ
|
36
|
+
|
37
|
+
|
38
|
+
assert_equal 7, 7.τCτ
|
39
|
+
assert_equal 7, 7.τχτ( 8 )
|
40
|
+
assert_equal 8, [7, 8].χCτ
|
41
|
+
assert_equal 8, 7.τ«τ( 8 )
|
42
|
+
|
43
|
+
assert_equal [0, 1, 6, 9], [:x.τ∅₀τ, 0.τ∅₁τ, Object.new.τ∅₆τ, "a".τ∅₉τ]
|
44
|
+
|
45
|
+
assert_equal [:hello], :hello.τAτ
|
46
|
+
assert_equal [[:a, 1], [:b, 2]], ( {a: 1, b: 2}.τAτ )
|
47
|
+
assert_equal [1, 2], [1, 2].τAτ
|
48
|
+
|
49
|
+
assert_equal 1, "+1.000000".τ›iτ
|
50
|
+
assert_equal "hello", [:h, ?e, :l, :l, :o].τjτ
|
51
|
+
|
52
|
+
assert_equal "la", :la.τςτ
|
53
|
+
|
54
|
+
assert_equal :hello, "hello".τßτ
|
55
|
+
|
56
|
+
assert_equal [[1, 2]], [1, 2].τ›Aτ
|
57
|
+
|
58
|
+
assert_equal [1], [*(1..10)].τ0τ
|
59
|
+
assert_equal [1, 2], [*(1..10)].τ1τ
|
60
|
+
assert_equal [1, 2, 3], [*(1..10)].τ2τ
|
61
|
+
assert_equal [1, 2, 3, 4], [*(1..10)].τ3τ
|
62
|
+
assert_equal [1, 2, 3, 4, 5], [*(1..10)].τ4τ
|
63
|
+
assert_equal [6, 7, 8, 9, 10], [*(1..10)].τ5τ
|
64
|
+
assert_equal [7, 8, 9, 10], [*(1..10)].τ6τ
|
65
|
+
assert_equal [8, 9, 10], [*(1..10)].τ7τ
|
66
|
+
assert_equal [9, 10], [*(1..10)].τ8τ
|
67
|
+
assert_equal [10], [*(1..10)].τ9τ
|
68
|
+
|
69
|
+
assert_equal "lligator", ["See", "you", "later", "alligator"].τdeadτ
|
70
|
+
assert_equal ?g, ["See", "you", "later", "alligator"].τdeafbτ
|
71
|
+
|
72
|
+
assert_equal 7, 4.τ₊τ( 3 )
|
73
|
+
assert_equal 15, 3.τ★τ( 5 )
|
74
|
+
assert_equal 2, 17.τ﹪τ( 5 )
|
75
|
+
assert_equal 17 / 5, 17.τ÷τ( 5 )
|
76
|
+
assert_equal true, 7.τᴇτ( 7 )
|
77
|
+
assert_equal [true, false, false], [-1, 0, 1].τm﹤τ( 0, 0, 0 )
|
78
|
+
assert_equal [false, false, true], [-1, 0, 1].τm﹥τ( 0, 0, 0 )
|
79
|
+
assert_equal [true, true, false], [-1, 0, 1].τm≤τ( 0, 0, 0 )
|
80
|
+
assert_equal [false, true, true], [-1, 0, 1].τm≥τ( 0, 0, 0 )
|
81
|
+
assert_equal [5, 10, 15], (1..3).τm★τ( 5 )
|
82
|
+
assert_equal [1, 4, 9], [*(1..3)].τ»Dσm★τ
|
83
|
+
assert_equal [1, 4, 9], (1..3).τm﹡﹡τ( 2 )
|
84
|
+
assert_equal [1, 4, 9], (1..3).τM★τ
|
85
|
+
assert_equal [?a, nil, ?a, nil], (1..4).τm﹪ᴇτ( 2, 1 ).τm⁇τ( ?a, nil )
|
86
|
+
assert_equal ["a", nil, "a", nil], (1..4).τm﹪ᴇ⁇τ( 2, 1, ?a, nil )
|
87
|
+
assert_equal [nil, "b", "b", nil], nil.τ«mᴇ⁇τ( [0, 1, 1, 0], 1, ?b, nil )
|
88
|
+
assert_equal [["a", nil], [nil, "b"], ["a", "b"], [nil, nil]],
|
89
|
+
(1..4).τm﹪ᴇ⁇χ( 2, 1, ?a, nil ).π«mᴇ⁇π( [0, 1, 1, 0], 1, ?b, nil ).χγZτ
|
90
|
+
assert_equal true, [:a, :b, :c].τ¿iτ( :b )
|
91
|
+
assert_equal( [[:c], [:a]], [[:b, :c, :d], [:a, :b, :d]].
|
92
|
+
χ»βm«ε¿i‹﹗ε⁈﹕n_●χm«ε¿i‹﹗ε⁈﹕n_●π )
|
93
|
+
assert_equal( "d yada yada, a, c blah blah",
|
94
|
+
"%s yada yada, %s blah blah" %
|
95
|
+
[[:d], [:a, :c]].χJχJπ( ", " ) )
|
96
|
+
assert_equal "fizzbuzz", (1..100).τm﹪ᴇ⁇χ( 3, 0, "fizz", nil ).πm﹪ᴇ⁇χ( 5, 0, "buzz", nil ).πZmjτ[14]
|
97
|
+
assert_equal ["ax", "bx"], ["a", "b"].τmτ { |o| o + "x" }
|
98
|
+
assert_equal ["ax", "bx"], ["a", "b"].τBmτ { |o| o + "x" }
|
99
|
+
assert_equal [-1, -2], [[1, 1], [2, 3]].πM₋τ
|
100
|
+
assert_equal [1, 2], [[1, 1], [2, 3]].πW₋τ
|
101
|
+
a, b = [Object.new, Object.new].each { |o| o.define_singleton_method :xxx do "xxx" end }
|
102
|
+
hsh = { a => "xxx", b => "xxx" }
|
103
|
+
assert_equal hsh, [a, b].τBmχHτ( &:xxx )
|
104
|
+
assert_equal [:x], 'x'.τABmτ( &:to_sym )
|
105
|
+
assert_equal ['x'], ['x'].τmß_mςτ
|
106
|
+
assert_equal [[['y']]], [[[:y]]].τmmmςτ
|
107
|
+
assert_equal [[:x, :y], [:v, :w]], [[?x, ?y], [?v, ?w]].τmmßτ
|
108
|
+
end
|
109
|
+
end # class
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pyper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- boris
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: shoulda
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: 'Ruby extension of Lispy #car/#cdr methods.'
|
28
|
+
email:
|
29
|
+
- '"boris@iis.sinica.edu.tw"'
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- Gemfile
|
36
|
+
- LICENSE
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- lib/pyper.rb
|
40
|
+
- lib/pyper/version.rb
|
41
|
+
- pyper.gemspec
|
42
|
+
- test/pyper_test.rb
|
43
|
+
homepage: ''
|
44
|
+
licenses: []
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.0.0
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: 'Methods car, cdr, caar, cadr, cdar, caaar, caadr, ... are well known from
|
66
|
+
Lisp. Here, ''a'' means first element of a collection, ''d'' means rest of the collection.
|
67
|
+
Now, imagine that there would also be ''b'' and ''c'', meaning 2nd and 3rd element,
|
68
|
+
''e'', ''f'', meaning rest minus first 2, resp. first 3 elements. Imagine that instead
|
69
|
+
of starting ''c'' and ending ''r'', Greek letter τ would be used: τaτ, τdτ, ...
|
70
|
+
to distinguish Pyper methods in the namespace. Imagine more more letters for more
|
71
|
+
methods, imagine that these methods can have arity higher than 0, imagine double-barrel
|
72
|
+
pipeline instead of just single-barrel, and you are getting to the spirit of Pyper
|
73
|
+
(and APL).'
|
74
|
+
test_files:
|
75
|
+
- test/pyper_test.rb
|