klam 0.0.2 → 0.0.3
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.
- checksums.yaml +7 -0
- data/HISTORY.asciidoc +18 -0
- data/PROGRESS.asciidoc +5 -3
- data/lib/klam/compilation_stages/convert_partial_applications_to_lambdas.rb +1 -1
- data/lib/klam/compilation_stages/emit_ruby.rb +3 -3
- data/lib/klam/compiler.rb +13 -0
- data/lib/klam/environment.rb +3 -0
- data/lib/klam/primitives/generic_functions.rb +1 -2
- data/lib/klam/primitives/interop.rb +30 -0
- data/lib/klam/version.rb +1 -1
- data/spec/functional/extensions/interop_spec.rb +15 -0
- metadata +30 -36
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4771dd4730c8a1d51d856e142bd5cf4565623996
|
4
|
+
data.tar.gz: 4d3745f65978183e00d3ad3f1682cec74f4b5efc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 951c7347c2c432a9f39bfd6ab8f24ee782b1a2b42e82e1dbd1c394a84d86300e99892cc0d4bae7400ae74ae77183ecb294d87f62b1605cbf66b32b2217250e08
|
7
|
+
data.tar.gz: 4acc417beb7d6f3cec557493a5f92a88d29776689c444860a91922840ec2d91b1bd4b3336cd082808ed62b8cb37db15ae2ac8267156cf9ad80d318897b017bb9
|
data/HISTORY.asciidoc
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Relase History
|
2
|
+
==============
|
3
|
+
|
4
|
+
v0.0.3 -- January 28, 2015
|
5
|
+
--------------------------
|
6
|
+
New Features
|
7
|
+
~~~~~~~~~~~~
|
8
|
+
* Added `rb-const` and `rb-send` primitives
|
9
|
+
|
10
|
+
v0.0.2 -- January 7, 2015
|
11
|
+
-------------------------
|
12
|
+
Bug Fixes
|
13
|
+
~~~~~~~~~
|
14
|
+
* Added bounds checking for absvectors
|
15
|
+
|
16
|
+
v0.0.1 -- January 3, 2015
|
17
|
+
-------------------------
|
18
|
+
Initial Release
|
data/PROGRESS.asciidoc
CHANGED
@@ -92,6 +92,9 @@ Primitive Functions of Kl]:
|
|
92
92
|
Ruby Interoperation
|
93
93
|
~~~~~~~~~~~~~~~~~~~
|
94
94
|
* Invoking Kl functions from Ruby
|
95
|
+
* Invoking Ruby methods from Kl
|
96
|
+
** Without blocks
|
97
|
+
* Dereferencing Ruby constances from Kl
|
95
98
|
* Ruby \<\-> Kl converters
|
96
99
|
** Array \<\-> List
|
97
100
|
|
@@ -100,6 +103,5 @@ Not Yet Implemented
|
|
100
103
|
|
101
104
|
Ruby Interoperation
|
102
105
|
~~~~~~~~~~~~~~~~~~~
|
103
|
-
* Invoking Ruby
|
104
|
-
|
105
|
-
** Array \<\-> Absvector
|
106
|
+
* Invoking Ruby methods from Kl
|
107
|
+
** With blocks
|
@@ -101,9 +101,9 @@ module Klam
|
|
101
101
|
rands_rb = rands.map { |rand| emit_ruby(rand) }
|
102
102
|
|
103
103
|
if rator.kind_of?(Symbol)
|
104
|
-
# Application of a function defined in the environment. At this
|
105
|
-
# partial application and currying
|
106
|
-
# simple send suffices.
|
104
|
+
# Application of a function defined in the environment. At this
|
105
|
+
# point partial application and currying have been taken care of,
|
106
|
+
# so a simple send suffices.
|
107
107
|
render_string('__send__($1)', [rator_rb] + rands_rb)
|
108
108
|
else
|
109
109
|
render_string('__apply($1)', [rator_rb] + rands_rb)
|
data/lib/klam/compiler.rb
CHANGED
@@ -22,6 +22,7 @@ module Klam
|
|
22
22
|
def initialize(environment)
|
23
23
|
@environment = environment
|
24
24
|
@generator = Klam::VariableGenerator.new
|
25
|
+
@ruby_interop_syntax_enabled = false
|
25
26
|
end
|
26
27
|
|
27
28
|
def compile(kl)
|
@@ -41,6 +42,18 @@ module Klam
|
|
41
42
|
apply_stages(stages, kl)
|
42
43
|
end
|
43
44
|
|
45
|
+
def enable_ruby_interop_syntax!
|
46
|
+
@ruby_interop_syntax_enabled = true
|
47
|
+
end
|
48
|
+
|
49
|
+
def disable_ruby_interop_syntax!
|
50
|
+
@ruby_interop_syntax_enabled = false
|
51
|
+
end
|
52
|
+
|
53
|
+
def ruby_interop_syntax_enabled?
|
54
|
+
@ruby_interop_syntax_enabled
|
55
|
+
end
|
56
|
+
|
44
57
|
private
|
45
58
|
|
46
59
|
def apply_stages(stages, kl)
|
data/lib/klam/environment.rb
CHANGED
@@ -11,6 +11,7 @@ module Klam
|
|
11
11
|
include ::Klam::Primitives::Streams
|
12
12
|
include ::Klam::Primitives::Time
|
13
13
|
include ::Klam::Primitives::Arithmetic
|
14
|
+
include ::Klam::Primitives::Interop
|
14
15
|
|
15
16
|
def initialize
|
16
17
|
# The global assignments namespace. Errors are thrown here in the
|
@@ -29,6 +30,8 @@ module Klam
|
|
29
30
|
# methods.
|
30
31
|
@eigenclass = class << self; self; end
|
31
32
|
|
33
|
+
@compiler = ::Klam::Compiler.new(self)
|
34
|
+
|
32
35
|
# The open primitive depends on having *home-directory* assigned.
|
33
36
|
set(:"*home-directory*", ::Dir.pwd)
|
34
37
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Klam
|
2
|
+
module Primitives
|
3
|
+
# Primitives for interoperation with the host Ruby environment.
|
4
|
+
# These are not official KLambda primitives.
|
5
|
+
module Interop
|
6
|
+
def rb_send(obj, method_name, *args)
|
7
|
+
obj.send(method_name, *args)
|
8
|
+
end
|
9
|
+
alias_method :"rb-send", :rb_send
|
10
|
+
remove_method :rb_send
|
11
|
+
|
12
|
+
if RUBY_VERSION < '2.'
|
13
|
+
def rb_const(name)
|
14
|
+
parts = name.to_s.split('::')
|
15
|
+
parts.shift if parts.first.empty?
|
16
|
+
parts.reduce(::Module) do |m, x|
|
17
|
+
m.const_get(x)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
else
|
21
|
+
def rb_const(name)
|
22
|
+
::Module.const_get(name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :"rb-const", :rb_const
|
27
|
+
remove_method :rb_const
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/klam/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'extension: Ruby interop primitives', :type => :functional do
|
4
|
+
describe 'rb-send' do
|
5
|
+
it 'invokes a method on a Ruby object, passing the provided args' do
|
6
|
+
expect_kl('(rb-send "def" prepend "abc")').to eq('abcdef')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'rb-const' do
|
11
|
+
it 'looks up the named constant in the Ruby environment' do
|
12
|
+
expect_kl('(rb-const "::Math::PI")').to eq(Math::PI)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,102 +1,93 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: klam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Greg Spurrier
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '10.4'
|
22
|
-
- -
|
20
|
+
- - ">="
|
23
21
|
- !ruby/object:Gem::Version
|
24
22
|
version: '10.4'
|
25
23
|
type: :development
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
|
-
- - ~>
|
27
|
+
- - "~>"
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '10.4'
|
33
|
-
- -
|
30
|
+
- - ">="
|
34
31
|
- !ruby/object:Gem::Version
|
35
32
|
version: '10.4'
|
36
33
|
- !ruby/object:Gem::Dependency
|
37
34
|
name: rspec
|
38
35
|
requirement: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
36
|
requirements:
|
41
|
-
- - ~>
|
37
|
+
- - "~>"
|
42
38
|
- !ruby/object:Gem::Version
|
43
39
|
version: '3.1'
|
44
|
-
- -
|
40
|
+
- - ">="
|
45
41
|
- !ruby/object:Gem::Version
|
46
42
|
version: 3.1.0
|
47
43
|
type: :development
|
48
44
|
prerelease: false
|
49
45
|
version_requirements: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
46
|
requirements:
|
52
|
-
- - ~>
|
47
|
+
- - "~>"
|
53
48
|
- !ruby/object:Gem::Version
|
54
49
|
version: '3.1'
|
55
|
-
- -
|
50
|
+
- - ">="
|
56
51
|
- !ruby/object:Gem::Version
|
57
52
|
version: 3.1.0
|
58
53
|
- !ruby/object:Gem::Dependency
|
59
54
|
name: rspec-autotest
|
60
55
|
requirement: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
56
|
requirements:
|
63
|
-
- - ~>
|
57
|
+
- - "~>"
|
64
58
|
- !ruby/object:Gem::Version
|
65
59
|
version: '1.0'
|
66
|
-
- -
|
60
|
+
- - ">="
|
67
61
|
- !ruby/object:Gem::Version
|
68
62
|
version: 1.0.0
|
69
63
|
type: :development
|
70
64
|
prerelease: false
|
71
65
|
version_requirements: !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
66
|
requirements:
|
74
|
-
- - ~>
|
67
|
+
- - "~>"
|
75
68
|
- !ruby/object:Gem::Version
|
76
69
|
version: '1.0'
|
77
|
-
- -
|
70
|
+
- - ">="
|
78
71
|
- !ruby/object:Gem::Version
|
79
72
|
version: 1.0.0
|
80
73
|
- !ruby/object:Gem::Dependency
|
81
74
|
name: ZenTest
|
82
75
|
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
76
|
requirements:
|
85
|
-
- - ~>
|
77
|
+
- - "~>"
|
86
78
|
- !ruby/object:Gem::Version
|
87
79
|
version: '4.11'
|
88
|
-
- -
|
80
|
+
- - ">="
|
89
81
|
- !ruby/object:Gem::Version
|
90
82
|
version: '4.11'
|
91
83
|
type: :development
|
92
84
|
prerelease: false
|
93
85
|
version_requirements: !ruby/object:Gem::Requirement
|
94
|
-
none: false
|
95
86
|
requirements:
|
96
|
-
- - ~>
|
87
|
+
- - "~>"
|
97
88
|
- !ruby/object:Gem::Version
|
98
89
|
version: '4.11'
|
99
|
-
- -
|
90
|
+
- - ">="
|
100
91
|
- !ruby/object:Gem::Version
|
101
92
|
version: '4.11'
|
102
93
|
description: Klam is a Ruby implementation of Kl, the small Lisp on top of which the
|
@@ -107,10 +98,11 @@ executables: []
|
|
107
98
|
extensions: []
|
108
99
|
extra_rdoc_files: []
|
109
100
|
files:
|
110
|
-
- .gitignore
|
111
|
-
- .rspec
|
112
|
-
- .travis.yml
|
101
|
+
- ".gitignore"
|
102
|
+
- ".rspec"
|
103
|
+
- ".travis.yml"
|
113
104
|
- Gemfile
|
105
|
+
- HISTORY.asciidoc
|
114
106
|
- LICENSE.txt
|
115
107
|
- PROGRESS.asciidoc
|
116
108
|
- README.asciidoc
|
@@ -144,6 +136,7 @@ files:
|
|
144
136
|
- lib/klam/primitives/boolean_operations.rb
|
145
137
|
- lib/klam/primitives/error_handling.rb
|
146
138
|
- lib/klam/primitives/generic_functions.rb
|
139
|
+
- lib/klam/primitives/interop.rb
|
147
140
|
- lib/klam/primitives/lists.rb
|
148
141
|
- lib/klam/primitives/streams.rb
|
149
142
|
- lib/klam/primitives/strings.rb
|
@@ -158,6 +151,7 @@ files:
|
|
158
151
|
- spec/functional/application_spec.rb
|
159
152
|
- spec/functional/atoms_spec.rb
|
160
153
|
- spec/functional/extensions/do_spec.rb
|
154
|
+
- spec/functional/extensions/interop_spec.rb
|
161
155
|
- spec/functional/primitives/assignments_spec.rb
|
162
156
|
- spec/functional/primitives/boolean_operations_spec.rb
|
163
157
|
- spec/functional/primitives/error_handling_spec.rb
|
@@ -185,32 +179,32 @@ files:
|
|
185
179
|
homepage: https://github.com/gregspurrier/klam
|
186
180
|
licenses:
|
187
181
|
- MIT
|
182
|
+
metadata: {}
|
188
183
|
post_install_message:
|
189
184
|
rdoc_options: []
|
190
185
|
require_paths:
|
191
186
|
- lib
|
192
187
|
required_ruby_version: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
188
|
requirements:
|
195
|
-
- -
|
189
|
+
- - ">="
|
196
190
|
- !ruby/object:Gem::Version
|
197
191
|
version: 1.9.3
|
198
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
|
-
none: false
|
200
193
|
requirements:
|
201
|
-
- -
|
194
|
+
- - ">="
|
202
195
|
- !ruby/object:Gem::Version
|
203
196
|
version: '0'
|
204
197
|
requirements: []
|
205
198
|
rubyforge_project:
|
206
|
-
rubygems_version:
|
199
|
+
rubygems_version: 2.4.5
|
207
200
|
signing_key:
|
208
|
-
specification_version:
|
201
|
+
specification_version: 4
|
209
202
|
summary: Klam is a Ruby implementation of the Kl.
|
210
203
|
test_files:
|
211
204
|
- spec/functional/application_spec.rb
|
212
205
|
- spec/functional/atoms_spec.rb
|
213
206
|
- spec/functional/extensions/do_spec.rb
|
207
|
+
- spec/functional/extensions/interop_spec.rb
|
214
208
|
- spec/functional/primitives/assignments_spec.rb
|
215
209
|
- spec/functional/primitives/boolean_operations_spec.rb
|
216
210
|
- spec/functional/primitives/error_handling_spec.rb
|