hubris 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +31 -0
  2. data/.rvmrc +2 -0
  3. data/Gemfile +11 -0
  4. data/Haskell/Hubrify.hs +69 -0
  5. data/Haskell/LICENSE +22 -0
  6. data/Haskell/Language/Ruby/Foo.hs +20 -0
  7. data/Haskell/Language/Ruby/Hubris/Binding.hsc +214 -0
  8. data/Haskell/Language/Ruby/Hubris/GHCBuild.hs +46 -0
  9. data/Haskell/Language/Ruby/Hubris/Hash.hs +27 -0
  10. data/Haskell/Language/Ruby/Hubris/Interpolator.hs +22 -0
  11. data/Haskell/Language/Ruby/Hubris/LibraryBuilder.hs +181 -0
  12. data/Haskell/Language/Ruby/Hubris/ZCode.hs +68 -0
  13. data/Haskell/Language/Ruby/Hubris.hs +254 -0
  14. data/Haskell/Language/Ruby/Wrappers.hs +32 -0
  15. data/Haskell/Language/Ruby/testLib.hs +9 -0
  16. data/Haskell/Setup.hs +31 -0
  17. data/Haskell/cbits/rshim.c +46 -0
  18. data/Haskell/cbits/rshim.h +50 -0
  19. data/Haskell/hubris.cabal +53 -0
  20. data/INSTALL +21 -0
  21. data/Manifest.txt +22 -0
  22. data/PostInstall.txt +1 -0
  23. data/README.markdown +107 -0
  24. data/Rakefile +46 -43
  25. data/VERSION +1 -0
  26. data/doc/CommonErrors.txt +18 -0
  27. data/doc/CommonErrors.txt~HEAD +18 -0
  28. data/doc/don_feedback.txt +25 -0
  29. data/doc/haskell-hubris.tex +242 -0
  30. data/doc/new_interface.rb +74 -0
  31. data/doc/ruby-hubris.tex +176 -0
  32. data/doc/wisdom_of_ancients.txt +55 -0
  33. data/ext/hubris.rb +4 -0
  34. data/ext/stub/extconf.rb +5 -0
  35. data/ext/{HubrisStubLoader.c → stub/stub.c} +1 -1
  36. data/hubris.gemspec +31 -0
  37. data/lib/Makefile +181 -0
  38. data/lib/hubris/version.rb +3 -0
  39. data/lib/hubris.rb +16 -13
  40. data/rspec.rake +21 -0
  41. data/sample/Fibonacci.hs +2 -2
  42. data/sample/config.ru +3 -1
  43. data/script/ci.sh +25 -0
  44. data/script/console +10 -0
  45. data/spec/hubris_spec.rb +173 -47
  46. data/tasks/extconf/stub.rake +43 -0
  47. data/tasks/extconf.rake +13 -0
  48. metadata +118 -27
  49. data/ext/extconf.rb +0 -5
data/spec/hubris_spec.rb CHANGED
@@ -1,27 +1,13 @@
1
1
  # encoding: ASCII-8BIT
2
2
  load File.dirname(__FILE__) + '/spec_helper.rb'
3
3
  require "hubris"
4
- Hubris.add_packages %w(base)
5
-
6
- # # just want to check it's actually possible to load a library dynamically
7
- # describe "dlload" do
8
- # it "actually builds and loads a C level dylib stupidly" do
9
- # system "cd sample; make"
10
- # `cd sample; ruby hsload.rb`.chomp.should eql("144")
11
- # end
12
- # end
13
-
14
- class Target
15
- def foo_local
16
- 14
17
- end
18
- end
4
+ Hubris.add_packages %w(base bytestring)
19
5
 
20
6
  Signal.trap("INT", 'EXIT');
21
7
 
22
- describe "Target" do
8
+ describe "Target" do
23
9
  it "whines like a little baby when you pass it bad haskell" do
24
- lambda{ class Foo; hubris :inline => "broken _ = (1 + \"a string\")", :no_strict => true; end}.should raise_error(HaskellError)
10
+ lambda{ class Foo; hubris :inline => "broken = (1 + \"a string\")"; end}.should raise_error(HaskellError)
25
11
  end
26
12
 
27
13
  it "ignores a comment" do
@@ -34,13 +20,21 @@ foo False = True"; end
34
20
  }.should_not raise_error
35
21
  end
36
22
 
37
- it "sings like a golden bird when you treat it right, aw yeah" do
38
- # t = Target.new
39
- # lambda { t.inline("working _ = T_FIXNUM (1+2)", { :no_strict => true }) }.should_not raise_error
40
- lambda { class Foo; hubris :inline => "working :: Integer -> Integer; working a = 2*a"; end}.should_not raise_error
23
+ it "doesn't get fussy about non-exportable stuff" do
24
+ lambda { class Empty; hubris :inline => "data Foo=Foo; fooerator :: Foo->Foo; fooerator Foo = Foo";end }.should_not raise_error
41
25
  end
42
-
43
-
26
+
27
+ it "handles booleans" do
28
+ class Bar
29
+ hubris :inline => "my_negate True = False;my_negate False = True", :no_strict => true
30
+ end
31
+ t = Bar.new
32
+ # puts t.methods
33
+ t.my_negate(false).should eql(true)
34
+ t.my_negate(true).should eql(false)
35
+ lambda{ t.my_negate("Banana")}.should raise_error
36
+ end
37
+ end
44
38
  # it "handles booleans" do
45
39
  # class Bar
46
40
  # hubris :inline => "my_negate True = False;my_negate False = True", :no_strict => true
@@ -51,13 +45,16 @@ foo False = True"; end
51
45
  # t.my_negate(true).should eql(false)
52
46
  # lambda{ t.my_negate("Banana")}.should raise_error
53
47
  # end
54
-
55
- it "handles doubles" do
48
+
49
+
50
+ describe "Floats" do
51
+ before do
56
52
  class Doubler
57
53
  hubris :inline => "triple :: Double -> Double; triple a = a*3.0", :no_strict => true
58
54
  end
55
+ end
56
+ it "handles doubles" do
59
57
  d = Doubler.new
60
-
61
58
  d.triple(3.4).should eql(10.2)
62
59
  end
63
60
  end
@@ -71,14 +68,101 @@ describe "Strings" do
71
68
  end
72
69
  end
73
70
 
71
+ describe "tuples" do
72
+ before do
73
+ class Tupler
74
+ hubris :inline => "revTup :: (Integer,Integer) -> (Integer,Integer); revTup (a,b) = (b,a)"
75
+ hubris :inline => "expand :: (Integer,Integer) -> (Integer,Integer,Integer); expand (a,b) = (b,a,b)"
76
+ end
77
+ end
78
+
79
+ before :each do
80
+ @t = Tupler.new
81
+ end
82
+
83
+ it 'can call a tuple with an array' do
84
+ @t.revTup([1,2]).should == [2,1]
85
+ end
86
+
87
+ it 'has no funny array business' do
88
+ @t.expand([1,2]).should == [2,1,2]
89
+ end
90
+ end
91
+
74
92
  describe "BigInt" do
75
- it "handles BigInts" do
93
+ before do
76
94
  class Bigint
77
95
  hubris :inline => "big_inc :: Integer -> Integer; big_inc i = i + 1"
78
96
  end
79
- b = Bigint.new
80
- b.big_inc(10000000000000000).should eql(10000000000000001)
81
- b.big_inc(1).should eql(2)
97
+ end
98
+
99
+ before(:each) do
100
+ # pending
101
+ @b = Bigint.new
102
+ end
103
+
104
+ it "handles smalls" do
105
+ @b.big_inc(1).should eql(2)
106
+ end
107
+
108
+
109
+ it 'handles foo' do
110
+ @b.big_inc(536870912).should == 536870913
111
+ end
112
+
113
+ it 'handles foo' do
114
+ @b.big_inc(536870913).should == 536870914
115
+ end
116
+
117
+ # it 'tests' do
118
+ # low = 536870912
119
+ # high = 1073741825
120
+
121
+ # while low != high
122
+ # mid = (high + low)/2
123
+ # puts "mid is #{mid}"
124
+ # if @b.big_inc(mid) == mid + 1
125
+ # low = mid
126
+ # else
127
+ # high = mid
128
+ # end
129
+ # end
130
+ # puts "highest working is #{mid}"
131
+ # end
132
+
133
+ it 'handles 30 bits' do
134
+ @b.big_inc(1073741822).should == 1073741823
135
+ end
136
+ it 'handles > 30 bits' do
137
+ @b.big_inc(1073741823).should == 1073741824
138
+ end
139
+
140
+ it "handles really big ints" do
141
+ @b.big_inc(1000000000000000000000000).should eql(1000000000000000000000001)
142
+ end
143
+
144
+ it "handles ints just before the border" do
145
+ @b.big_inc(2147483647).should == 2147483648
146
+ end
147
+
148
+ it "handles > int but < bigint" do
149
+ @b.big_inc(2147483648).should == 2147483649
150
+ end
151
+
152
+ end
153
+
154
+ describe "BigID" do
155
+
156
+ before do
157
+ class BigId
158
+ hubris :inline => "big_inc :: Integer -> Integer; big_inc i = i"
159
+ end
160
+ @b = BigId.new
161
+ end
162
+
163
+ it 'returns a big fix' do
164
+
165
+ @b.big_inc(1073741824).should == 1073741824
82
166
  end
83
167
  end
84
168
 
@@ -97,10 +181,7 @@ describe 'Multiple' do
97
181
  # and it doesn't wipe out other methods on the class
98
182
  t.foo_local.should eql(14)
99
183
  t.incr(3).should eql(4)
100
- # FIXME this one is waiting for support of Control.Exception in
101
- # JHC
102
- # lambda { t.mydouble(2.3)}.should raise_error(HaskellError)
103
- # Fooclever.mydouble(2.3).should raise_error(RuntimeError)
184
+ lambda { t.mydouble(2.3)}.should raise_error(HaskellError)
104
185
  end
105
186
  end
106
187
 
@@ -118,7 +199,7 @@ describe 'Arrays' do
118
199
  end
119
200
  t=ArrayTest2.new
120
201
  t.elts(5).should eql([1,2,3,4,5])
121
- lambda { t.elts("A Banana")}.should raise_error(HaskellError)
202
+ lambda { t.elts("A Banana").should == "FOO" }.should raise_error(HaskellError)
122
203
  end
123
204
  it "uses a Haskell array" do
124
205
  class ArrayTest3
@@ -148,9 +229,9 @@ describe "MaybeIn" do
148
229
  hubris :inline => "foo:: Maybe Int -> Int; foo (Just _) = 1; foo Nothing = 0"
149
230
  end
150
231
  m=MaybeIn.new
151
- # m.foo(1).should == 1
152
- # m.foo(20).should == 1
153
- # m.foo(nil).should == 2
232
+ m.foo(1).should == 2
233
+ m.foo(20).should == 40
234
+ m.foo(nil).should == 0
154
235
  lambda{ m.foo("blah") }.should raise_error(HaskellError)
155
236
  # here's a tricky bit: in the previous example, we had to look at the value of the
156
237
  # Maybe, so the exception got triggered.
@@ -158,8 +239,8 @@ describe "MaybeIn" do
158
239
  # deeply examine the something. Arguably, it would be less surprising if we always looked
159
240
  # deeply into it, but it's up for debate. TODO
160
241
 
161
- lazy = MaybeLazy.new
162
- lazy.foo("blah").should == 1
242
+ #lazy = MaybeLazy.new
243
+ #lazy.foo("blah").should == 1
163
244
  end
164
245
  end
165
246
 
@@ -207,6 +288,7 @@ describe "Overwrite" do
207
288
  hubris :inline => "myid::Int -> Int; myid i = i+1"
208
289
  end
209
290
  t=Overlapping.new
291
+ # puts t.methods
210
292
  t.myid(1).should eql(2)
211
293
  end
212
294
 
@@ -255,6 +337,7 @@ describe 'Idempotence' do
255
337
  end
256
338
 
257
339
  it "can insert the same code into two ruby modules" do
340
+
258
341
  class Foo10
259
342
  hubris :inline => "foobar::Double -> Double;foobar n = n+1.0"
260
343
  end
@@ -270,9 +353,9 @@ end
270
353
 
271
354
  describe 'Realworld' do
272
355
  it "can handle the bytestring lib" do
273
-
356
+ # pending "check"
274
357
  class ByteString
275
- hubris :module => "Data.ByteString"
358
+ hubris :module => "Data.ByteString", :no_strict => true
276
359
  end
277
360
 
278
361
  b = ByteString.new
@@ -280,18 +363,23 @@ describe 'Realworld' do
280
363
  end
281
364
 
282
365
  it "can import zlib" do
283
- pending "Not doing the right thing with embedded nulls yet"
366
+
284
367
  class ZLib
285
368
  hubris :module => 'Codec.Compression.GZip', :packages => ['zlib', 'bytestring']
286
369
  end
287
370
  z=ZLib.new
288
371
  w="osatnoensauhoestnuhoastuhoeatnuhosnueohnsauostneo"
289
- puts w.encoding
372
+ pending "Not doing the right thing with embedded nulls yet"
373
+ # for the moment, we're happy if it errors out in a controlled way
374
+
375
+ lambda {z.decompress(z.compress(w)).should eql(w)}.should raise_error(HaskellError)
376
+
290
377
  x=z.compress(w)
291
- x.each_byte {|c| print c, ' ' }
378
+ x.each_byte {|c| print c, ':' }
292
379
  puts "length|#{x.length}|"
380
+ # x.length.should > 5 # probably some shannon thing here
293
381
  puts "second"
294
- z.decompress(z.compress(w)).should eql(w)
382
+ lambda {z.decompress(z.compress(w)).should eql(w)}.should_not raise_error
295
383
  end
296
384
 
297
385
  end
@@ -304,7 +392,6 @@ describe 'Performance' do
304
392
  it "caches its output" do
305
393
  # only relevant for inlining
306
394
 
307
- t=Target.new
308
395
  class First
309
396
  hubris :inline => "foobar::Int->Int; foobar a = a"
310
397
  end
@@ -347,4 +434,43 @@ describe 'Performance' do
347
434
  threads.each { |t| t.join }
348
435
  }.should_not raise_error
349
436
  end
437
+
438
+ end
439
+
440
+ describe "IO" do
441
+ it "can write a variable" do
442
+ pending
443
+ class IOTest
444
+ hubris :inline =><<EOF
445
+ import Data.IORef
446
+ import System.IO.Unsafe
447
+ ref :: IORef Int
448
+ ref = unsafePerformIO $ newIORef 10
449
+
450
+ readRef :: IO Int
451
+ readRef = readIORef ref
452
+ modify :: Int -> IO ()
453
+ modify n = writeIORef ref n
454
+ EOF
455
+
456
+ end
457
+ i = IOTest.new
458
+ i.readRef(nil).should == 10
459
+ i.modify(20)
460
+ i.readRef(nil).should == 20
461
+
462
+ end
463
+ end
464
+
465
+ describe "multiple arguments" do
466
+ it "can call a haskell function with multiple arguments" do
467
+ class Mult
468
+ hubris :inline => <<EOF
469
+ add :: Integer -> Integer -> Integer -> Integer
470
+ add x y z = x+y+z
471
+ EOF
472
+ end
473
+
474
+ Mult.new.add(1,9,100).should == 110
475
+ end
350
476
  end
@@ -0,0 +1,43 @@
1
+ namespace :extconf do
2
+ extension = File.basename(__FILE__, '.rake')
3
+
4
+ ext = "ext/#{extension}"
5
+ ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
6
+ ext_files = FileList[
7
+ "#{ext}/*.c",
8
+ "#{ext}/*.h",
9
+ "#{ext}/*.rl",
10
+ "#{ext}/extconf.rb",
11
+ "#{ext}/Makefile",
12
+ # "lib"
13
+ ]
14
+
15
+
16
+ task :compile => extension do
17
+ if Dir.glob("**/#{extension}.{o,so,dll}").length == 0
18
+ STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
19
+ STDERR.puts "Gem actually failed to build. Your system is"
20
+ STDERR.puts "NOT configured properly to build #{GEM_NAME}."
21
+ STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
22
+ exit(1)
23
+ end
24
+ end
25
+
26
+ desc "Builds just the #{extension} extension"
27
+ task extension.to_sym => ["#{ext}/Makefile", ext_so ]
28
+
29
+ file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
30
+ Dir.chdir(ext) do ruby "extconf.rb" end
31
+ end
32
+
33
+ file ext_so => ext_files do
34
+ Dir.chdir(ext) do
35
+ sh(PLATFORM =~ /win32/ ? 'nmake' : 'make') do |ok, res|
36
+ if !ok
37
+ require "fileutils"
38
+ FileUtils.rm Dir.glob('*.{so,o,dll,bundle}')
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,13 @@
1
+ namespace :extconf do
2
+ desc "Compiles the Ruby extension"
3
+ task :compile
4
+ end
5
+
6
+ task :compile => "extconf:compile"
7
+
8
+ task :test => :compile
9
+
10
+ BIN = "*.{bundle,jar,so,obj,pdb,lib,def,exp}"
11
+ $hoe.clean_globs |= ["ext/**/#{BIN}", "lib/**/#{BIN}", 'ext/**/Makefile']
12
+ $hoe.spec.require_paths = Dir['{lib,ext/*}']
13
+ $hoe.spec.extensions = FileList["ext/**/extconf.rb"].to_a
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hubris
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 4
10
+ version: 0.0.4
5
11
  platform: ruby
6
12
  authors:
7
13
  - Mark Wotton
@@ -11,77 +17,162 @@ autorequire:
11
17
  bindir: bin
12
18
  cert_chain: []
13
19
 
14
- date: 2009-11-30 00:00:00 +11:00
20
+ date: 2011-02-24 00:00:00 +11:00
15
21
  default_executable:
16
22
  dependencies:
17
23
  - !ruby/object:Gem::Dependency
18
- name: rspec
24
+ name: rake-compiler
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 15
32
+ segments:
33
+ - 0
34
+ - 7
35
+ - 6
36
+ version: 0.7.6
19
37
  type: :runtime
20
- version_requirement:
21
- version_requirements: !ruby/object:Gem::Requirement
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: rspec
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - "="
46
+ - !ruby/object:Gem::Version
47
+ hash: 31
48
+ segments:
49
+ - 2
50
+ - 4
51
+ - 0
52
+ version: 2.4.0
53
+ type: :development
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ prerelease: false
58
+ requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
22
60
  requirements:
23
61
  - - ">="
24
62
  - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
25
66
  version: "0"
26
- version:
67
+ type: :runtime
68
+ version_requirements: *id003
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: open4
29
- type: :runtime
30
- version_requirement:
31
- version_requirements: !ruby/object:Gem::Requirement
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
32
74
  requirements:
33
75
  - - ">="
34
76
  - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
35
80
  version: "0"
36
- version:
37
- description: A Ruby Haskell bridge
38
- email: mwotton@gmail.com
81
+ type: :runtime
82
+ version_requirements: *id004
83
+ description: A bridge between Ruby and Haskell
84
+ email:
85
+ - mwotton@gmail.com
39
86
  executables: []
40
87
 
41
88
  extensions:
42
- - ext/extconf.rb
89
+ - Rakefile
43
90
  extra_rdoc_files: []
44
91
 
45
92
  files:
93
+ - .gitignore
94
+ - .rvmrc
95
+ - Gemfile
46
96
  - HISTORY.markdown
47
- - ext/extconf.rb
48
- - ext/HubrisStubLoader.c
49
- - lib/hubris.rb
97
+ - Haskell/Hubrify.hs
98
+ - Haskell/LICENSE
99
+ - Haskell/Language/Ruby/Foo.hs
100
+ - Haskell/Language/Ruby/Hubris.hs
101
+ - Haskell/Language/Ruby/Hubris/Binding.hsc
102
+ - Haskell/Language/Ruby/Hubris/GHCBuild.hs
103
+ - Haskell/Language/Ruby/Hubris/Hash.hs
104
+ - Haskell/Language/Ruby/Hubris/Interpolator.hs
105
+ - Haskell/Language/Ruby/Hubris/LibraryBuilder.hs
106
+ - Haskell/Language/Ruby/Hubris/ZCode.hs
107
+ - Haskell/Language/Ruby/Wrappers.hs
108
+ - Haskell/Language/Ruby/testLib.hs
109
+ - Haskell/Setup.hs
110
+ - Haskell/cbits/rshim.c
111
+ - Haskell/cbits/rshim.h
112
+ - Haskell/hubris.cabal
113
+ - INSTALL
114
+ - Manifest.txt
115
+ - PostInstall.txt
116
+ - README.markdown
50
117
  - Rakefile
51
- - sample/config.ru
118
+ - VERSION
119
+ - doc/CommonErrors.txt
120
+ - doc/CommonErrors.txt~HEAD
121
+ - doc/don_feedback.txt
122
+ - doc/haskell-hubris.tex
123
+ - doc/new_interface.rb
124
+ - doc/ruby-hubris.tex
125
+ - doc/wisdom_of_ancients.txt
126
+ - ext/hubris.rb
127
+ - ext/stub/extconf.rb
128
+ - ext/stub/stub.c
129
+ - hubris.gemspec
130
+ - lib/Makefile
131
+ - lib/hubris.rb
132
+ - lib/hubris/version.rb
133
+ - rspec.rake
52
134
  - sample/Fibonacci.hs
135
+ - sample/config.ru
136
+ - script/ci.sh
137
+ - script/console
53
138
  - spec/hubris_spec.rb
54
139
  - spec/spec.opts
55
140
  - spec/spec_helper.rb
141
+ - tasks/extconf.rake
142
+ - tasks/extconf/stub.rake
56
143
  has_rdoc: true
57
- homepage: http://github.com/mwotton/hubris
144
+ homepage: http://rubygems.org/gems/hubris
58
145
  licenses: []
59
146
 
60
147
  post_install_message:
61
- rdoc_options:
62
- - --inline-source
63
- - --charset=UTF-8
148
+ rdoc_options: []
149
+
64
150
  require_paths:
65
151
  - lib
66
- - ext
67
152
  required_ruby_version: !ruby/object:Gem::Requirement
153
+ none: false
68
154
  requirements:
69
155
  - - ">="
70
156
  - !ruby/object:Gem::Version
157
+ hash: 3
158
+ segments:
159
+ - 0
71
160
  version: "0"
72
- version:
73
161
  required_rubygems_version: !ruby/object:Gem::Requirement
162
+ none: false
74
163
  requirements:
75
164
  - - ">="
76
165
  - !ruby/object:Gem::Version
166
+ hash: 3
167
+ segments:
168
+ - 0
77
169
  version: "0"
78
- version:
79
170
  requirements: []
80
171
 
81
- rubyforge_project: hubris
82
- rubygems_version: 1.3.5
172
+ rubyforge_project: Hubris
173
+ rubygems_version: 1.3.7
83
174
  signing_key:
84
175
  specification_version: 3
85
- summary: Hubris is a Ruby Haskell bridge allowing you to call Haskell functions from your Ruby code.
176
+ summary: A bridge between Ruby and Haskell
86
177
  test_files: []
87
178
 
data/ext/extconf.rb DELETED
@@ -1,5 +0,0 @@
1
- require 'mkmf'
2
-
3
- # dir_config("HubrisStubLoader")
4
- have_header('ruby.h')
5
- create_makefile 'HubrisStubLoader'