qlang 0.0.27182110 → 0.0.27182120
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 +4 -4
- data/README.md +15 -4
- data/bin/qlang +1 -1
- data/lib/qlang.rb +2 -2
- data/lib/qlang/api.rb +2 -0
- data/lib/qlang/api/limit_api.rb +22 -0
- data/lib/qlang/api/sigma_api.rb +16 -0
- data/lib/qlang/lexer/base.rb +19 -14
- data/lib/qlang/lexer/main_lexer.rb +5 -0
- data/lib/qlang/lexer/tokens.rb +7 -1
- data/lib/qlang/parser.rb +15 -5
- data/lib/qlang/parser/limit_parser.rb +16 -0
- data/lib/qlang/parser/sigma_parser.rb +17 -0
- data/lib/qlang/utils/ruby_ext.rb +8 -0
- data/lib/qlang/version.rb +1 -1
- data/test/interpreter/test_limit.rb +28 -0
- data/test/interpreter/test_sigma.rb +24 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82f393f67556cb1f5e6e37eba4a70f75b5e3357d
|
4
|
+
data.tar.gz: 660f56cb8a0fbae5d321ad3e2b9ca888719fa4c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e40198040a6e4046a5d8fa0e9dd04fb3c8ee5e2ea7fbac5ad47cc6cd22c3c0fa07a69960dc938ce695aaf22fa93f0260037b539ae5bb9d2703f4e92460cf1da
|
7
|
+
data.tar.gz: 111757064ce64d1048684a1ea79a1cbdaa4c10b8bb81a20c113dbbee5612891c3a51f5e9ec0671c537a3e7c626b371d9b940ac346ecae7fe757b2bbec869937b
|
data/README.md
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
|
11
11
|
#### Q-language can be.
|
12
12
|
|
13
|
+
Q let you know the sense of mathematics with Keyboard same as with a pen.
|
13
14
|
|
14
15
|
```
|
15
16
|
+---Discret world---+ +------mathematics-----+
|
@@ -19,6 +20,11 @@
|
|
19
20
|
+-------------------+ +----------------------+
|
20
21
|
```
|
21
22
|
|
23
|
+
## Demo
|
24
|
+
|
25
|
+
Below code is input and output for interpreter of q-lang
|
26
|
+
|
27
|
+
(you can try it by `qlang -i`)
|
22
28
|
|
23
29
|
### Differentiate
|
24
30
|
|
@@ -85,15 +91,15 @@ Install qlang gme.
|
|
85
91
|
|
86
92
|
### Compile into R
|
87
93
|
|
88
|
-
$ qlang -
|
94
|
+
$ qlang -r foo.q
|
89
95
|
|
90
96
|
### Compile into Ruby
|
91
97
|
|
92
|
-
$ qlang -
|
98
|
+
$ qlang -rb foo.q
|
93
99
|
|
94
100
|
### Compile into Python
|
95
101
|
|
96
|
-
$ qlang -
|
102
|
+
$ qlang -py foo.q
|
97
103
|
|
98
104
|
|
99
105
|
## Use as math template within other langs
|
@@ -114,7 +120,7 @@ Q.E.D
|
|
114
120
|
end
|
115
121
|
```
|
116
122
|
|
117
|
-
$ qlang -
|
123
|
+
$ qlang -rb example.rb
|
118
124
|
|
119
125
|
|
120
126
|
```rb
|
@@ -129,6 +135,11 @@ class ExampleClass
|
|
129
135
|
end
|
130
136
|
```
|
131
137
|
|
138
|
+
## Interpreter
|
139
|
+
|
140
|
+
$ qlang -i
|
141
|
+
Q:->
|
142
|
+
|
132
143
|
## Contributing
|
133
144
|
|
134
145
|
Welcome any your PR or issue.
|
data/bin/qlang
CHANGED
data/lib/qlang.rb
CHANGED
@@ -4,11 +4,11 @@ require 'matrix'
|
|
4
4
|
require 'singleton'
|
5
5
|
require 'yaml'
|
6
6
|
|
7
|
+
$:.unshift(File.dirname(__FILE__))
|
7
8
|
# Q core
|
9
|
+
require 'qlang/utils/ruby_ext'
|
8
10
|
require 'qlang/lexer'
|
9
11
|
require 'qlang/parser'
|
10
|
-
require 'qlang/utils/ruby_ext'
|
11
|
-
require "qlang/version"
|
12
12
|
|
13
13
|
module Qlang
|
14
14
|
# $meta_info indicate what and how to do.
|
data/lib/qlang/api.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module LimitApi
|
4
|
+
def self.execute(formula, var, close_to)
|
5
|
+
case $meta_info.lang
|
6
|
+
# TODO: I know what you want to say.......!
|
7
|
+
when :ruby
|
8
|
+
case close_to
|
9
|
+
when 'oo'
|
10
|
+
"temp_cal_f(#{var}) <= #{formula};
|
11
|
+
temp_cal_f(100000)"
|
12
|
+
else
|
13
|
+
"temp_cal_f(#{var}) <= #{formula};
|
14
|
+
temp_cal_f(#{close_to} + Float::EPSILON ** 20)"
|
15
|
+
end
|
16
|
+
else
|
17
|
+
fail "List is not implemented for #{$meta_info.lang_str}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Qlang
|
2
|
+
module Api
|
3
|
+
module SigmaApi
|
4
|
+
def self.execute(formula, var, from, to)
|
5
|
+
case $meta_info.lang
|
6
|
+
# TODO: I know what you want to say.
|
7
|
+
when :ruby
|
8
|
+
"temp_cal_f(#{var}) <= #{formula};
|
9
|
+
(#{from}..#{to}).inject(0) {|sum, i| sum+=temp_cal_f(i) }"
|
10
|
+
else
|
11
|
+
fail "List is not implemented for #{$meta_info.lang_str}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/qlang/lexer/base.rb
CHANGED
@@ -12,7 +12,7 @@ module Qlang
|
|
12
12
|
def rule(pattern, &token)
|
13
13
|
token ||= proc { :NULL }
|
14
14
|
@token_rule_hash ||= {}
|
15
|
-
@token_rule_hash[
|
15
|
+
@token_rule_hash[pattern] = token.call
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -22,7 +22,7 @@ module Qlang
|
|
22
22
|
until ss.eos?
|
23
23
|
scan_rslt, ss = scan(ss)
|
24
24
|
if scan_rslt
|
25
|
-
@lexeds << scan_rslt unless scan_rslt == :NULL
|
25
|
+
@lexeds << scan_rslt unless scan_rslt[:token] == :NULL
|
26
26
|
else
|
27
27
|
fail "I'm so sorry, something wrong. Please feel free to report this."
|
28
28
|
end
|
@@ -31,9 +31,13 @@ module Qlang
|
|
31
31
|
|
32
32
|
def scan(ss)
|
33
33
|
scan_rslt = nil
|
34
|
-
token_rule_hash.each do |
|
35
|
-
if ss.scan(
|
36
|
-
scan_rslt =
|
34
|
+
token_rule_hash.each do |pattern, token|
|
35
|
+
if ss.scan(pattern)
|
36
|
+
scan_rslt = {
|
37
|
+
token: token,
|
38
|
+
value: ss[0],
|
39
|
+
els: 4.times.inject([]) { |s,i|s << ss[i+1] }.compact
|
40
|
+
}
|
37
41
|
break
|
38
42
|
end
|
39
43
|
end
|
@@ -42,17 +46,18 @@ module Qlang
|
|
42
46
|
|
43
47
|
# Accessor
|
44
48
|
## GET(without side effect)
|
45
|
-
def
|
46
|
-
|
49
|
+
def get_value(num)
|
50
|
+
num = num.to_i
|
51
|
+
@lexeds[num][:value]
|
47
52
|
end
|
48
53
|
|
49
|
-
def
|
54
|
+
def get_els(num)
|
50
55
|
num = num.to_i
|
51
|
-
@lexeds[num]
|
56
|
+
@lexeds[num][:els]
|
52
57
|
end
|
53
58
|
|
54
59
|
def token_str
|
55
|
-
@lexeds.map.with_index { |lexed, i| ":#{lexed
|
60
|
+
@lexeds.map.with_index { |lexed, i| ":#{lexed[:token]}#{i}" }.join
|
56
61
|
end
|
57
62
|
|
58
63
|
def token_rule_hash
|
@@ -75,18 +80,18 @@ module Qlang
|
|
75
80
|
range = (range.first.to_i)..(range.last.to_i)
|
76
81
|
value = values[range].join
|
77
82
|
range.count.times { @lexeds.delete_at(range.first) }
|
78
|
-
@lexeds.insert(range.first, { token
|
83
|
+
@lexeds.insert(range.first, { token: token, value: value })
|
79
84
|
end
|
80
85
|
|
81
86
|
# Legacy Accessor
|
82
87
|
def values
|
83
|
-
@lexeds.map { |lexed| lexed
|
88
|
+
@lexeds.map { |lexed| lexed[:value] }
|
84
89
|
end
|
85
90
|
|
86
91
|
private
|
87
92
|
def parsed_at!(token_position, parsed)
|
88
93
|
@lexeds.delete_at(token_position)
|
89
|
-
@lexeds.insert(token_position, { R: parsed })
|
94
|
+
@lexeds.insert(token_position, { token: :R, value: parsed })
|
90
95
|
end
|
91
96
|
|
92
97
|
def parsed_between!(token_range, parsed)
|
@@ -94,7 +99,7 @@ module Qlang
|
|
94
99
|
token_range.count.times do
|
95
100
|
@lexeds.delete_at(start_pos)
|
96
101
|
end
|
97
|
-
@lexeds.insert(start_pos, { R: parsed })
|
102
|
+
@lexeds.insert(start_pos, { token: :R, value: parsed })
|
98
103
|
end
|
99
104
|
|
100
105
|
end
|
@@ -4,10 +4,15 @@ module Qlang
|
|
4
4
|
rule(/(#{FUNCCV})#{ANYSP}#{EQL}#{ANYSP}(#{FORMULA})/) { :def_func }
|
5
5
|
rule(/#{ITGRLSYM}#{ANYSP}#{LPRN}(#{ANYSTR})#{RPRN}#{LBRCT}(#{ANYSTR})#{RBRCT}/) { :integral }
|
6
6
|
rule(/d\/d(#{VAR}) (#{FORMULA})/) { :differential }
|
7
|
+
|
8
|
+
rule(/lim#{LBRCT}(#{VAR})#{RSARW}(#{VARNUM})#{RBRCT} (#{FORMULA})/) { :limit }
|
9
|
+
|
7
10
|
rule(/#{LPRN}(#{NUMS_BY_SP})#{RPRN}/) { :vector }
|
8
11
|
rule(/#{LPRN}(#{NUMS_BY_SP_BY_SCLN_OR_NELN})#{RPRN}t/m) { :tmatrix }
|
9
12
|
rule(/#{LPRN}(#{NUMS_BY_SP_BY_SCLN_OR_NELN})#{RPRN}/m) { :matrix }
|
10
13
|
|
14
|
+
rule(/∑#{LBRCT}(#{VAR})=(#{INT}),#{ANYSP}(#{INT})#{RBRCT} (#{FORMULA})/) { :sigma }
|
15
|
+
|
11
16
|
rule(/#{FUNCCN}/) { :FUNCCN }
|
12
17
|
|
13
18
|
rule(/#{LPRN}/) { :LPRN }
|
data/lib/qlang/lexer/tokens.rb
CHANGED
@@ -6,7 +6,8 @@ module Qlang
|
|
6
6
|
FLO = /[0-9]+\.[0-9]+/
|
7
7
|
E = /e/
|
8
8
|
PI = /pi/
|
9
|
-
|
9
|
+
INF = /oo/
|
10
|
+
NUM = /(?:#{FLO}|#{INT}|#{E}|#{PI}|#{INF})/
|
10
11
|
|
11
12
|
# FUNCTION
|
12
13
|
LPRN = /\(/
|
@@ -55,6 +56,11 @@ module Qlang
|
|
55
56
|
SCLN = /;/
|
56
57
|
CMA = /\,/
|
57
58
|
EQL = /\=/
|
59
|
+
|
60
|
+
RSARW = '->'
|
61
|
+
LSARW = '<-'
|
62
|
+
RDARW = '=>'
|
63
|
+
LDARW = '<='
|
58
64
|
SP = / /
|
59
65
|
NLIN = /(\r|\n)/
|
60
66
|
|
data/lib/qlang/parser.rb
CHANGED
@@ -6,6 +6,9 @@ require 'qlang/parser/vector_parser'
|
|
6
6
|
require 'qlang/parser/list_parser'
|
7
7
|
require 'qlang/parser/func_parser'
|
8
8
|
require 'qlang/parser/integral_parser'
|
9
|
+
require 'qlang/parser/limit_parser'
|
10
|
+
require 'qlang/parser/sigma_parser'
|
11
|
+
|
9
12
|
require 'qlang/parser/formula_parser'
|
10
13
|
|
11
14
|
module Qlang
|
@@ -19,8 +22,8 @@ module Qlang
|
|
19
22
|
fail "I'm so sorry, something wrong. Please feel free to report this." if Time.now > time + 10
|
20
23
|
|
21
24
|
case lexed.token_str
|
22
|
-
when /:(vector)(\d+)/, /:(matrix)(\d+)/, /:(tmatrix)(\d+)/, /:(integral)(\d+)/, /:(def_func)(\d+)/, /:(differential)(\d+)/
|
23
|
-
token_els = lexed
|
25
|
+
when /:(vector)(\d+)/, /:(matrix)(\d+)/, /:(tmatrix)(\d+)/, /:(integral)(\d+)/, /:(def_func)(\d+)/, /:(differential)(\d+)/, /:(limit)(\d+)/, /:(sigma)(\d+)/
|
26
|
+
token_els = lexed.get_els($2)
|
24
27
|
|
25
28
|
parsed = case $1
|
26
29
|
when 'vector'
|
@@ -29,10 +32,14 @@ module Qlang
|
|
29
32
|
MatrixParser.execute(token_els)
|
30
33
|
when 'tmatrix'
|
31
34
|
MatrixParser.execute(token_els, trans: true)
|
35
|
+
when 'limit'
|
36
|
+
LimitParser.execute(token_els)
|
32
37
|
when 'integral'
|
33
38
|
IntegralParser.execute(token_els)
|
34
39
|
when 'def_func'
|
35
40
|
FuncParser.execute(token_els)
|
41
|
+
when 'sigma'
|
42
|
+
SigmaParser.execute(token_els)
|
36
43
|
when 'differential'
|
37
44
|
del_var, formula = token_els
|
38
45
|
"d/d#{del_var}(#{FormulaParser.execute(formula)})"
|
@@ -41,13 +48,16 @@ module Qlang
|
|
41
48
|
|
42
49
|
when /:LPRN(\d+):CONT(\d+):RPRN(\d+)/
|
43
50
|
tokens_range = $1.to_i..$3.to_i
|
44
|
-
token_val =
|
51
|
+
token_val =
|
45
52
|
|
46
|
-
lexed.parsed!(
|
53
|
+
lexed.parsed!(
|
54
|
+
lexed.get_value($2).parentheses,
|
55
|
+
tokens_range
|
56
|
+
)
|
47
57
|
|
48
58
|
when /:LBRCS(\d+):CONT(\d+):RBRCS(\d+)/
|
49
59
|
tokens_range = $1.to_i..$3.to_i
|
50
|
-
token_val = lexed
|
60
|
+
token_val = lexed.get_value($2)
|
51
61
|
|
52
62
|
cont = case token_val
|
53
63
|
when /#{ONEHASH}(#{CMA}#{ONEHASH})*/
|
data/lib/qlang/utils/ruby_ext.rb
CHANGED
data/lib/qlang/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestLimit < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
def assert_iq_equal(output, input)
|
9
|
+
assert_equal(Qlang::Iq.execute(input), output)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_general
|
13
|
+
assert_iq_equal(
|
14
|
+
'oo',
|
15
|
+
'lim[x->0] 1/x'
|
16
|
+
)
|
17
|
+
|
18
|
+
assert_iq_equal(
|
19
|
+
'10.0',
|
20
|
+
'lim[x->10] x'
|
21
|
+
)
|
22
|
+
|
23
|
+
assert_iq_equal(
|
24
|
+
'2.7182682371744895',
|
25
|
+
'lim[x->oo] (1 + 1/x)^x'
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestSigma < TestInterpreterBase
|
4
|
+
def setup
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_general
|
9
|
+
assert_iq_equal(
|
10
|
+
'∑[x=0,10] x',
|
11
|
+
'55.0'
|
12
|
+
)
|
13
|
+
|
14
|
+
assert_iq_equal(
|
15
|
+
'∑[x=0, 10] x^2',
|
16
|
+
'385.0'
|
17
|
+
)
|
18
|
+
|
19
|
+
assert_iq_equal(
|
20
|
+
'∑[x=0, 10] x^3',
|
21
|
+
'3025.0'
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qlang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.27182120
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gogotanaka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dydx
|
@@ -118,8 +118,10 @@ files:
|
|
118
118
|
- lib/qlang/api.rb
|
119
119
|
- lib/qlang/api/func_api.rb
|
120
120
|
- lib/qlang/api/integral_api.rb
|
121
|
+
- lib/qlang/api/limit_api.rb
|
121
122
|
- lib/qlang/api/list_api.rb
|
122
123
|
- lib/qlang/api/matrix_api.rb
|
124
|
+
- lib/qlang/api/sigma_api.rb
|
123
125
|
- lib/qlang/api/vector_api.rb
|
124
126
|
- lib/qlang/exec.rb
|
125
127
|
- lib/qlang/iq.rb
|
@@ -133,8 +135,10 @@ files:
|
|
133
135
|
- lib/qlang/parser/formula_parser.rb
|
134
136
|
- lib/qlang/parser/func_parser.rb
|
135
137
|
- lib/qlang/parser/integral_parser.rb
|
138
|
+
- lib/qlang/parser/limit_parser.rb
|
136
139
|
- lib/qlang/parser/list_parser.rb
|
137
140
|
- lib/qlang/parser/matrix_parser.rb
|
141
|
+
- lib/qlang/parser/sigma_parser.rb
|
138
142
|
- lib/qlang/parser/vector_parser.rb
|
139
143
|
- lib/qlang/utils/langs.yml
|
140
144
|
- lib/qlang/utils/ruby_ext.rb
|
@@ -146,7 +150,9 @@ files:
|
|
146
150
|
- test/interpreter/test_function.rb
|
147
151
|
- test/interpreter/test_general.rb
|
148
152
|
- test/interpreter/test_integral.rb
|
153
|
+
- test/interpreter/test_limit.rb
|
149
154
|
- test/interpreter/test_matrix.rb
|
155
|
+
- test/interpreter/test_sigma.rb
|
150
156
|
- test/interpreter/test_vector.rb
|
151
157
|
- test/langs/test_r.rb
|
152
158
|
- test/langs/test_ruby.rb
|
@@ -184,7 +190,9 @@ test_files:
|
|
184
190
|
- test/interpreter/test_function.rb
|
185
191
|
- test/interpreter/test_general.rb
|
186
192
|
- test/interpreter/test_integral.rb
|
193
|
+
- test/interpreter/test_limit.rb
|
187
194
|
- test/interpreter/test_matrix.rb
|
195
|
+
- test/interpreter/test_sigma.rb
|
188
196
|
- test/interpreter/test_vector.rb
|
189
197
|
- test/langs/test_r.rb
|
190
198
|
- test/langs/test_ruby.rb
|