hilbert 0.0.2700000
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +5 -0
- data/Gemfile +9 -0
- data/Guardfile +33 -0
- data/LICENSE.txt +22 -0
- data/README.md +159 -0
- data/Rakefile +20 -0
- data/bin/qlang +29 -0
- data/core/Q/Lexer.hs +9 -0
- data/core/Q/Parser.hs +9 -0
- data/core/Q.hs +19 -0
- data/ext/qlang/QMatrix/q_matrix.c +0 -0
- data/ext/qlang/extconf.rb +3 -0
- data/ext/qlang/qlang.c +65 -0
- data/ext/qlang/qlang.h +6 -0
- data/legacy_rspec/langs/Haskell/ex1_after.hs +74 -0
- data/legacy_rspec/langs/Haskell/ex1_before.hs +74 -0
- data/legacy_rspec/langs/Python/ex1_after.py +93 -0
- data/legacy_rspec/langs/Python/ex1_before.py +95 -0
- data/legacy_rspec/langs/R/ex1_after.R +89 -0
- data/legacy_rspec/langs/R/ex1_before.R +89 -0
- data/legacy_rspec/objects/list_spec.rb +31 -0
- data/legacy_rspec/objects/matrix_spec.rb +55 -0
- data/legacy_rspec/objects/vector_spec.rb +47 -0
- data/lib/qlang/api/func_api.rb +17 -0
- data/lib/qlang/api/integral_api.rb +16 -0
- data/lib/qlang/api/limit_api.rb +22 -0
- data/lib/qlang/api/list_api.rb +16 -0
- data/lib/qlang/api/matrix_api.rb +20 -0
- data/lib/qlang/api/sigma_api.rb +16 -0
- data/lib/qlang/api/vector_api.rb +19 -0
- data/lib/qlang/api.rb +23 -0
- data/lib/qlang/exec.rb +64 -0
- data/lib/qlang/iq.rb +45 -0
- data/lib/qlang/lexer/base.rb +107 -0
- data/lib/qlang/lexer/formula_lexer.rb +20 -0
- data/lib/qlang/lexer/main_lexer.rb +34 -0
- data/lib/qlang/lexer/tokens.rb +94 -0
- data/lib/qlang/lexer.rb +11 -0
- data/lib/qlang/meta_info.rb +27 -0
- data/lib/qlang/parser/base.rb +7 -0
- data/lib/qlang/parser/formula_parser.rb +36 -0
- data/lib/qlang/parser/func_parser.rb +15 -0
- data/lib/qlang/parser/integral_parser.rb +15 -0
- data/lib/qlang/parser/limit_parser.rb +16 -0
- data/lib/qlang/parser/list_parser.rb +12 -0
- data/lib/qlang/parser/matrix_parser.rb +17 -0
- data/lib/qlang/parser/sigma_parser.rb +17 -0
- data/lib/qlang/parser/vector_parser.rb +13 -0
- data/lib/qlang/parser.rb +101 -0
- data/lib/qlang/utils/langs.yml +7 -0
- data/lib/qlang/utils/ruby_ext.rb +54 -0
- data/lib/qlang/version.rb +3 -0
- data/lib/qlang.rb +37 -0
- data/qlang.gemspec +28 -0
- data/test/internal/test_tokens.rb +35 -0
- data/test/interpreter/base.rb +17 -0
- data/test/interpreter/test_differential.rb +43 -0
- data/test/interpreter/test_function.rb +44 -0
- data/test/interpreter/test_general.rb +12 -0
- data/test/interpreter/test_integral.rb +38 -0
- data/test/interpreter/test_limit.rb +37 -0
- data/test/interpreter/test_matrix.rb +70 -0
- data/test/interpreter/test_sigma.rb +25 -0
- data/test/interpreter/test_vector.rb +28 -0
- data/test/langs/test_r.rb +32 -0
- data/test/langs/test_ruby.rb +9 -0
- data/test/minitest_helper.rb +8 -0
- data/test/q_matrix/test_q_matrix.rb +13 -0
- data/test/test_qlang.rb +24 -0
- metadata +203 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
# module ::Kernel
|
2
|
+
# def recursive_require(str)
|
3
|
+
# Dir["#{$:.first}/#{str}"].each do |file|
|
4
|
+
# require file
|
5
|
+
# end
|
6
|
+
# end
|
7
|
+
# end
|
8
|
+
|
9
|
+
class ::String
|
10
|
+
def parentheses
|
11
|
+
"(#{self})"
|
12
|
+
end
|
13
|
+
|
14
|
+
def braces
|
15
|
+
"{#{self}}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def rm(str_or_rgx)
|
19
|
+
gsub(str_or_rgx, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
def rm!(str_or_rgx)
|
23
|
+
gsub!(str_or_rgx, '')
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def rms!(*str_or_rgxs)
|
28
|
+
str_or_rgxs.each do |str_or_rgx|
|
29
|
+
rm!(str_or_rgx)
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def split_by_sp
|
35
|
+
split(/ +/)
|
36
|
+
end
|
37
|
+
|
38
|
+
# FIX:
|
39
|
+
def equalize!
|
40
|
+
rms!(/\A +/, / +\z/)
|
41
|
+
if self =~ /\A\(/ && self =~ /\)\z/
|
42
|
+
rms!(/\A\(/, /\)\z/)
|
43
|
+
rms!(/\A +/, / +\z/)
|
44
|
+
else
|
45
|
+
self
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class ::Array
|
51
|
+
def join_by_sp
|
52
|
+
join(' ')
|
53
|
+
end
|
54
|
+
end
|
data/lib/qlang.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Ruby stlib
|
2
|
+
require 'kconv'
|
3
|
+
require 'matrix'
|
4
|
+
require 'singleton'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
$:.unshift(File.dirname(__FILE__))
|
8
|
+
# Q core
|
9
|
+
require 'qlang/meta_info'
|
10
|
+
require 'qlang/utils/ruby_ext'
|
11
|
+
require 'qlang/lexer'
|
12
|
+
require 'qlang/parser'
|
13
|
+
|
14
|
+
module Qlang
|
15
|
+
$meta_info = MetaInfo.instance
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
def compile(str)
|
20
|
+
lexed = Lexer.execute(str)
|
21
|
+
Kconv.tosjis(Parser.execute(lexed))
|
22
|
+
end
|
23
|
+
|
24
|
+
$meta_info.langs_hash.keys.each do |lang_name|
|
25
|
+
define_method("to_#{lang_name}") do |*opts|
|
26
|
+
$meta_info.lang = lang_name.to_sym
|
27
|
+
$meta_info.opts = opts
|
28
|
+
Qlang
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Make alias as Q
|
37
|
+
Q = Qlang
|
data/qlang.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'qlang/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'hilbert'
|
8
|
+
spec.version = Qlang::VERSION
|
9
|
+
spec.authors = ['gogotanaka']
|
10
|
+
spec.email = ['mail@tanakakazuki.com']
|
11
|
+
spec.extensions = ['ext/qlang/extconf.rb']
|
12
|
+
spec.summary = %q{Enjoy MATH!}
|
13
|
+
spec.description = %q{Enjoy MATH!}
|
14
|
+
spec.homepage = 'http://q-language.org/'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.add_dependency 'dydx', '~> 0.1.41421'
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler'
|
25
|
+
spec.add_development_dependency 'rake'
|
26
|
+
spec.add_development_dependency 'rake-compiler'
|
27
|
+
spec.add_development_dependency 'minitest'
|
28
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestTokens < MiniTest::Unit::TestCase
|
4
|
+
include Qlang::Lexer::Tokens
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def full_match(rgx, str)
|
9
|
+
assert_equal(0, rgx =~ str)
|
10
|
+
assert_equal(str, $&)
|
11
|
+
end
|
12
|
+
|
13
|
+
def not_match(rgx, str)
|
14
|
+
assert_equal(nil, rgx =~ str)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_nums
|
18
|
+
full_match(NUM, '1')
|
19
|
+
full_match(NUM, '234987423')
|
20
|
+
full_match(NUM, '23423948.298743')
|
21
|
+
full_match(NUM, 'e')
|
22
|
+
full_match(NUM, 'pi')
|
23
|
+
not_match(NUM, 'a')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_function
|
27
|
+
full_match(/[fgh]\(\w( ?, ?\w)*\) ?= ?[^\r\n]+/, 'f(x) = xy')
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_differentiate
|
31
|
+
rgx = /d\/d[a-zA-Z] .*/
|
32
|
+
full_match(rgx, 'd/dx sin(x)')
|
33
|
+
full_match(rgx, 'd/dz z^2')
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'qlang/iq'
|
2
|
+
|
3
|
+
class TestInterpreterBase < MiniTest::Unit::TestCase
|
4
|
+
# TODO: opposite
|
5
|
+
def assert_iq_equal(input, output)
|
6
|
+
assert_equal(Qlang::Iq.execute(input), output)
|
7
|
+
end
|
8
|
+
|
9
|
+
def assert_def_func(input, output)
|
10
|
+
assert_equal(Qlang::Iq.execute(input), output)
|
11
|
+
end
|
12
|
+
|
13
|
+
def assert_cal_func(input, output)
|
14
|
+
assert_equal(Qlang::Iq.execute(input), output)
|
15
|
+
reset
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestDifferential < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_general
|
8
|
+
assert_iq_equal(
|
9
|
+
'd/dx(e ** x)',
|
10
|
+
'e ^ x'
|
11
|
+
)
|
12
|
+
|
13
|
+
assert_iq_equal(
|
14
|
+
'd/dx(x ** 2)',
|
15
|
+
'2x'
|
16
|
+
)
|
17
|
+
|
18
|
+
assert_iq_equal(
|
19
|
+
'd/dx(x * 2)',
|
20
|
+
'2'
|
21
|
+
)
|
22
|
+
|
23
|
+
assert_iq_equal(
|
24
|
+
'd/dx( sin(x) )',
|
25
|
+
'cos( x )'
|
26
|
+
)
|
27
|
+
|
28
|
+
assert_iq_equal(
|
29
|
+
'd/dx(log( x ))',
|
30
|
+
'1 / x'
|
31
|
+
)
|
32
|
+
|
33
|
+
assert_iq_equal(
|
34
|
+
'd/dx cos(x)',
|
35
|
+
'- sin( x )'
|
36
|
+
)
|
37
|
+
|
38
|
+
assert_iq_equal(
|
39
|
+
'd/dx xx',
|
40
|
+
'2x'
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestFunction < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_general
|
8
|
+
assert_def_func('f(x, y) = x + y', 'x + y')
|
9
|
+
assert_cal_func('f( 4, 5 )', '9.0')
|
10
|
+
|
11
|
+
assert_def_func('f( x , y) = xy', 'x * y')
|
12
|
+
assert_cal_func('f( 3, 9 )', '27.0')
|
13
|
+
|
14
|
+
assert_def_func('f(x, y) = xy^2', 'x * ( y ** 2 )')
|
15
|
+
assert_cal_func('f( 3, 2 )', '12.0')
|
16
|
+
|
17
|
+
assert_def_func('f(x, y) = xy^2', 'x * ( y ** 2 )')
|
18
|
+
assert_cal_func('df/dx', 'y ^ 2')
|
19
|
+
|
20
|
+
assert_def_func('g(x) = x ^ 2', 'x ** 2')
|
21
|
+
assert_cal_func('g(2)', '4.0')
|
22
|
+
|
23
|
+
assert_def_func('h(x) = e ^ 2', 'e ** 2')
|
24
|
+
assert_cal_func('h(2)', '7.3890560989306495')
|
25
|
+
|
26
|
+
assert_def_func('h(x) = pix', 'pi * x')
|
27
|
+
assert_cal_func('h(3)', '9.42477796076938')
|
28
|
+
|
29
|
+
assert_def_func('h(x) = pie', 'pi * e')
|
30
|
+
assert_cal_func('h(2)', '8.539734222673566')
|
31
|
+
|
32
|
+
assert_def_func('h(x) = ( 1 / ( 2pi ) ^ ( 1 / 2.0 ) ) * e ^ ( - x ^ 2 / 2 )', '( ( 4503599627370496 / 6369051672525773 ) / ( pi ** 0.5 ) ) * ( e ** ( ( - ( x ** 2 ) ) / 2 ) )')
|
33
|
+
assert_cal_func('S( h(x)dx )[-oo..oo]', '1.0')
|
34
|
+
|
35
|
+
assert_def_func('f(x) = sin(x)', 'sin( x )')
|
36
|
+
assert_cal_func('f(pi)', '0.0')
|
37
|
+
|
38
|
+
assert_def_func('f(x) = cos(x)', 'cos( x )')
|
39
|
+
assert_cal_func('f(pi)', '-1.0')
|
40
|
+
|
41
|
+
assert_def_func('f(x) = log(x)', 'log( x )')
|
42
|
+
assert_cal_func('f(e)', '1.0')
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestIntegral < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_general
|
8
|
+
assert_iq_equal(
|
9
|
+
'S( log(x)dx )[0..1]',
|
10
|
+
'-oo'
|
11
|
+
)
|
12
|
+
|
13
|
+
assert_iq_equal(
|
14
|
+
'S( sin(x)dx )[0..pi]',
|
15
|
+
'2.0'
|
16
|
+
)
|
17
|
+
|
18
|
+
assert_iq_equal(
|
19
|
+
'S( cos(x)dx )[0..pi]',
|
20
|
+
'0.0'
|
21
|
+
)
|
22
|
+
|
23
|
+
assert_iq_equal(
|
24
|
+
'S( cos(x)dx )[0..pi]',
|
25
|
+
'0.0'
|
26
|
+
)
|
27
|
+
|
28
|
+
assert_iq_equal(
|
29
|
+
'S(2pi dx)[0..1]',
|
30
|
+
'6.28318531'
|
31
|
+
)
|
32
|
+
|
33
|
+
assert_iq_equal(
|
34
|
+
'S(xx dx)[0..1]',
|
35
|
+
'0.33333333'
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestLimit < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def assert_iq_equal(output, input)
|
8
|
+
assert_equal(Qlang::Iq.execute(input), output)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_general
|
12
|
+
assert_iq_equal(
|
13
|
+
'oo',
|
14
|
+
'lim[x->0] 1/x'
|
15
|
+
)
|
16
|
+
|
17
|
+
assert_iq_equal(
|
18
|
+
'10.0',
|
19
|
+
'lim[x->10] x'
|
20
|
+
)
|
21
|
+
|
22
|
+
# assert_iq_equal(
|
23
|
+
# '2.7182682371744895',
|
24
|
+
# 'lim[x->oo] (1 + 1/x)^x'
|
25
|
+
# )
|
26
|
+
|
27
|
+
assert_iq_equal(
|
28
|
+
'oo',
|
29
|
+
'lim[x->oo] x'
|
30
|
+
)
|
31
|
+
|
32
|
+
assert_iq_equal(
|
33
|
+
'0.0',
|
34
|
+
'lim[x->0] x'
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestMatrix < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_integer
|
8
|
+
assert_iq_equal(
|
9
|
+
'(1 2 3; 4 5 6)',
|
10
|
+
'(1 2 3; 4 5 6)'
|
11
|
+
)
|
12
|
+
|
13
|
+
assert_iq_equal(
|
14
|
+
'(1 2 3; 4 5 6) + (1 2 3; 4 5 6)',
|
15
|
+
'(2 4 6; 8 10 12)'
|
16
|
+
)
|
17
|
+
|
18
|
+
assert_iq_equal(
|
19
|
+
'(1 2 3; 4 5 6) - (2 4 1; 8 3 9)',
|
20
|
+
'(-1 -2 2; -4 2 -3)'
|
21
|
+
)
|
22
|
+
|
23
|
+
assert_iq_equal(
|
24
|
+
'(1 2; 3 4) * (1 2; 3 4)',
|
25
|
+
'(7 10; 15 22)'
|
26
|
+
)
|
27
|
+
|
28
|
+
assert_iq_equal(
|
29
|
+
'(1 2; 3 4) ** 2',
|
30
|
+
'(7 10; 15 22)'
|
31
|
+
)
|
32
|
+
|
33
|
+
assert_iq_equal(
|
34
|
+
'(1 2; 3 4) ** 2',
|
35
|
+
'(7 10; 15 22)'
|
36
|
+
)
|
37
|
+
|
38
|
+
assert_iq_equal(
|
39
|
+
'(1 2; 3 4) * (1 2)',
|
40
|
+
'(5 11)'
|
41
|
+
)
|
42
|
+
|
43
|
+
assert_iq_equal(
|
44
|
+
'(1 2 3; 4 5 6)t',
|
45
|
+
'(1 4; 2 5; 3 6)'
|
46
|
+
)
|
47
|
+
|
48
|
+
assert_iq_equal(
|
49
|
+
'(1 2 3
|
50
|
+
4 5 6) +
|
51
|
+
(1 2 3
|
52
|
+
4 5 6)',
|
53
|
+
'(2 4 6; 8 10 12)'
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_float
|
58
|
+
assert_iq_equal(
|
59
|
+
'(1.0 2.0 3
|
60
|
+
4.2 5.3 6)t',
|
61
|
+
'(1.0 4.2; 2.0 5.3; 3 6)'
|
62
|
+
)
|
63
|
+
|
64
|
+
assert_iq_equal(
|
65
|
+
'(1.0 2.0 3
|
66
|
+
4.2 5.3 6)t',
|
67
|
+
'(1.0 4.2; 2.0 5.3; 3 6)'
|
68
|
+
)
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
require 'minitest_helper'
|
4
|
+
|
5
|
+
class TestSigma < TestInterpreterBase
|
6
|
+
def setup
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_general
|
10
|
+
assert_iq_equal(
|
11
|
+
'∑[x=0,10] x',
|
12
|
+
'55.0'
|
13
|
+
)
|
14
|
+
|
15
|
+
assert_iq_equal(
|
16
|
+
'∑[x=0, 10] x^2',
|
17
|
+
'385.0'
|
18
|
+
)
|
19
|
+
|
20
|
+
assert_iq_equal(
|
21
|
+
'∑[x=0, 10] x^3',
|
22
|
+
'3025.0'
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestVector < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_integer
|
8
|
+
assert_iq_equal(
|
9
|
+
'(1 2 3)',
|
10
|
+
'(1 2 3)'
|
11
|
+
)
|
12
|
+
|
13
|
+
assert_iq_equal(
|
14
|
+
'(1 2 3) + (1 2 3)',
|
15
|
+
'(2 4 6)'
|
16
|
+
)
|
17
|
+
|
18
|
+
assert_iq_equal(
|
19
|
+
'(1 2 3 ) + ( 1 2 3 )',
|
20
|
+
'(2 4 6)'
|
21
|
+
)
|
22
|
+
|
23
|
+
assert_iq_equal(
|
24
|
+
'(1 2 3) - (1 2 3) - (1 2 3)',
|
25
|
+
'(-1 -2 -3)'
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestR < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def assert_r_compl_eq(output, input)
|
8
|
+
assert_equal(output, Q.to_r.compile(input))
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_function
|
12
|
+
assert_r_compl_eq(
|
13
|
+
"f <- function(x, y) x + y",
|
14
|
+
'f(x, y) = x + y'
|
15
|
+
)
|
16
|
+
|
17
|
+
assert_r_compl_eq(
|
18
|
+
"g <- function(x) x ^ 2",
|
19
|
+
'g(x) = x ^ 2'
|
20
|
+
)
|
21
|
+
|
22
|
+
assert_r_compl_eq(
|
23
|
+
"g <- function(x) x ^ (2 + 2)",
|
24
|
+
'g(x) = x ^ (2 + 2)'
|
25
|
+
)
|
26
|
+
|
27
|
+
assert_r_compl_eq(
|
28
|
+
"h <- function(a, b, c) a ^ 2 + b ^ 2 + c ^ 2",
|
29
|
+
'h(a, b, c) = a ^ 2 + b ^ 2 + c ^ 2'
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
data/test/test_qlang.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestQlang < MiniTest::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
end
|
6
|
+
|
7
|
+
def assert_to_ruby(input, output)
|
8
|
+
assert_equal(Q.to_ruby.compile(input), output)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_basis
|
12
|
+
refute_nil ::Qlang::VERSION
|
13
|
+
assert_equal(Qlang, Q)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_demo_code
|
17
|
+
assert_to_ruby('d/dx(sin(x))', 'd/dx(sin(x))')
|
18
|
+
assert_to_ruby('d/dx(log(x))', 'd/dx(log(x))')
|
19
|
+
assert_to_ruby('f(x, y) = x + y', 'f(x, y) <= x + y')
|
20
|
+
assert_equal(Matrix[[1, 2, 3], [4, 5, 6]].to_q, '(1 2 3; 4 5 6)')
|
21
|
+
assert_equal(Vector[1, 2, 3].to_q, '(1 2 3)')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|