rambda 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,27 @@
1
+ Rambda
2
+ ================================================================================
3
+
4
+ Examples
5
+ --------------------------------------------------------------------------------
6
+
7
+ .. code:: ruby
8
+
9
+ require 'rambda'
10
+ include Rambda::Mixin
11
+
12
+ f = λ.x.y{x}
13
+ f.(1, 2) # => 1
14
+ f.(1).(2) # => 1
15
+
16
+ inc = λ{literal(1).+}
17
+ inc.(42) # => 43
18
+
19
+ hello = λ{print "hello "}
20
+ hello.("world") # => hello world
21
+
22
+ Installation
23
+ --------------------------------------------------------------------------------
24
+
25
+ .. code:: sh
26
+
27
+ gem install rambda
@@ -0,0 +1,9 @@
1
+ module Rambda
2
+
3
+ require 'rambda/itself'
4
+ require 'rambda/message'
5
+ require 'rambda/body'
6
+ require 'rambda/rambda'
7
+ require 'rambda/params'
8
+ require 'rambda/mixin'
9
+ end
@@ -0,0 +1,38 @@
1
+ require 'rambda/itself'
2
+ require 'rambda/message'
3
+
4
+ module Rambda
5
+
6
+ class Body < BasicObject
7
+
8
+ private *instance_methods
9
+ private
10
+
11
+ def initialize(receiver, params, args)
12
+ @receiver = receiver
13
+ @params = params
14
+ @args = args
15
+ end
16
+
17
+ def method_missing(name, *args, &block)
18
+ case name
19
+ when *@params
20
+ if args.empty? and block.nil?
21
+ Itself.new(@args[@params.index(name)])
22
+ else
23
+ Message.new(@args[@params.index(name)], :call, *args, &block)
24
+ end
25
+ else
26
+ Message.new(@receiver, name, *args, &block)
27
+ end
28
+ end
29
+
30
+ def literal(val)
31
+ Itself.new(val)
32
+ end
33
+
34
+ def to_proc
35
+ ->(*args, &block) { instance_exec(*args, &block) }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ require 'rambda/message'
2
+
3
+ module Rambda
4
+
5
+ class Itself < BasicObject
6
+ protected *instance_methods
7
+ protected
8
+
9
+ def initialize(receiver)
10
+ @receiver = receiver
11
+ end
12
+
13
+ def method_missing(name, *args, &block)
14
+ Message.new(@receiver, name, *args, &block)
15
+ end
16
+
17
+ def to_proc
18
+ -> { @receiver }
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ module Rambda
2
+
3
+ class Message < BasicObject
4
+ protected *instance_methods
5
+ protected
6
+
7
+ def initialize(receiver, name, *args, &block)
8
+ @receiver = receiver
9
+ @name = name
10
+ @args = args
11
+ @block = block
12
+ end
13
+
14
+ def method_missing(name, *args, &block)
15
+ Message.new(self, name, *args, &block)
16
+ end
17
+
18
+ def to_proc
19
+ case @receiver
20
+ when Message
21
+ r = ::Object.send(:lambda, &@receiver).()
22
+ else
23
+ r = @receiver
24
+ end
25
+
26
+ ->(*args) { r.send(@name, *@args, *args, &@block) }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'rambda'
3
+
4
+ module Rambda
5
+
6
+ module Mixin
7
+
8
+ def rambda(&block)
9
+ if block_given?
10
+ Rambda.new(self, [], [], block).()
11
+ else
12
+ Params.new(self, [])
13
+ end
14
+ end
15
+
16
+ alias λ rambda
17
+ end
18
+ end
19
+
@@ -0,0 +1,23 @@
1
+ require 'rambda/rambda'
2
+
3
+ module Rambda
4
+
5
+ class Params < BasicObject
6
+
7
+ protected *instance_methods
8
+ protected
9
+
10
+ def initialize(receiver, params)
11
+ @receiver = receiver
12
+ @params = params
13
+ end
14
+
15
+ def method_missing(param, &block)
16
+ if block
17
+ Rambda.new(@receiver, [*@params, param], [], block)
18
+ else
19
+ Params.new(@receiver, [*@params, param])
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ require 'rambda/itself'
2
+ require 'rambda/message'
3
+ require 'rambda/body'
4
+
5
+ module Rambda
6
+
7
+ class Rambda
8
+
9
+ def initialize(receiver, params, args, block)
10
+ @receiver = receiver
11
+ @params = params
12
+ @args = args
13
+ @block = block
14
+ end
15
+
16
+ def call(*args, &block)
17
+ args << block if block
18
+
19
+ if @params.size > (@args + args).size
20
+ Rambda.new(@receiver, @params, (@args + args), @block)
21
+ else
22
+ r = lambda(&Body.new(@receiver, @params, (@args + args))).(&@block)
23
+ case r
24
+ when Itself
25
+ lambda(&r).()
26
+ when Message
27
+ lambda(&r)
28
+ else
29
+ r
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ version = File.read("VERSION").chomp
2
+ Gem::Specification.new do |s|
3
+ s.name = "rambda"
4
+ s.version = version
5
+ s.authors = ["pasberth"]
6
+ s.description = %{A lambda DSL, supports auto currying}
7
+ s.summary = %q{experimental release}
8
+ s.email = "pasberth@gmail.com"
9
+ s.homepage = "https://github.com/pasberth/rambda"
10
+ s.require_paths = ["lib"]
11
+ s.files = `git ls-files`.split("\n")
12
+ s.test_files = `git ls-files -- spec/*`.split("\n")
13
+ s.add_development_dependency "rspec"
14
+ end
@@ -0,0 +1,51 @@
1
+ require 'rambda'
2
+
3
+ describe "#rambda" do
4
+
5
+ include Rambda::Mixin
6
+
7
+ example do
8
+ t = rambda.x.y{x}
9
+ t.(1,2).should == 1
10
+ end
11
+
12
+ example do
13
+ f = rambda.x.y{y}
14
+ f.(1,2).should == 2
15
+ end
16
+
17
+ example do
18
+ inc = rambda{literal(1).+}
19
+ inc.(42).should == 43
20
+ end
21
+
22
+ example do
23
+ crr = rambda.x{x.+}
24
+ crr.("foo").("bar").should == "foobar"
25
+ end
26
+
27
+ example do
28
+ crr = rambda{is_a?}
29
+ crr.(self.class).should be_true
30
+ end
31
+
32
+ example do
33
+ crr = rambda{send(:is_a?)}
34
+ crr.(self.class).should be_true
35
+ end
36
+
37
+ example do
38
+ crr = rambda{self.equal?}
39
+ crr.(self).should be_true
40
+ end
41
+
42
+ pending do
43
+ cons = rambda.a.b.f{f(a, b)}
44
+ car = rambda.x.y{x}
45
+ cdr = rambda.x.y{y}
46
+ l = cons.(1, cons.(2,3))
47
+ l.(car).().should == 1
48
+ l.(cdr).(car).().should == 2
49
+ l.(cdr).(cdr).().should == 3
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rambda
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - pasberth
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
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
+ description: A lambda DSL, supports auto currying
31
+ email: pasberth@gmail.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - README.rst
37
+ - lib/rambda.rb
38
+ - lib/rambda/body.rb
39
+ - lib/rambda/itself.rb
40
+ - lib/rambda/message.rb
41
+ - lib/rambda/mixin.rb
42
+ - lib/rambda/params.rb
43
+ - lib/rambda/rambda.rb
44
+ - rambda.gemspec
45
+ - spec/rambda_spec.rb
46
+ homepage: https://github.com/pasberth/rambda
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 1.8.24
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: experimental release
70
+ test_files:
71
+ - spec/rambda_spec.rb
72
+ has_rdoc: