jl4rb 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +113 -0
- data/ext/jl4rb/MANIFEST +0 -0
- data/ext/jl4rb/extconf.rb +44 -0
- data/ext/jl4rb/jl4rb.c +558 -0
- data/jl4rb.gemspec +33 -0
- data/lib/jl4rb/jl2rb_eval.rb +128 -0
- data/lib/jl4rb/jl2rb_init.rb +15 -0
- data/lib/jl4rb.rb +6 -0
- data/test/testDynArray.rb +14 -0
- data/test/testJLVector.rb +31 -0
- data/test/testWithArg.rb +25 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c2e556eacfd629abcbddd8756e0ef040beac465a
|
4
|
+
data.tar.gz: 3acd1b2d43241368d81c4a06ae5f9501b379b887
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 99e1ab7677c957848d361191557d928b21cbdc46b011cf9ee70248d4a490f9814f1867f2b157a4c60038cbd81e61b0b504cc817a2751a12629639ac69186bc4c
|
7
|
+
data.tar.gz: a7f1070f72ec507cf31cf0e0216af0dc5b2cea8c3058025ef4f7f8597cfac4d045f34c22acc33ee73e100a9dfbab1724886edb2d7a1a7f2cad615ba25c808de4
|
data/Rakefile
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rubygems/package_task'
|
4
|
+
|
5
|
+
PKG_NAME='jl4rb'
|
6
|
+
PKG_VERSION='0.0.1'
|
7
|
+
PKG_FILES=FileList[
|
8
|
+
'Rakefile','jl4rb.gemspec',
|
9
|
+
'ext/jl4rb/*.c',
|
10
|
+
'ext/jl4rb/extconf.rb',
|
11
|
+
'ext/jl4rb/*.inc',
|
12
|
+
'ext/jl4rb/*.h',
|
13
|
+
'ext/jl4rb/MANIFEST',
|
14
|
+
'lib/**/*.rb',
|
15
|
+
'test/**/*.rb'
|
16
|
+
]
|
17
|
+
|
18
|
+
spec = Gem::Specification.new do |s|
|
19
|
+
s.platform = Gem::Platform::RUBY
|
20
|
+
s.summary = "Julia for ruby"
|
21
|
+
s.name = PKG_NAME
|
22
|
+
s.version = PKG_VERSION
|
23
|
+
s.requirements << 'none'
|
24
|
+
s.require_paths = ["lib","ext/jl4rb"]
|
25
|
+
s.files = PKG_FILES.to_a
|
26
|
+
s.extensions = ["ext/jl4rb/extconf.rb"]
|
27
|
+
s.licenses = ['MIT', 'GPL-2']
|
28
|
+
s.description = <<-EOF
|
29
|
+
R is embedded in ruby with some communication support .
|
30
|
+
EOF
|
31
|
+
s.author = "CQLS"
|
32
|
+
s.email= "rdrouilh@gmail.com"
|
33
|
+
s.homepage = "http://cqls.upmf-grenoble.fr"
|
34
|
+
s.rubyforge_project = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
## this allows to produce some parameter for task like Gem::PackageTask (without additional argument!)
|
38
|
+
opt={};ARGV.select{|e| e=~/\=/ }.each{|e| tmp= e.split("=");opt[tmp[0]]=tmp[1]}
|
39
|
+
|
40
|
+
## rake ... pkgdir=<path to provide> to update PKGDIR
|
41
|
+
PKGDIR=opt["pkgdir"] || ENV["RUBYGEMS_PKGDIR"] || "pkg"
|
42
|
+
## OLD: gem task!!!
|
43
|
+
# desc "Create #{PKG_NAME+'-'+PKG_VERSION+'.gem'}"
|
44
|
+
# Gem::PackageTask.new(spec) do |pkg|
|
45
|
+
# pkg.package_dir=PKGDIR
|
46
|
+
# pkg.need_zip = false
|
47
|
+
# pkg.need_tar = false
|
48
|
+
# end
|
49
|
+
|
50
|
+
# it is less verbose than the previous one
|
51
|
+
desc "Create #{PKG_NAME+'-'+PKG_VERSION+'.gem'}"
|
52
|
+
task :package do |t|
|
53
|
+
#Gem::Builder.new(spec_client).build
|
54
|
+
unless File.directory? PKGDIR
|
55
|
+
require 'fileutils'
|
56
|
+
FileUtils.mkdir_p PKGDIR
|
57
|
+
end
|
58
|
+
Gem::Package.build(spec)
|
59
|
+
`mv #{PKG_NAME+'-'+PKG_VERSION+'.gem'} #{PKGDIR}`
|
60
|
+
end
|
61
|
+
|
62
|
+
## clean task
|
63
|
+
desc "Remove #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')}"
|
64
|
+
task :clean do |t|
|
65
|
+
rm File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem') if File.exists? File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')
|
66
|
+
rm_rf File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION) if File.exists? File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION)
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
## install task with doc
|
71
|
+
desc "Install #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')}"
|
72
|
+
task :install_with_doc do |t|
|
73
|
+
`gem install #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')} --local`
|
74
|
+
end
|
75
|
+
|
76
|
+
## quick install task
|
77
|
+
desc "Quick install #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')}"
|
78
|
+
task :install do |t|
|
79
|
+
`gem install #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')} --local --no-rdoc --no-ri`
|
80
|
+
rm_rf File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION) if File.exists? File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION)
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Docker install #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')}"
|
84
|
+
task :docker => :package do |t|
|
85
|
+
`gem install #{File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION+'.gem')} --local --no-rdoc --no-ri`
|
86
|
+
rm_rf File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION) if File.exists? File.join(PKGDIR,PKG_NAME+'-'+PKG_VERSION)
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
## binary task (mainly for Windows binary)
|
91
|
+
spec_bin=Gem::Specification.new do |s|
|
92
|
+
s.platform = Gem::Platform::CURRENT
|
93
|
+
s.summary = "Julia for ruby"
|
94
|
+
s.name = PKG_NAME
|
95
|
+
s.version = PKG_VERSION
|
96
|
+
s.requirements << 'none'
|
97
|
+
s.require_paths = ["lib"]
|
98
|
+
s.files = Dir['lib/**/*.rb'] + Dir['lib/*.so']
|
99
|
+
s.required_ruby_version = '>= 1.8.0'
|
100
|
+
s.description = <<-EOF
|
101
|
+
R is embedded in ruby with some communication support .
|
102
|
+
EOF
|
103
|
+
s.author = "CQLS"
|
104
|
+
s.email= "rdrouilh@gmail.com"
|
105
|
+
s.homepage = "http://cqls.upmf-grenoble.fr"
|
106
|
+
s.rubyforge_project = nil
|
107
|
+
s.has_rdoc = false
|
108
|
+
end
|
109
|
+
|
110
|
+
task :gem_bin do |t|
|
111
|
+
`cp ext/jl4rb/*.so lib`
|
112
|
+
Gem::Builder.new(spec_bin).build
|
113
|
+
end
|
data/ext/jl4rb/MANIFEST
ADDED
File without changes
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "mkmf"
|
2
|
+
require 'fileutils' #if RUBY_VERSION < "1.9"
|
3
|
+
|
4
|
+
|
5
|
+
$prefix_include,$prefix_lib=[],[]
|
6
|
+
if RUBY_PLATFORM =~ /linux/ and File.exists? "/usr/include/"+RUBY_PLATFORM+"/julia"
|
7
|
+
$prefix_include << "/usr/include/"+RUBY_PLATFORM+"/julia"
|
8
|
+
$prefix_lib << "/usr/lib/"+RUBY_PLATFORM+"/julia"
|
9
|
+
else
|
10
|
+
#$prefix=ENV["JLAPI_HOME"] || File.join(ENV["HOME"],".jlapi/julia") || ENV["JULIA_HOME"]
|
11
|
+
$prefix=ENV["JULIA_DIR"]
|
12
|
+
#p $prefix
|
13
|
+
[$prefix+"/include/julia",$prefix+"/usr/include",$prefix+"/src",$prefix+"/src/support"].each do |incl|
|
14
|
+
$prefix_include << incl if File.exists? incl
|
15
|
+
end
|
16
|
+
|
17
|
+
([$prefix+"/lib/julia",$prefix+"/usr/lib"]+(RUBY_PLATFORM=~/(?:mingw|msys)/ ? [$prefix+"/bin"] : [])).each do |lib|
|
18
|
+
$prefix_lib << lib if File.exists? lib
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def jl4rb_makefile(incs,libs)
|
23
|
+
#$CFLAGS = "-I"+inc+" -I."
|
24
|
+
# $CFLAGS = (enable_config("julia-release") ? "-DWITH_JULIA_RELEASE " : "")+ "-I"+inc+" -I."
|
25
|
+
# $LDFLAGS = " -Wl,-rpath,"+lib+" -L"+lib if lib
|
26
|
+
# $libs = (enable_config("julia-release") ? " -ljulia-release" : " -ljulia-api" )
|
27
|
+
|
28
|
+
$CFLAGS = incs.map{|inc| "-I"+inc}.join(" ")+" -I."
|
29
|
+
$LDFLAGS = " "+libs.map{|lib| "-Wl,-rpath,"+lib+" -L"+lib}.join(" ") if libs
|
30
|
+
$libs = " -ljulia"
|
31
|
+
|
32
|
+
|
33
|
+
header = nil
|
34
|
+
|
35
|
+
rb4r_name="jl4rb"
|
36
|
+
$objs = [rb4r_name+".o"]
|
37
|
+
|
38
|
+
dir_config("R4rb")
|
39
|
+
create_makefile(rb4r_name)
|
40
|
+
end
|
41
|
+
|
42
|
+
jl4rb_makefile($prefix_include,$prefix_lib)
|
43
|
+
|
44
|
+
|
data/ext/jl4rb/jl4rb.c
ADDED
@@ -0,0 +1,558 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
jl4rb.c
|
4
|
+
|
5
|
+
**********************************************************************/
|
6
|
+
|
7
|
+
#include "julia.h"
|
8
|
+
#include <stdio.h>
|
9
|
+
#include <string.h>
|
10
|
+
#include <math.h>
|
11
|
+
|
12
|
+
//#define WITH_JULIA_RELEASE
|
13
|
+
|
14
|
+
//#ifdef WITH_JULIA_RELEASE
|
15
|
+
//#else
|
16
|
+
//#include "julia-api.h"
|
17
|
+
//#endif
|
18
|
+
|
19
|
+
//-| next macros already exist in ruby and are undefined here
|
20
|
+
//#undef T_FLOAT
|
21
|
+
#undef NORETURN
|
22
|
+
#include "ruby.h"
|
23
|
+
|
24
|
+
#define length(a) jl_array_size(a,0)
|
25
|
+
|
26
|
+
/************* INIT *********************/
|
27
|
+
|
28
|
+
|
29
|
+
VALUE Julia_init(VALUE obj, VALUE args)
|
30
|
+
{
|
31
|
+
char **argv,*julia_home_dir;
|
32
|
+
int i,argc;
|
33
|
+
VALUE tmp;
|
34
|
+
|
35
|
+
argc=RARRAY_LEN(args) + 1;
|
36
|
+
tmp=rb_ary_entry(args,0);
|
37
|
+
julia_home_dir=StringValuePtr(tmp);
|
38
|
+
//printf("First initialization with julia_home_dir=%s\n",julia_home_dir);
|
39
|
+
// printf("copy stacks ");
|
40
|
+
// #ifdef COPY_STACKS
|
41
|
+
// printf("defined \n");
|
42
|
+
// #else
|
43
|
+
// printf("undefined \n");
|
44
|
+
// #endif
|
45
|
+
// printf("JL_SET_STACK_BASE ");
|
46
|
+
// #ifdef JL_SET_STACK_BASE
|
47
|
+
// printf("defined \n");
|
48
|
+
// #else
|
49
|
+
// printf("undefined \n");
|
50
|
+
// #endif
|
51
|
+
//#ifdef WITH_JULIA_RELEASE
|
52
|
+
if(strcmp(julia_home_dir,"")==0) {
|
53
|
+
jl_init(NULL);
|
54
|
+
//JL_SET_STACK_BASE;
|
55
|
+
} else {
|
56
|
+
jl_init(julia_home_dir);
|
57
|
+
//JL_SET_STACK_BASE;
|
58
|
+
}
|
59
|
+
//#else
|
60
|
+
// jlapi_init(julia_home_dir,mode);
|
61
|
+
//#endif
|
62
|
+
|
63
|
+
return Qtrue;
|
64
|
+
}
|
65
|
+
|
66
|
+
//Maybe try to use cpp stuff to get the output inside julia system (ccall,cgen and cgutils)
|
67
|
+
//-| TODO: after adding in the jlapi.c jl_is_<C_type> functions replace the strcmp!
|
68
|
+
VALUE jl_value_to_VALUE(jl_value_t *res) {
|
69
|
+
size_t i=0,k,nd,d;
|
70
|
+
VALUE resRb;
|
71
|
+
jl_value_t *tmp;
|
72
|
+
jl_function_t *call;
|
73
|
+
|
74
|
+
if(res!=NULL) { //=> get a result
|
75
|
+
//printf("typeof=%s\n",jl_typeof_str(res));
|
76
|
+
if(strcmp(jl_typeof_str(res),"Int64")==0 || strcmp(jl_typeof_str(res),"Int32")==0)
|
77
|
+
//if(jl_is_long(res)) //does not work because of DLLEXPORT
|
78
|
+
{
|
79
|
+
//printf("elt=%d\n",jl_unbox_long(res));
|
80
|
+
return INT2FIX(jl_unbox_long(res));
|
81
|
+
}
|
82
|
+
else
|
83
|
+
if(strcmp(jl_typeof_str(res),"Float64")==0)
|
84
|
+
//if(jl_is_float64(res))
|
85
|
+
{
|
86
|
+
return rb_float_new(jl_unbox_float64(res));
|
87
|
+
}
|
88
|
+
else
|
89
|
+
if(strcmp(jl_typeof_str(res),"Float32")==0)
|
90
|
+
//if(jl_is_float64(res))
|
91
|
+
{
|
92
|
+
return rb_float_new(jl_unbox_float32(res));
|
93
|
+
}
|
94
|
+
else
|
95
|
+
if(strcmp(jl_typeof_str(res),"Bool")==0)
|
96
|
+
//if(jl_is_bool(res))
|
97
|
+
{
|
98
|
+
return (jl_unbox_bool(res) ? Qtrue : Qfalse);
|
99
|
+
}
|
100
|
+
else
|
101
|
+
if(strcmp(jl_typeof_str(res),"DataType")==0)
|
102
|
+
{
|
103
|
+
return rb_str_new2(jl_typename_str(res));
|
104
|
+
}
|
105
|
+
else
|
106
|
+
if(strcmp(jl_typeof_str(res),"Nothing")==0)
|
107
|
+
{
|
108
|
+
return Qnil;
|
109
|
+
}
|
110
|
+
else
|
111
|
+
if(strcmp(jl_typeof_str(res),"Complex")==0)
|
112
|
+
//if(jl_is_bool(res))
|
113
|
+
{
|
114
|
+
resRb = rb_eval_string("require('complex');Complex.new(0,0)");
|
115
|
+
rb_iv_set(resRb,"@real",jl_value_to_VALUE(jl_get_field(res, "re")));
|
116
|
+
rb_iv_set(resRb,"@image",jl_value_to_VALUE(jl_get_field(res, "im")));
|
117
|
+
return resRb;
|
118
|
+
}
|
119
|
+
else
|
120
|
+
if(strcmp(jl_typeof_str(res),"Regex")==0)
|
121
|
+
//if(jl_is_bool(res))
|
122
|
+
{
|
123
|
+
// call=(jl_function_t*)jl_get_global(jl_base_module, jl_symbol("show"));
|
124
|
+
// printf("ici\n");
|
125
|
+
// if (call) tmp=jl_call1(call,res);
|
126
|
+
// else printf("call failed!\n");
|
127
|
+
// printf("ici\n");
|
128
|
+
resRb = jl_value_to_VALUE(jl_get_field(res, "pattern"));
|
129
|
+
return resRb;
|
130
|
+
}
|
131
|
+
else
|
132
|
+
if(strcmp(jl_typeof_str(res),"ASCIIString")==0 || strcmp(jl_typeof_str(res),"UTF8String")==0)
|
133
|
+
{
|
134
|
+
//printf("value=%s\n",jl_bytestring_ptr(res));
|
135
|
+
return rb_str_new2(jl_bytestring_ptr(res));
|
136
|
+
}
|
137
|
+
else
|
138
|
+
if(strcmp(jl_typeof_str(res),"Array")==0 )
|
139
|
+
//if(jl_is_array(res))
|
140
|
+
{
|
141
|
+
nd = jl_array_rank(res);
|
142
|
+
//printf("array_ndims=%d\n",(int)nd);
|
143
|
+
if(nd==1) {//Vector
|
144
|
+
d = jl_array_size(res, 0);
|
145
|
+
//printf("array_dim[1]=%d\n",(int)d);
|
146
|
+
resRb = rb_ary_new2(d);
|
147
|
+
for(i=0;i<d;i++) {
|
148
|
+
rb_ary_store(resRb,i,jl_value_to_VALUE(jl_arrayref((jl_array_t *)res,i)));
|
149
|
+
}
|
150
|
+
return resRb;
|
151
|
+
}
|
152
|
+
//TODO: multidim array ruby equivalent???? Is it necessary
|
153
|
+
|
154
|
+
}
|
155
|
+
else
|
156
|
+
if(strcmp(jl_typeof_str(res),"Tuple")==0 )
|
157
|
+
//if(jl_is_array(res))
|
158
|
+
{
|
159
|
+
d=jl_tuple_len(res);
|
160
|
+
resRb = rb_ary_new2(d);
|
161
|
+
for(i=0;i<d;i++) {
|
162
|
+
rb_ary_store(resRb,i,jl_value_to_VALUE(jl_tupleref(res,i)));
|
163
|
+
}
|
164
|
+
return resRb;
|
165
|
+
}
|
166
|
+
//printf("unconverted!!!");
|
167
|
+
resRb=rb_str_new2("__unconverted(");
|
168
|
+
rb_str_cat2(resRb, jl_typeof_str(res));
|
169
|
+
rb_str_cat2(resRb, ")__\n");
|
170
|
+
//printf("%s\n",jl_bytestring_ptr(jl_eval_string("\"$(ans)\"")));
|
171
|
+
// jl_function_t *call=(jl_function_t*)jl_get_global(jl_base_module, jl_symbol("show"));
|
172
|
+
// if (call) jl_call1(call,res);
|
173
|
+
// else printf("call failed!\n");
|
174
|
+
|
175
|
+
return resRb;
|
176
|
+
}
|
177
|
+
//=> No result (command incomplete or syntax error)
|
178
|
+
//#ifndef WITH_JULIA_RELEASE
|
179
|
+
// jlapi_print_stderr(); //If this happens but this is really not sure!
|
180
|
+
//#endif
|
181
|
+
//printf("incomplete!!!");
|
182
|
+
resRb=rb_str_new2("__incomplete");
|
183
|
+
if(jl_exception_occurred()!=NULL) {
|
184
|
+
rb_str_cat2(resRb, "(");
|
185
|
+
rb_str_cat2(resRb,jl_typeof_str(jl_exception_occurred()));
|
186
|
+
jl_value_t* err=jl_get_field(jl_exception_occurred(),"msg");
|
187
|
+
if(err!=NULL) printf("%s: %s\n",jl_typeof_str(jl_exception_occurred()),jl_bytestring_ptr(err));
|
188
|
+
jl_exception_clear();
|
189
|
+
rb_str_cat2(resRb, ")");
|
190
|
+
}
|
191
|
+
rb_str_cat2(resRb, "__");
|
192
|
+
return resRb;
|
193
|
+
}
|
194
|
+
|
195
|
+
/***************** EVAL **********************/
|
196
|
+
|
197
|
+
VALUE Julia_eval(VALUE obj, VALUE cmd, VALUE print_stdout)
|
198
|
+
{
|
199
|
+
char *cmdString;
|
200
|
+
jl_value_t *res;
|
201
|
+
VALUE resRb;
|
202
|
+
|
203
|
+
cmdString=StringValuePtr(cmd);
|
204
|
+
//printf("cmd=%s\n",cmdString);
|
205
|
+
//#ifndef WITH_JULIA_RELEASE
|
206
|
+
//This flush redirected stdout before printing
|
207
|
+
//if(print_stdout!=Qnil) jlapi_get_stdout();
|
208
|
+
//#endif
|
209
|
+
//jl_gc_disable();
|
210
|
+
res=jl_eval_string(cmdString);
|
211
|
+
//printf("cmd=%s\n",cmdString);
|
212
|
+
if (jl_exception_occurred()) {
|
213
|
+
jl_show(jl_stderr_obj(), jl_exception_occurred());
|
214
|
+
jl_printf(jl_stderr_stream(), "\n");
|
215
|
+
resRb=Qnil;
|
216
|
+
} else {
|
217
|
+
//JL_GC_PUSH1(&res);
|
218
|
+
//printf("cmd=%s\n",cmdString);
|
219
|
+
//jl_set_global(jl_base_module, jl_symbol("ans"),res);
|
220
|
+
//#ifndef WITH_JULIA_RELEASE
|
221
|
+
// if(print_stdout!=Qnil) jlapi_print_stdout();
|
222
|
+
//#endif
|
223
|
+
resRb=jl_value_to_VALUE(res);
|
224
|
+
//JL_GC_POP();
|
225
|
+
}
|
226
|
+
//jl_gc_enable();
|
227
|
+
return resRb;
|
228
|
+
}
|
229
|
+
|
230
|
+
VALUE Julia_exec(VALUE obj, VALUE cmd, VALUE get_stdout)
|
231
|
+
{
|
232
|
+
char *cmdString,*outString;
|
233
|
+
jl_value_t *res;
|
234
|
+
VALUE out;
|
235
|
+
|
236
|
+
cmdString=StringValuePtr(cmd);
|
237
|
+
res=jl_eval_string(cmdString);
|
238
|
+
jl_set_global(jl_base_module, jl_symbol("ans"),res);
|
239
|
+
//if(get_stdout!=Qnil) {
|
240
|
+
// outString=jlapi_get_stdout();
|
241
|
+
// jl_set_global(jl_base_module, jl_symbol("rbout"),jl_cstr_to_string(outString));
|
242
|
+
// return rb_str_new2(outString);
|
243
|
+
//} else
|
244
|
+
return Qnil;
|
245
|
+
}
|
246
|
+
|
247
|
+
|
248
|
+
/// Util
|
249
|
+
|
250
|
+
int util_isVector(jl_value_t *ans)
|
251
|
+
{
|
252
|
+
return (strcmp(jl_typeof_str(ans),"Array")==0) && (jl_array_rank(ans)==1);
|
253
|
+
}
|
254
|
+
|
255
|
+
int util_isVariable(VALUE self)
|
256
|
+
{
|
257
|
+
VALUE tmp;
|
258
|
+
tmp=rb_iv_get(self,"@type");
|
259
|
+
return strcmp(StringValuePtr(tmp),"var")==0;
|
260
|
+
}
|
261
|
+
|
262
|
+
jl_value_t *util_getVar(VALUE self)
|
263
|
+
{
|
264
|
+
jl_value_t *ans;
|
265
|
+
char *name;
|
266
|
+
VALUE tmp;
|
267
|
+
|
268
|
+
tmp=rb_iv_get(self,"@name");
|
269
|
+
name=StringValuePtr(tmp);
|
270
|
+
ans=jl_eval_string(name);
|
271
|
+
//printf("name=%s,vector=%d\n",name,util_isVector(ans));
|
272
|
+
if(!util_isVector(ans)) return NULL;
|
273
|
+
return ans;
|
274
|
+
}
|
275
|
+
|
276
|
+
//with argument!! necessarily an expression and not a variable
|
277
|
+
jl_value_t *util_getExpr_with_arg(VALUE self)
|
278
|
+
{
|
279
|
+
jl_value_t *ans;
|
280
|
+
VALUE tmp;
|
281
|
+
char *cmd;
|
282
|
+
|
283
|
+
//printf("getVar:%s\n",name);
|
284
|
+
tmp=rb_str_dup(rb_iv_get(self,"@arg"));
|
285
|
+
tmp=rb_str_cat2(rb_str_dup(rb_iv_get(self,"@name")),StringValuePtr(tmp));
|
286
|
+
cmd=StringValuePtr(tmp);
|
287
|
+
ans=jl_eval_string(cmd);
|
288
|
+
if(ans==NULL) return ans;
|
289
|
+
//if(!util_isVector(ans)) return NULL;
|
290
|
+
return ans;
|
291
|
+
}
|
292
|
+
|
293
|
+
|
294
|
+
VALUE util_jl_value_to_VALUE(jl_value_t *ans)
|
295
|
+
{
|
296
|
+
return jl_value_to_VALUE(ans);
|
297
|
+
}
|
298
|
+
|
299
|
+
|
300
|
+
//-| Transform only a Vector or Atom
|
301
|
+
//-| Todo: when not a vector, avoid transform to vector first.
|
302
|
+
jl_value_t* util_VALUE_to_jl_value(VALUE arr)
|
303
|
+
{
|
304
|
+
jl_value_t *ans,*elt;
|
305
|
+
VALUE res,class,tmp;
|
306
|
+
int i,n=0,vect=1;
|
307
|
+
|
308
|
+
if(!rb_obj_is_kind_of(arr,rb_cArray)) {
|
309
|
+
n=1;
|
310
|
+
res = rb_ary_new2(1);
|
311
|
+
rb_ary_push(res,arr);
|
312
|
+
arr=res;
|
313
|
+
vect=0;
|
314
|
+
} else {
|
315
|
+
n=RARRAY_LEN(arr);
|
316
|
+
}
|
317
|
+
|
318
|
+
class=rb_class_of(rb_ary_entry(arr,0));
|
319
|
+
ans=jl_alloc_cell_1d(n);
|
320
|
+
if(class==rb_cFloat) {
|
321
|
+
//-| This is maybe faster and can be developped in julia-api as jl_vector_float64(n) for example.
|
322
|
+
//ans=jl_alloc_array_1d(jl_float64_type,n);
|
323
|
+
for(i=0;i<n;i++) {
|
324
|
+
elt=jl_box_float64(NUM2DBL(rb_ary_entry(arr,i)));
|
325
|
+
jl_arrayset(ans,elt,i);
|
326
|
+
}
|
327
|
+
} else if(class==rb_cFixnum || class==rb_cBignum) {
|
328
|
+
//ans=jl_alloc_array_1d(jl_long_type,n);
|
329
|
+
for(i=0;i<n;i++) {
|
330
|
+
elt=jl_box_long(NUM2INT(rb_ary_entry(arr,i)));
|
331
|
+
jl_arrayset(ans,elt,i);
|
332
|
+
}
|
333
|
+
} else if(class==rb_cTrueClass || class==rb_cFalseClass) {
|
334
|
+
//ans=jl_alloc_array_1d(jl_bool_type,n);
|
335
|
+
for(i=0;i<n;i++) {
|
336
|
+
elt=jl_box_bool(rb_class_of(rb_ary_entry(arr,i))==rb_cFalseClass ? 0 : 1);
|
337
|
+
jl_arrayset(ans,elt,i);
|
338
|
+
}
|
339
|
+
} else if(class==rb_cString) {
|
340
|
+
//ans=jl_alloc_array_1d(jl_utf8_string_type,n);
|
341
|
+
for(i=0;i<n;i++) {
|
342
|
+
tmp=rb_ary_entry(arr,i);
|
343
|
+
elt=jl_cstr_to_string(StringValuePtr(tmp));
|
344
|
+
jl_arrayset(ans,elt,i);
|
345
|
+
}
|
346
|
+
} else ans=NULL;
|
347
|
+
if(!vect && ans) ans=jl_arrayref(ans,0);
|
348
|
+
return ans;
|
349
|
+
}
|
350
|
+
|
351
|
+
VALUE JuliaVect_initialize(VALUE self, VALUE name)
|
352
|
+
{
|
353
|
+
rb_iv_set(self,"@name",name);
|
354
|
+
rb_iv_set(self,"@type",rb_str_new2("var"));
|
355
|
+
rb_iv_set(self,"@arg",rb_str_new2(""));
|
356
|
+
return self;
|
357
|
+
}
|
358
|
+
|
359
|
+
VALUE JuliaVect_isValid(VALUE self)
|
360
|
+
{
|
361
|
+
jl_value_t* ans;
|
362
|
+
char *name;
|
363
|
+
|
364
|
+
ans = util_getVar(self);
|
365
|
+
|
366
|
+
if(!util_isVector(ans)) {
|
367
|
+
VALUE tmp;
|
368
|
+
tmp=rb_iv_get(self,"@name");
|
369
|
+
name = StringValuePtr(tmp);
|
370
|
+
rb_warn("%s is not a R vector !!!",name);
|
371
|
+
return Qfalse;
|
372
|
+
}
|
373
|
+
return Qtrue;
|
374
|
+
}
|
375
|
+
|
376
|
+
VALUE JuliaVect_length(VALUE self)
|
377
|
+
{
|
378
|
+
jl_value_t* ans;
|
379
|
+
char *name;
|
380
|
+
|
381
|
+
ans = util_getVar(self);
|
382
|
+
|
383
|
+
if(ans==NULL) {
|
384
|
+
//printf("Sortie de length avec nil\n");
|
385
|
+
return Qnil;
|
386
|
+
}
|
387
|
+
|
388
|
+
return INT2NUM(length(ans));
|
389
|
+
}
|
390
|
+
|
391
|
+
VALUE JuliaVect_get(VALUE self)
|
392
|
+
{
|
393
|
+
jl_value_t* ans;
|
394
|
+
VALUE res;
|
395
|
+
char *name;
|
396
|
+
int n,i;
|
397
|
+
VALUE res2;
|
398
|
+
|
399
|
+
ans = util_getVar(self);
|
400
|
+
|
401
|
+
if(ans==NULL) {
|
402
|
+
//printf("Sortie de get avec nil\n");
|
403
|
+
return Qnil;
|
404
|
+
}
|
405
|
+
|
406
|
+
res=util_jl_value_to_VALUE(ans);
|
407
|
+
if(length(ans)==1) res=rb_ary_entry(res,0);
|
408
|
+
return res;
|
409
|
+
}
|
410
|
+
|
411
|
+
VALUE JuliaVect_get_with_arg(VALUE self)
|
412
|
+
{
|
413
|
+
jl_value_t* ans;
|
414
|
+
VALUE res;
|
415
|
+
char *name;
|
416
|
+
int n,i;
|
417
|
+
VALUE res2;
|
418
|
+
|
419
|
+
ans = util_getExpr_with_arg(self);
|
420
|
+
|
421
|
+
if(ans==NULL) {
|
422
|
+
//printf("Sortie de get avec nil\n");
|
423
|
+
return Qnil;
|
424
|
+
}
|
425
|
+
res=util_jl_value_to_VALUE(ans);
|
426
|
+
|
427
|
+
//printf("JuliaVect_get_with_arg: length(ans)=%d\n",length(ans));
|
428
|
+
if (length(ans)==1) res=rb_ary_entry(res,0);
|
429
|
+
|
430
|
+
return res;
|
431
|
+
}
|
432
|
+
|
433
|
+
|
434
|
+
|
435
|
+
// faster than self.to_a[index]
|
436
|
+
// VALUE JuliaVect_aref(VALUE self, VALUE index)
|
437
|
+
// {
|
438
|
+
// jl_value_t* ans;
|
439
|
+
// VALUE res;
|
440
|
+
// int n,i;
|
441
|
+
// i = FIX2INT(index);
|
442
|
+
|
443
|
+
// ans = util_getVar(self);
|
444
|
+
// n=length(ans);
|
445
|
+
// printf("i=%d and n=%d\n",i,n);
|
446
|
+
// if(i<n) {
|
447
|
+
// res=jl_value_to_VALUE(jl_arrayref((jl_array_t *)ans,i));
|
448
|
+
// } else {
|
449
|
+
// res = Qnil;
|
450
|
+
// }
|
451
|
+
// return res;
|
452
|
+
// }
|
453
|
+
|
454
|
+
// VALUE JuliaVect_set(VALUE self,VALUE arr)
|
455
|
+
// {
|
456
|
+
// jl_value_t* ans;
|
457
|
+
// char *name;
|
458
|
+
// VALUE tmp;
|
459
|
+
|
460
|
+
// ans=util_VALUE_to_jl_value(arr);
|
461
|
+
|
462
|
+
// tmp=rb_iv_get(self,"@name");
|
463
|
+
// name = StringValuePtr(tmp);
|
464
|
+
// jl_set_global(jl_main_module, jl_symbol(name),ans);
|
465
|
+
|
466
|
+
// return self;
|
467
|
+
// }
|
468
|
+
|
469
|
+
VALUE JuliaVect_set(VALUE self,VALUE arr)
|
470
|
+
{
|
471
|
+
VALUE tmp;
|
472
|
+
char *cmd;
|
473
|
+
// defineVar(install(".rubyExport"),util_VALUE2jl_value_t*(arr),R_GlobalEnv);
|
474
|
+
// tmp=rb_iv_get(self,"@arg");
|
475
|
+
// util_eval1string(rb_str_cat2(rb_str_cat2(rb_str_dup(rb_iv_get(self,"@name")),StringValuePtr(tmp)),"<-.rubyExport"));
|
476
|
+
jl_set_global(jl_main_module, jl_symbol("_ruby_export_"),util_VALUE_to_jl_value(arr));
|
477
|
+
tmp=rb_str_dup(rb_iv_get(self,"@name"));
|
478
|
+
tmp=rb_str_cat2(tmp,"=_ruby_export_");
|
479
|
+
cmd=StringValuePtr(tmp);
|
480
|
+
// printf("cmd=%s\n",cmd);
|
481
|
+
// jl_eval_string("show(_ruby_export_)");
|
482
|
+
// printf("cmd->done\n");
|
483
|
+
jl_eval_string(cmd);
|
484
|
+
return self;
|
485
|
+
}
|
486
|
+
|
487
|
+
VALUE JuliaVect_assign(VALUE obj, VALUE name,VALUE arr)
|
488
|
+
{
|
489
|
+
jl_value_t* ans;
|
490
|
+
char *tmp;
|
491
|
+
|
492
|
+
ans=util_VALUE_to_jl_value(arr);
|
493
|
+
|
494
|
+
tmp = StringValuePtr(name);
|
495
|
+
jl_set_global(jl_main_module, jl_symbol(tmp),ans);
|
496
|
+
|
497
|
+
return Qnil;
|
498
|
+
}
|
499
|
+
|
500
|
+
VALUE JuliaVect_set_with_arg(VALUE self,VALUE arr)
|
501
|
+
{
|
502
|
+
VALUE tmp;
|
503
|
+
char *cmd;
|
504
|
+
// defineVar(install(".rubyExport"),util_VALUE2jl_value_t*(arr),R_GlobalEnv);
|
505
|
+
// tmp=rb_iv_get(self,"@arg");
|
506
|
+
// util_eval1string(rb_str_cat2(rb_str_cat2(rb_str_dup(rb_iv_get(self,"@name")),StringValuePtr(tmp)),"<-.rubyExport"));
|
507
|
+
jl_set_global(jl_main_module, jl_symbol("_ruby_export_"),util_VALUE_to_jl_value(arr));
|
508
|
+
tmp=rb_str_dup(rb_iv_get(self,"@arg"));
|
509
|
+
tmp=rb_str_cat2(rb_str_dup(rb_iv_get(self,"@name")),StringValuePtr(tmp));
|
510
|
+
tmp=rb_str_cat2(tmp,"=_ruby_export_");
|
511
|
+
cmd=StringValuePtr(tmp);
|
512
|
+
jl_eval_string(cmd);
|
513
|
+
return self;
|
514
|
+
}
|
515
|
+
|
516
|
+
void
|
517
|
+
Init_jl4rb()
|
518
|
+
{
|
519
|
+
VALUE mJulia;
|
520
|
+
|
521
|
+
mJulia = rb_define_module("Julia");
|
522
|
+
|
523
|
+
rb_define_module_function(mJulia, "initJL", Julia_init, 1);
|
524
|
+
|
525
|
+
rb_define_module_function(mJulia, "evalLine", Julia_eval, 2);
|
526
|
+
|
527
|
+
rb_define_module_function(mJulia, "execLine", Julia_exec, 2);
|
528
|
+
|
529
|
+
VALUE cJuliaVect;
|
530
|
+
|
531
|
+
cJuliaVect = rb_define_class_under(mJulia,"Vector",rb_cObject);
|
532
|
+
|
533
|
+
rb_define_module_function(cJuliaVect, "assign", JuliaVect_assign, 2);
|
534
|
+
|
535
|
+
rb_define_method(cJuliaVect,"initialize",JuliaVect_initialize,1);
|
536
|
+
|
537
|
+
rb_define_method(cJuliaVect,"get",JuliaVect_get,0);
|
538
|
+
rb_define_alias(cJuliaVect,"to_a","get");
|
539
|
+
rb_define_alias(cJuliaVect,"value","get");
|
540
|
+
|
541
|
+
rb_define_method(cJuliaVect,"set",JuliaVect_set,1);
|
542
|
+
rb_define_alias(cJuliaVect,"<","set");
|
543
|
+
rb_define_alias(cJuliaVect,"value=","set");
|
544
|
+
|
545
|
+
//method "arg=" defined in eval.rb!! @arg initialized in method "initialize"
|
546
|
+
rb_define_method(cJuliaVect,"get_with_arg",JuliaVect_get_with_arg,0);
|
547
|
+
rb_define_alias(cJuliaVect,"value_with_arg","get_with_arg");
|
548
|
+
rb_define_method(cJuliaVect,"set_with_arg",JuliaVect_set_with_arg,1);
|
549
|
+
rb_define_alias(cJuliaVect,"value_with_arg=","set_with_arg");
|
550
|
+
|
551
|
+
rb_define_method(cJuliaVect,"valid?",JuliaVect_isValid,0);
|
552
|
+
rb_define_method(cJuliaVect,"length",JuliaVect_length,0);
|
553
|
+
//rb_define_method(cJuliaVect,"[]",JuliaVect_aref,1);
|
554
|
+
|
555
|
+
rb_define_attr(cJuliaVect,"name",1,1);
|
556
|
+
rb_define_attr(cJuliaVect,"type",1,1);
|
557
|
+
|
558
|
+
}
|
data/jl4rb.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/package_task'
|
3
|
+
|
4
|
+
PKG_NAME='jl4rb'
|
5
|
+
PKG_VERSION='0.0.4'
|
6
|
+
PKG_FILES=FileList[
|
7
|
+
'Rakefile','jl4rb.gemspec',
|
8
|
+
'ext/jl4rb/*.c',
|
9
|
+
'ext/jl4rb/extconf.rb',
|
10
|
+
'ext/jl4rb/*.h',
|
11
|
+
'ext/jl4rb/MANIFEST',
|
12
|
+
'lib/**/*.rb',
|
13
|
+
'test/**/*.rb'
|
14
|
+
]
|
15
|
+
|
16
|
+
Gem::Specification.new do |s|
|
17
|
+
s.platform = Gem::Platform::RUBY
|
18
|
+
s.summary = "Julia for ruby"
|
19
|
+
s.name = PKG_NAME
|
20
|
+
s.version = PKG_VERSION
|
21
|
+
s.requirements << 'none'
|
22
|
+
s.require_paths = ["lib","ext/jl4rb"]
|
23
|
+
s.files = PKG_FILES.to_a
|
24
|
+
s.extensions = ["ext/jl4rb/extconf.rb"]
|
25
|
+
s.licenses = ['MIT', 'GPL-2']
|
26
|
+
s.description = <<-EOF
|
27
|
+
R is embedded in ruby with some communication support .
|
28
|
+
EOF
|
29
|
+
s.author = "CQLS"
|
30
|
+
s.email= "rdrouilh@gmail.com"
|
31
|
+
s.homepage = "http://cqls.upmf-grenoble.fr"
|
32
|
+
s.rubyforge_project = nil
|
33
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
## Module Julia
|
2
|
+
|
3
|
+
module Julia
|
4
|
+
# Careful!, Julia.exec code, :get => nil does not fetch stdout
|
5
|
+
def Julia.eval(s,opts={})
|
6
|
+
opts={:print=>true,:show=>nil,:simplify=>true,:init=>true,:safe=>true}.merge(opts)
|
7
|
+
#p opts
|
8
|
+
Julia.init if opts[:init] #just in case
|
9
|
+
res=[]
|
10
|
+
input,output="",""
|
11
|
+
s=[s] unless s.is_a? Array
|
12
|
+
s.each_with_index do |line,i| #line here is a command!
|
13
|
+
input << line
|
14
|
+
output=evalLine input, opts[:print]
|
15
|
+
if output.is_a? String and output[0...12]=="__incomplete"
|
16
|
+
if i==s.length - 1 #last!
|
17
|
+
res << {:in => input, :out => output} unless input.empty?
|
18
|
+
else
|
19
|
+
input << "\n"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
res << {:in => input, :out => output}
|
23
|
+
input=""
|
24
|
+
end
|
25
|
+
end
|
26
|
+
if opts[:show]
|
27
|
+
res.each do |cmd|
|
28
|
+
print "in > ";puts cmd[:in]
|
29
|
+
begin print "out> ";puts cmd[:out];end unless cmd[:out]=="__incomplete__"
|
30
|
+
end
|
31
|
+
else
|
32
|
+
res=res[0][:out] if res.length==1 and opts[:simplify]
|
33
|
+
return res
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Careful!, Julia.exec code, :get => nil does not fetch stdout
|
38
|
+
def Julia.exec(code,opts={})
|
39
|
+
opts={:get=>true}.merge(opts)
|
40
|
+
execLine code, opts[:get]
|
41
|
+
end
|
42
|
+
|
43
|
+
def Julia.<(s)
|
44
|
+
Julia.exec(s)
|
45
|
+
end
|
46
|
+
|
47
|
+
def Julia.<<(s)
|
48
|
+
Julia.eval(s)
|
49
|
+
end
|
50
|
+
|
51
|
+
class Vector
|
52
|
+
|
53
|
+
def <<(name)
|
54
|
+
if name.is_a? Symbol
|
55
|
+
@name=name.to_s
|
56
|
+
@type="var"
|
57
|
+
else
|
58
|
+
@name=name
|
59
|
+
@type="expr"
|
60
|
+
end
|
61
|
+
return self
|
62
|
+
end
|
63
|
+
|
64
|
+
def arg=(arg)
|
65
|
+
@arg=arg
|
66
|
+
end
|
67
|
+
|
68
|
+
#this method is the same as the previous one but return self! Let us notice that even by adding return self in the previous one
|
69
|
+
# I could not manage to execute (rvect.arg="[2]").value_with_arg but fortunately rvect.set_arg("[2]").value_with_arg is working!
|
70
|
+
def set_arg(arg)
|
71
|
+
@arg=arg
|
72
|
+
return self
|
73
|
+
end
|
74
|
+
|
75
|
+
def [](key)
|
76
|
+
set_arg("["+(key+1).to_s+"]")
|
77
|
+
get_with_arg
|
78
|
+
end
|
79
|
+
|
80
|
+
def []=(key,val)
|
81
|
+
set_arg("["+(key+1).to_s+"]")
|
82
|
+
set_with_arg(val)
|
83
|
+
end
|
84
|
+
|
85
|
+
def >(arr)
|
86
|
+
res=self.get
|
87
|
+
#puts "res";p @name;p res
|
88
|
+
if res
|
89
|
+
#puts "arr.class:";p arr.class
|
90
|
+
#puts "res.class";p res.class
|
91
|
+
res=[res] unless res.is_a? Array
|
92
|
+
arr.replace(res)
|
93
|
+
else
|
94
|
+
arr.clear
|
95
|
+
end
|
96
|
+
return self
|
97
|
+
end
|
98
|
+
|
99
|
+
=begin #Done directly inside R4rb.c
|
100
|
+
def value_with_arg(arg)
|
101
|
+
old_name,old_type=@name.dup,@type.dup
|
102
|
+
@name,@type=@name+arg,"expr"
|
103
|
+
value
|
104
|
+
@name,@type=old_name,old_type
|
105
|
+
end
|
106
|
+
=end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
module JL
|
113
|
+
def JL.<<(s)
|
114
|
+
Julia << s
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
class String
|
121
|
+
|
122
|
+
def jl4rb
|
123
|
+
Julia << self
|
124
|
+
end
|
125
|
+
|
126
|
+
alias to_jl jl4rb
|
127
|
+
end
|
128
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Julia
|
2
|
+
|
3
|
+
def Julia.init(args={})
|
4
|
+
unless Julia.alive?
|
5
|
+
args={:img=>File.join(ENV["JULIA_DIR"],"lib")}.merge(args) if ENV["JULIA_DIR"]
|
6
|
+
args={:img=>ENV["JULIA_IMG_DIR"]}.merge(args) if ENV["JULIA_IMG_DIR"]
|
7
|
+
@@initJL=Julia.initJL([args[:img]])
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def Julia.alive?
|
12
|
+
defined? @@initJL
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/lib/jl4rb.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'jl4rb'
|
2
|
+
|
3
|
+
Julia.init
|
4
|
+
|
5
|
+
# julia variable
|
6
|
+
if true
|
7
|
+
aa=Julia::Vector.new "a"
|
8
|
+
|
9
|
+
aa < [1,4,3]
|
10
|
+
|
11
|
+
p "a".to_jl
|
12
|
+
|
13
|
+
Julia << "a=[4,7,3,9]"
|
14
|
+
|
15
|
+
p aa.value
|
16
|
+
end
|
17
|
+
|
18
|
+
if true
|
19
|
+
Julia << "b=Dict()"
|
20
|
+
|
21
|
+
bb=Julia::Vector.new ""
|
22
|
+
bb << 'b["toto"]'
|
23
|
+
|
24
|
+
bb < [1,4,66]
|
25
|
+
|
26
|
+
p 'b["toto"]'.to_jl
|
27
|
+
|
28
|
+
Julia << 'b["toto"]=[4,7,3,99]'
|
29
|
+
|
30
|
+
p bb.value
|
31
|
+
end
|
data/test/testWithArg.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'jl4rb'
|
2
|
+
|
3
|
+
Julia.init
|
4
|
+
|
5
|
+
aa=Julia::Vector.new "a"
|
6
|
+
|
7
|
+
aa < [1,4,3]
|
8
|
+
|
9
|
+
p "a".to_jl
|
10
|
+
|
11
|
+
# In ruby
|
12
|
+
p aa[1]
|
13
|
+
|
14
|
+
# In Julia
|
15
|
+
aa.set_arg("[2]")
|
16
|
+
|
17
|
+
p aa.get_with_arg
|
18
|
+
|
19
|
+
aa.set_with_arg (12)
|
20
|
+
|
21
|
+
p "a".to_jl
|
22
|
+
|
23
|
+
aa[1]=33.0
|
24
|
+
|
25
|
+
p "a".to_jl
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jl4rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- CQLS
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-07-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: |
|
14
|
+
R is embedded in ruby with some communication support .
|
15
|
+
email: rdrouilh@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions:
|
18
|
+
- ext/jl4rb/extconf.rb
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- Rakefile
|
22
|
+
- jl4rb.gemspec
|
23
|
+
- ext/jl4rb/jl4rb.c
|
24
|
+
- ext/jl4rb/extconf.rb
|
25
|
+
- ext/jl4rb/MANIFEST
|
26
|
+
- lib/jl4rb.rb
|
27
|
+
- lib/jl4rb/jl2rb_eval.rb
|
28
|
+
- lib/jl4rb/jl2rb_init.rb
|
29
|
+
- test/testDynArray.rb
|
30
|
+
- test/testJLVector.rb
|
31
|
+
- test/testWithArg.rb
|
32
|
+
homepage: http://cqls.upmf-grenoble.fr
|
33
|
+
licenses:
|
34
|
+
- MIT
|
35
|
+
- GPL-2
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
- ext/jl4rb
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements:
|
53
|
+
- none
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.0.14
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Julia for ruby
|
59
|
+
test_files: []
|