klam 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4771dd4730c8a1d51d856e142bd5cf4565623996
4
- data.tar.gz: 4d3745f65978183e00d3ad3f1682cec74f4b5efc
3
+ metadata.gz: c2e940a2764ea2672c7456f86bcac1607254edac
4
+ data.tar.gz: 3160eb40bd0f415fe39842345dcb21a0511a4a5d
5
5
  SHA512:
6
- metadata.gz: 951c7347c2c432a9f39bfd6ab8f24ee782b1a2b42e82e1dbd1c394a84d86300e99892cc0d4bae7400ae74ae77183ecb294d87f62b1605cbf66b32b2217250e08
7
- data.tar.gz: 4acc417beb7d6f3cec557493a5f92a88d29776689c444860a91922840ec2d91b1bd4b3336cd082808ed62b8cb37db15ae2ac8267156cf9ad80d318897b017bb9
6
+ metadata.gz: fb1f82664a88d71b4edcb4deeb4b59d7a4c60117b542881cbcc12d9135b6f871b906f923580f899a48c3f43cc5bf703c8a8cc58a21ab79106118687380c6861c
7
+ data.tar.gz: 9bf5e5d5e40188fc7dfd7a3de28557bfc64d579f46ede0cd9991300090b3fc1cbbff8b2939a9b9805576586544bfcb7770e02ea6fb17b9dab9662da31d9f14f7
data/HISTORY.asciidoc CHANGED
@@ -1,6 +1,13 @@
1
1
  Relase History
2
2
  ==============
3
3
 
4
+ v0.0.4 -- January 30, 2015
5
+ --------------------------
6
+ New Features
7
+ ~~~~~~~~~~~~
8
+ * `Klam::Cons` is now enumerable
9
+ * Added `rb-send-block` primitive
10
+
4
11
  v0.0.3 -- January 28, 2015
5
12
  --------------------------
6
13
  New Features
data/PROGRESS.asciidoc CHANGED
@@ -94,14 +94,7 @@ Ruby Interoperation
94
94
  * Invoking Kl functions from Ruby
95
95
  * Invoking Ruby methods from Kl
96
96
  ** Without blocks
97
+ ** With blocks
97
98
  * Dereferencing Ruby constances from Kl
98
99
  * Ruby \<\-> Kl converters
99
100
  ** Array \<\-> List
100
-
101
- Not Yet Implemented
102
- -------------------
103
-
104
- Ruby Interoperation
105
- ~~~~~~~~~~~~~~~~~~~
106
- * Invoking Ruby methods from Kl
107
- ** With blocks
data/lib/klam/cons.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Klam
2
2
  class Cons
3
+ include Enumerable
3
4
  attr_reader :hd, :tl
4
5
 
5
6
  def initialize(hd, tl)
@@ -14,5 +15,13 @@ module Klam
14
15
  def hash
15
16
  [@hd, @tl].hash
16
17
  end
18
+
19
+ def each
20
+ x = self
21
+ until x == Klam::Primitives::Lists::EMPTY_LIST
22
+ yield x.hd
23
+ x = x.tl
24
+ end
25
+ end
17
26
  end
18
27
  end
@@ -9,6 +9,20 @@ module Klam
9
9
  alias_method :"rb-send", :rb_send
10
10
  remove_method :rb_send
11
11
 
12
+ def rb_send_block(obj, method_name, blk_arity, blk, *args)
13
+ if blk.instance_of?(::Symbol)
14
+ # The caller won't take advantage of the currying, but we already
15
+ # are tracking the curried form. This also allows for paritial
16
+ # application of the named function, which could be interesting.
17
+ blk = @curried_methods[blk]
18
+ else
19
+ blk = ::Klam::Primitives::Interop.uncurry(blk, blk_arity)
20
+ end
21
+ obj.send(method_name, *args, &blk)
22
+ end
23
+ alias_method :"rb-send-block", :rb_send_block
24
+ remove_method :rb_send_block
25
+
12
26
  if RUBY_VERSION < '2.'
13
27
  def rb_const(name)
14
28
  parts = name.to_s.split('::')
@@ -25,6 +39,47 @@ module Klam
25
39
 
26
40
  alias_method :"rb-const", :rb_const
27
41
  remove_method :rb_const
42
+
43
+ class << self
44
+ def uncurry(blk, blk_arity)
45
+ case blk_arity
46
+ when 0
47
+ uncurry0(blk)
48
+ when 1
49
+ blk
50
+ when 2
51
+ uncurry2(blk)
52
+ when 3
53
+ uncurry2(blk)
54
+ when 4
55
+ uncurry2(blk)
56
+ when 5
57
+ uncurry2(blk)
58
+ else
59
+ ::Kernel.raise ::Klam::Error, "unsupported arity: #{blk_arity}"
60
+ end
61
+ end
62
+
63
+ def uncurry0(blk)
64
+ -> { blk.call(:NIL) }
65
+ end
66
+
67
+ def uncurry2(blk)
68
+ -> a, b { blk.call(a).call(b) }
69
+ end
70
+
71
+ def uncurry3(blk)
72
+ -> a, b, c { blk.call(a).call(b).call(c) }
73
+ end
74
+
75
+ def uncurry4(blk)
76
+ -> a, b, c, d { blk.call(a).call(b).call(c).call(d) }
77
+ end
78
+
79
+ def uncurry5(blk)
80
+ -> a, b, c, d, e { blk.call(a).call(b).call(c).call(d).call(e) }
81
+ end
82
+ end
28
83
  end
29
84
  end
30
85
  end
data/lib/klam/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Klam
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
@@ -7,6 +7,29 @@ describe 'extension: Ruby interop primitives', :type => :functional do
7
7
  end
8
8
  end
9
9
 
10
+ describe 'rb-send-block' do
11
+ it 'invokes a method on a Ruby object, passing the provided block' do
12
+ code = '(rb-send-block (cons 1 (cons 2 ())) map 1 (lambda X (* 2 X)))'
13
+ expect_kl(code).to eq([2, 4])
14
+ end
15
+
16
+ it 'supports blocks with arity greater than 1' do
17
+ eval_kl('(set vec (absvector 2))')
18
+ result = eval_kl <<-EOKL
19
+ (let V (absvector 2)
20
+ (do (rb-send-block (cons 1 (cons 2 ())) each_with_index 2
21
+ (lambda X (lambda Y (address-> V Y X))))
22
+ V))
23
+ EOKL
24
+ expect(result).to eq([1, 2])
25
+ end
26
+
27
+ it 'supports symbols as blocks' do
28
+ eval_kl('(set vec (absvector 2))')
29
+ expect_kl('(rb-send-block (cons 1 (cons 2())) map 1 str)').to eq(%w{1 2})
30
+ end
31
+ end
32
+
10
33
  describe 'rb-const' do
11
34
  it 'looks up the named constant in the Ruby environment' do
12
35
  expect_kl('(rb-const "::Math::PI")').to eq(Math::PI)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: klam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Spurrier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-28 00:00:00.000000000 Z
11
+ date: 2015-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake