qlang 0.0.27 → 0.0.141

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 805e11f0c327e3f7fd63d3d5a0de10c34d7f120b
4
- data.tar.gz: 420cbcdcc4461907c7092a8405cf85d6e1af40d2
3
+ metadata.gz: 717677209dfcc71bdf36cce50db8ec22692dd7f8
4
+ data.tar.gz: 46f9c75f916b1975e03075db0410b64769078ff3
5
5
  SHA512:
6
- metadata.gz: f08fd5daf625fcde5decd4504267fdc05e57688ac716440f71c3d0a6ab01f5b94d3a4f56ec7a0476f5892aadbf2ee69163bfc4b094655415f14ba309a8228059
7
- data.tar.gz: e4f188b8714777ea728bbb8e7e8ab23e745867b09fe96a2f40d1fc1fa178e4d406df11aa38650e71f969d6917ec6551fa01b31f96421d19081ba52b2901a9d0b
6
+ metadata.gz: 22d87e8c71f5e87481488d58fe6fcda5269e983437fb4cdb830b954f4b25942eee41e1be4efdcdbd50d2668f84d0e9c6d49648fb75a4707c946a2e7888949017
7
+ data.tar.gz: 675be6320a08b8c72a0950aead7c353cfdebe92b37b08111957e7dee88ecc4c2b22f160bef7bd44b29a1d03547faa191433d19cafc9f5594abc78e2b1cfc4425
data/Gemfile CHANGED
@@ -1,7 +1,9 @@
1
1
  source 'https://rubygems.org'
2
+ ruby '2.1.2'
3
+
4
+ gem 'dydx', '0.1.412'
2
5
 
3
6
  gem 'rubocop'
4
- gem 'coveralls', require: false
5
7
  gem 'pry'
6
8
 
7
9
  gemspec
data/README.md CHANGED
@@ -1,60 +1,42 @@
1
1
  # Qlang
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/qlang.svg)](http://badge.fury.io/rb/qlang) [![Build Status](https://travis-ci.org/gogotanaka/Q.svg?branch=master)](https://travis-ci.org/gogotanaka/Q) [![Coverage Status](https://coveralls.io/repos/gogotanaka/Q/badge.png?branch=master)](https://coveralls.io/r/gogotanaka/Q?branch=master) [![Code Climate](https://codeclimate.com/github/gogotanaka/Q/badges/gpa.svg)](https://codeclimate.com/github/gogotanaka/Q) [![Dependency Status](https://gemnasium.com/gogotanaka/Q.svg)](https://gemnasium.com/gogotanaka/Q)
4
-
5
3
  Enjoy MATH with Keyboard.
6
4
 
7
- ### Differentiate
8
5
 
9
6
  ```
10
- d/dx(cos(x))
11
- => ( - sin( x ) )
12
-
13
- d/dx(log(x))
14
- => ( 1 / x )
7
+ # Differentiate
15
8
 
16
- # You can omit parentheses
9
+ Q:-> d/dx(cos(x))
10
+ ( - sin( x ) )
17
11
 
18
- d/dy y^2
19
- => ( 2 * y )
12
+ Q:-> d/dx(log(x))
13
+ ( 1 / x )
20
14
 
21
- d/dy xy
22
- => ( x )
23
- ```
15
+ Q:-> d/dy(y ** 2)
16
+ ( 2 * y )
24
17
 
25
18
 
26
- ### Integrate
27
-
28
- ```
29
- S(log(x)dx)[0..1]
30
- => - oo
19
+ # Integrate
31
20
 
32
- S(sin(x)dx)[0..pi]
33
- => 2.0
21
+ Q:-> S(log(x)dx)[0..1]
22
+ ( - sin( x ) )
34
23
 
35
- S(cos(x)dx)[0..pi]
36
- => 0.0
37
- ```
24
+ Q:-> d/dx(log(x))
25
+ ( 1 / x )
38
26
 
27
+ Q:-> d/dy(y ** 2)
28
+ ( 2 * y )
39
29
 
40
30
  ### Matrix
41
-
42
- ```
31
+ Q:->(1 2 3; 4 5 6)
43
32
  (1 2 3; 4 5 6)
44
- => (1 2 3; 4 5 6)
45
33
 
46
- (1 2 3; 4 5 6) + (1 2 3; 4 5 6)
47
- => (2 4 6; 8 10 12)
34
+ Q:-> (1 2 3; 4 5 6) + (1 2 3; 4 5 6)
35
+ (2 4 6; 8 10 12)
48
36
 
49
- (1 2 3; 4 5 6) * (1 2 3)
50
- => (14 32)
51
- ```
37
+ Q:-> (1 2 3; 4 5 6) * (1 2 3)
38
+ (14 32)
52
39
 
53
- ### Function
54
- ```
55
- f(x, y) = xy
56
- f(1, 2)
57
- => 2
58
40
  ```
59
41
 
60
42
 
@@ -79,7 +61,7 @@ Install it yourself as:
79
61
 
80
62
  ## Contributing
81
63
 
82
- 1. Fork it ( https://github.com/gogotanaka/Q/fork )
64
+ 1. Fork it ( https://github.com/[my-github-username]/qlang/fork )
83
65
  2. Create your feature branch (`git checkout -b my-new-feature`)
84
66
  3. Commit your changes (`git commit -am 'Add some feature'`)
85
67
  4. Push to the branch (`git push origin my-new-feature`)
@@ -9,35 +9,15 @@ module Qlang
9
9
  # TODO:
10
10
  class ::String
11
11
  def rm(str_or_rgx)
12
- gsub(str_or_rgx, '')
13
- end
14
-
15
- def rm!(str_or_rgx)
16
12
  gsub!(str_or_rgx, '')
17
- self
18
13
  end
19
14
 
20
- def rms!(*str_or_rgxs)
15
+ def rms(*str_or_rgxs)
21
16
  str_or_rgxs.each do |str_or_rgx|
22
- rm!(str_or_rgx)
17
+ rm(str_or_rgx)
23
18
  end
24
19
  self
25
20
  end
26
-
27
- def split_by_sp
28
- split(/ +/)
29
- end
30
-
31
- # FIX:
32
- def equalize!
33
- rms!(/\A +/, / +\z/)
34
- if self =~ /\A\(/ && self =~ /\)\z/
35
- rms!(/\A\(/, /\)\z/)
36
- rms!(/\A +/, / +\z/)
37
- else
38
- self
39
- end
40
- end
41
21
  end
42
22
 
43
23
  class ::Matrix
@@ -2,14 +2,8 @@ module Qlang
2
2
  module Api
3
3
  module ListApi
4
4
  def execute(arys)
5
- case $type
6
- when :R
7
- combineds_by_equal = arys.map { |ary| "#{ary[0]}=#{ary[1]}" }.join(', ')
8
- "list(#{combineds_by_equal})"
9
- when :Ruby
10
- fail 'List is not implemented for Ruby'
11
- end
12
-
5
+ combineds_by_equal = arys.map { |ary| "#{ary[0]}=#{ary[1]}" }.join(', ')
6
+ "list(#{combineds_by_equal})"
13
7
  end
14
8
  module_function :execute
15
9
  end
@@ -19,36 +19,34 @@ module Qlang
19
19
  exit 0
20
20
  end
21
21
 
22
- private
23
-
24
- def ch_compile_type(lang)
25
- case lang
26
- when '-Ruby'
27
- Qlang.to_ruby
28
- when '-R'
29
- Qlang.to_r
30
- else
31
- print 'Q support Ruby and R now.'
32
- end
22
+ private def ch_compile_type(lang)
23
+ case lang
24
+ when '-Ruby'
25
+ Qlang.to_ruby
26
+ when '-R'
27
+ Qlang.to_r
28
+ else
29
+ print 'Q support Ruby and R now.'
33
30
  end
31
+ end
34
32
 
35
- def parse
36
- raise '#{@args[0]} is unsupported option' unless @args[0] == '-q'
37
- filename = @args[1]
38
- file = open_file(filename)
39
- string = read_file(file)
40
- print(Kconv.tosjis(Qlang.compile(string)), '\n')
41
- file.close
42
- end
33
+ private def parse
34
+ raise '#{@args[0]} is unsupported option' unless @args[0] == '-q'
35
+ filename = @args[1]
36
+ file = open_file(filename)
37
+ string = read_file(file)
38
+ print(Kconv.tosjis(Qlang.compile(string)), '\n')
39
+ file.close
40
+ end
43
41
 
44
- def open_file(filename, flag = 'r')
45
- return if filename.nil?
46
- File.open(filename, flag)
47
- end
42
+ private def open_file(filename, flag = 'r')
43
+ return if filename.nil?
44
+ File.open(filename, flag)
45
+ end
48
46
 
49
- def read_file(file)
50
- file.read
51
- end
47
+ private def read_file(file)
48
+ file.read
49
+ end
52
50
  end
53
51
  end
54
52
  end
@@ -1,39 +1,18 @@
1
1
  module Qlang
2
2
  module Iq
3
- class Dydx::Algebra::Formula
4
- # FIX:
5
- def to_q
6
- str = to_s.gsub(/\*\*/, '^').rm(' * ')
7
- str.equalize!
8
- end
9
- end
10
-
11
- def self.execute(code)
12
- ruby_code = Q.to_ruby.compile(code)
13
- ruby_obj = eval(ruby_code)
14
-
15
- optimize_output(ruby_obj)
16
- rescue SyntaxError
17
- # TODO: emergency
18
- case ruby_code
19
- when /(\d)+(\w)/
20
- execute("#{$1} * #{$2}")
21
- end
22
- end
23
-
24
- def self.optimize_output(ruby_obj)
3
+ def execute(code)
4
+ ruby_obj = eval Q.to_ruby.compile(code)
25
5
  case ruby_obj
26
- when Matrix, Vector, Dydx::Algebra::Formula
6
+ when Matrix, Vector
27
7
  ruby_obj.to_q
28
8
  when Float::INFINITY
29
9
  'oo'
30
10
  when - Float::INFINITY
31
11
  '-oo'
32
12
  else
33
- str = ruby_obj.to_s
34
- str.equalize!
13
+ ruby_obj
35
14
  end
36
15
  end
37
-
16
+ module_function :execute
38
17
  end
39
18
  end
@@ -1,12 +1,8 @@
1
1
  require 'strscan'
2
- require 'qlang/lexer/tokens'
3
-
4
2
 
5
3
  module Qlang
6
4
  module Lexer
7
5
  class Base
8
- attr_accessor :lexeds
9
- include Tokens
10
6
  class << self
11
7
  attr_reader :token_hash
12
8
 
@@ -100,18 +96,10 @@ module Qlang
100
96
  end
101
97
  end
102
98
 
103
- # NEW APIs
104
- def parsed!(token_position, parsed)
105
- @lexeds.delete_at(token_position)
106
- @lexeds.insert(token_position, { R: parsed })
99
+ private def to_num(token_with_num)
100
+ token_with_num =~ /\d+/
101
+ $&.to_i
107
102
  end
108
-
109
- private
110
-
111
- def to_num(token_with_num)
112
- token_with_num =~ /\d+/
113
- $&.to_i
114
- end
115
103
  end
116
104
  end
117
105
  end
@@ -1,13 +1,13 @@
1
1
  module Qlang
2
2
  module Lexer
3
3
  class FuncLexer < Base
4
- rule(%r@#{FUNCCV}@) { :FDEF }
4
+ rule(/\w\(\w( ?, ?\w)*\)/) { :FDEF }
5
5
  rule(/\=/) { :EQL }
6
6
 
7
7
  rule(/[ \t\f]/)
8
8
 
9
9
  rule(/\r\n/) { :NLIN }
10
- rule(/[\w\(].*/) { :FOML }
10
+ rule(/\w.*/) { :OTHER }
11
11
  end
12
12
  end
13
13
  end
@@ -1,16 +1,8 @@
1
- require 'pry'
2
1
  module Qlang
3
2
  module Lexer
4
3
  class WrapLexer < Base
5
- rule(%r@#{FUNCCV}#{ANYSP}=#{ANYSP}#{NONL}+@) { :def_func }
6
- rule(%r@#{FUNCCN}@) { :eval_func }
7
- rule(/S#{ANYSP}#{LPRN}#{ANYSTR}#{RPRN}\[#{ANYSTR}\]/) { :integral }
8
- rule(/d\/d#{VAR} .*/) { :differential }
9
- rule(%r@#{LPRN}#{NUMS_BY_SP}#{RPRN}@) { :vector }
10
- rule(%r@#{LPRN}#{NUMS_BY_SP_BY_SCLN}#{RPRN}t@) { :tmatrix }
11
- rule(%r@#{LPRN}#{NUMS_BY_SP_BY_SCLN}#{RPRN}@) { :matrix }
12
-
13
-
4
+ rule(/\w\(\w( ?, ?\w)*\) ?= ?[^\r\n]+/) { :FUNC }
5
+ rule(/S *\(.+\)\[.+\]/) { :ITGL }
14
6
  rule(/\(/) { :LPRN }
15
7
  rule(/\)/) { :RPRN }
16
8
  rule(/\{/) { :LBRC }
@@ -9,7 +9,6 @@ require 'qlang/parser/vector_parser'
9
9
  require 'qlang/parser/list_parser'
10
10
  require 'qlang/parser/func_parser'
11
11
  require 'qlang/parser/integral_parser'
12
- require 'qlang/parser/formula_parser'
13
12
 
14
13
  module Qlang
15
14
  module Parser
@@ -19,30 +18,18 @@ module Qlang
19
18
  fail "I'm so sorry, something wrong. Please feel free to report this." if Time.now > time + 10
20
19
 
21
20
  case lexed.token_str
22
- when /(:vector)(\d)/, /(:matrix)(\d)/, /(:tmatrix)(\d)/, /(:integral)(\d)/, /(:def_func)(\d)/
23
- token_sym = $1.delete(':').to_sym
24
- token_position = $2.to_i
25
- token_val = lexed.lexeds[token_position][token_sym]
26
-
27
- parsed = case token_sym
28
- when :vector
29
- VectorParser.execute(token_val)
30
- when :matrix
31
- MatrixParser.execute(token_val)
32
- when :tmatrix
33
- MatrixParser.execute(token_val, trans: true)
34
- when :integral
35
- IntegralParser.execute(token_val)
36
- when :def_func
37
- FuncParser.execute(token_val)
38
- end
39
- lexed.parsed!(token_position, parsed)
40
-
41
21
  when /:LPRN\d(:CONT\d):RPRN\d/
42
22
  cont_token_with_num = $1
43
23
  cont_lexed = Lexer::ContLexer.new(lexed.get_value(cont_token_with_num))
44
24
 
45
- cont = "(#{cont_lexed.values.join(' ')})"
25
+ case cont_lexed.token_str
26
+ when /(:NUM\d)+(:SCLN\d|:NLIN\d)(:NUM\d)/
27
+ cont = MatrixParser.execute(cont_lexed)
28
+ when /(:NUM\d)+/
29
+ cont = VectorParser.execute(cont_lexed)
30
+ else
31
+ cont = "(#{cont_lexed.values.join(' ')})"
32
+ end
46
33
  lexed.squash_with_prn(cont_token_with_num, cont)
47
34
 
48
35
  when /:LBRC\d(:CONT\d):RBRC\d/
@@ -57,26 +44,29 @@ module Qlang
57
44
  end
58
45
  lexed.squash_with_prn(cont_token_with_num, cont)
59
46
 
60
- when /:eval_func\d/
47
+ when /:FUNC\d/
61
48
  cont_token_with_num = $&
62
- cont = lexed.get_value(cont_token_with_num)
63
- lexed.squash_with_prn(cont_token_with_num, cont)
49
+ cont_lexed = Lexer::FuncLexer.new(lexed.get_value(cont_token_with_num))
64
50
 
65
- when /:differential\d/
51
+ case cont_lexed.token_str
52
+ when /:FDEF\d:EQL\d:OTHER\d/
53
+ cont = FuncParser.execute(cont_lexed)
54
+ lexed.ch_value(cont_token_with_num, cont)
55
+ lexed.ch_token(cont_token_with_num, :R)
56
+ end
57
+
58
+ when /:ITGL\d/
66
59
  cont_token_with_num = $&
67
- cont = lexed.get_value(cont_token_with_num)
68
- cont =~ /(d\/d[a-zA-Z]) (.*)/
69
- cont = "#{$1}(#{FormulaParser.execute($2)})"
70
- # FIX: Refactor
71
- #cont.gsub!(/(d\/d[a-zA-Z]) (.*)/, "\1(\2)")
72
- lexed.squash_with_prn(cont_token_with_num, cont)
60
+ cont = IntegralParser.execute(lexed.get_value(cont_token_with_num))
61
+ lexed.ch_value(cont_token_with_num, cont)
62
+ lexed.ch_token(cont_token_with_num, :R)
63
+
73
64
  when /:CONT\d/
74
65
  lexed.ch_token($&, :R)
75
66
  end
76
67
 
77
68
  lexed.squash_to_cont($1, 2) if lexed.token_str =~ /(:CONT\d|:R\d)(:CONT\d|:R\d)/
78
69
  end
79
-
80
70
  lexed.fix_r_txt!
81
71
  lexed.values.join
82
72
  end
@@ -1,13 +1,14 @@
1
- require 'qlang/lexer/tokens'
2
1
  module Qlang
3
2
  module Parser
4
3
  module FuncParser
5
4
  include Base
6
- include Lexer::Tokens
7
- def execute(string)
8
- def_func, formula = string.split(/ *= */)
9
- def_func =~ %r@(#{FUNCV})#{LPRN}#{ANYSP}(#{VARS_BY_CMA})#{ANYSP}#{RPRN}@
10
- FuncApi.execute($1, $2.split(' *,'), FormulaParser.execute(formula))
5
+ def execute(lexed)
6
+ lexed.fix_r_txt!
7
+ fdef_ary = lexed[0][:FDEF].split('')
8
+ func_name = fdef_ary.shift
9
+ args = fdef_ary.join.rms('(', ')', ',', ' ').split('')
10
+
11
+ FuncApi.execute(func_name, args, lexed[-1][:OTHER])
11
12
  end
12
13
  module_function :execute
13
14
  end
@@ -5,9 +5,9 @@ module Qlang
5
5
  def execute(string)
6
6
  integrated, range = string.scan(/S *\((.+)\)\[(.+)\]/).first
7
7
 
8
- integrated.rm!(' ')
8
+ integrated.rm(' ')
9
9
 
10
- IntegralApi.execute(FormulaParser.execute(integrated[0..-3]), integrated[-2..-1], range)
10
+ IntegralApi.execute(integrated[0..-3], integrated[-2..-1], range)
11
11
  end
12
12
  module_function :execute
13
13
  end
@@ -2,13 +2,9 @@ module Qlang
2
2
  module Parser
3
3
  module MatrixParser
4
4
  include Base
5
- def execute(lexed_string, trans: false)
6
- lexed_string.rms!(')','(', 't')
7
- rows = lexed_string.split(/ *; */).map(&:split_by_sp)
5
+ def execute(lexed)
6
+ rows = lexed.split(';')
8
7
  rows.all? { |row| row.count == rows.first.count }
9
- if trans
10
- rows = rows.transpose
11
- end
12
8
  MatrixApi.execute(rows)
13
9
  end
14
10
  module_function :execute
@@ -2,10 +2,8 @@ module Qlang
2
2
  module Parser
3
3
  module VectorParser
4
4
  include Base
5
- def execute(lexed_string)
6
- lexed_string.rms!(/ *\( */, / *\) */)
7
- elements = lexed_string.split_by_sp
8
- VectorApi.execute(elements)
5
+ def execute(lexed)
6
+ VectorApi.execute(lexed.values)
9
7
  end
10
8
  module_function :execute
11
9
  end
@@ -1,3 +1,3 @@
1
1
  module Qlang
2
- VERSION = "0.0.27"
2
+ VERSION = "0.0.141"
3
3
  end
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency "dydx", '~> 0.1.41421'
22
-
23
21
  spec.add_development_dependency "bundler", "~> 1.6"
24
22
  spec.add_development_dependency "rake"
25
23
  spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "dydx", '0.1.412'
26
25
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qlang do
4
+ describe 'Function' do
5
+ it do
6
+ expect(
7
+ Q.compile('f(x, y) = x + y')
8
+ ).to eq(
9
+ "f <- function(x ,y) x + y"
10
+ )
11
+
12
+ expect(
13
+ Q.compile('g(x) = x ** 2')
14
+ ).to eq(
15
+ "g <- function(x) x ** 2"
16
+ )
17
+
18
+ expect(
19
+ Q.compile('g(x) = x ** (2 + 2)')
20
+ ).to eq(
21
+ "g <- function(x) x ** (2 + 2)"
22
+ )
23
+
24
+ expect(
25
+ Q.compile('h(a, b, c) = a ** 2 + b ** 2 + c ** 2')
26
+ ).to eq(
27
+ "h <- function(a ,b ,c) a ** 2 + b ** 2 + c ** 2"
28
+ )
29
+ end
30
+ end
31
+ end
@@ -7,7 +7,6 @@ describe Qlang do
7
7
 
8
8
  end
9
9
  end
10
-
11
10
  context 'into Ruby' do
12
11
  it do
13
12
  expect(
@@ -2,65 +2,15 @@ require 'spec_helper'
2
2
 
3
3
  describe Qlang do
4
4
  describe Iq do
5
- def self.def_test(name, input, output)
6
- it name + '_def' do
7
- expect(Iq.execute(input)).to eq(output)
8
- end
9
- end
10
-
11
- def self.cal_test(name, input, output)
12
- it name + '_cal' do
13
- expect(Iq.execute(input)).to eq(output)
14
- reset
15
- end
16
- end
17
-
18
- describe 'General' do
19
- cal_test('ex1', '2x', '2x')
20
- cal_test('ex2', 'x + x', '2x')
21
- cal_test('ex3', 'x * y', 'xy')
22
- end
23
-
24
5
  describe 'Matrix' do
25
- cal_test('ex1',
26
- '(1 2 3; 4 5 6)',
27
- '(1 2 3; 4 5 6)'
28
- )
29
-
30
- cal_test('ex2',
31
- '(1 2 3; 4 5 6) + (1 2 3; 4 5 6)',
32
- '(2 4 6; 8 10 12)'
33
- )
34
-
35
- cal_test('ex3',
36
- '(1 2 3; 4 5 6) - (2 4 1; 8 3 9)',
37
- '(-1 -2 2; -4 2 -3)'
38
- )
39
-
40
- cal_test('ex4',
41
- '(1 2; 3 4) * (1 2; 3 4)',
42
- '(7 10; 15 22)'
43
- )
44
-
45
- cal_test('ex5',
46
- '(1 2; 3 4) ** 2',
47
- '(7 10; 15 22)'
48
- )
49
-
50
- cal_test('ex6',
51
- '(1 2; 3 4) ** 2',
52
- '(7 10; 15 22)'
53
- )
54
-
55
- cal_test('ex7',
56
- '(1 2; 3 4) * (1 2)',
57
- '(5 11)'
58
- )
59
-
60
- cal_test('ex8',
61
- '(1 2 3; 4 5 6)t',
62
- '(1 4; 2 5; 3 6)'
63
- )
6
+ it do
7
+ expect(Iq.execute('(1 2 3; 4 5 6)')).to eq('(1 2 3; 4 5 6)')
8
+ expect(Iq.execute('(1 2 3; 4 5 6) + (1 2 3; 4 5 6)')).to eq('(2 4 6; 8 10 12)')
9
+ expect(Iq.execute('(1 2 3; 4 5 6) - (2 4 1; 8 3 9)')).to eq('(-1 -2 2; -4 2 -3)')
10
+ expect(Iq.execute('(1 2; 3 4) * (1 2; 3 4)')).to eq('(7 10; 15 22)')
11
+ expect(Iq.execute('(1 2; 3 4) ** 2')).to eq('(7 10; 15 22)')
12
+ expect(Iq.execute('(1 2; 3 4) * (1 2)')).to eq('(5 11)')
13
+ end
64
14
  end
65
15
 
66
16
  describe 'Vector' do
@@ -79,63 +29,27 @@ describe Qlang do
79
29
 
80
30
  describe 'Diff' do
81
31
  it do
82
- expect(Iq.execute('d/dx(e ** x)')).to eq('e ^ x')
83
- expect(Iq.execute('d/dx(x ** 2)')).to eq('2x')
84
- expect(Iq.execute('d/dx(x * 2)')).to eq('2')
85
- expect(Iq.execute('d/dx( sin(x) )')).to eq('cos( x )')
86
- expect(Iq.execute('d/dx(log( x ))')).to eq('1 / x')
32
+ expect(Iq.execute('d/dx(e ** x)')).to eq(e ** x)
33
+ expect(Iq.execute('d/dx(x ** 2)')).to eq(2 * x)
34
+ expect(Iq.execute('d/dx(x * 2)')).to eq(2)
35
+ expect(Iq.execute('d/dx( sin(x) )')).to eq(cos(x))
36
+ expect(Iq.execute('d/dx(log( x ))')).to eq(1/x)
87
37
  end
88
- cal_test('ex1', 'd/dx cos(x)', '- sin( x )')
89
- cal_test('ex2', 'd/dx xx', '2x')
90
38
  end
91
39
 
92
40
  describe 'Integral' do
93
41
  it do
94
42
  expect(Iq.execute('S( log(x)dx )[0..1]')).to eq('-oo')
95
- expect(Iq.execute('S( sin(x)dx )[0..pi]')).to eq('2.0')
96
- expect(Iq.execute('S( cos(x)dx )[0..pi]')).to eq('0.0')
97
- expect(Iq.execute('S( cos(x)dx )[0..pi]')).to eq('0.0')
43
+ expect(Iq.execute('S( sin(x)dx )[0..pi]')).to eq(2.0)
44
+ expect(Iq.execute('S( cos(x)dx )[0..pi]')).to eq(0.0)
98
45
  end
99
- cal_test('ex1', 'S(xx dx)[0..1]', '0.33333333')
100
- cal_test('ex2', 'S(2pi dx)[0..1]', '6.28318531')
101
46
  end
102
47
 
103
48
  describe 'Function' do
104
- def_test('ex1', 'f(x, y) = x + y', 'x + y')
105
- cal_test('ex1', 'f( 4, 5 )', '9.0')
106
-
107
- def_test('ex2', 'f( x , y) = xy', 'x * y')
108
- cal_test('ex2', 'f( 3, 9 )', '27.0')
109
-
110
- def_test('ex3', 'f(x, y) = xy^2', 'x * ( y ** 2 )')
111
- cal_test('ex3', 'f( 3, 2 )', '12.0')
112
-
113
- def_test('ex4', 'f(x, y) = xy^2', 'x * ( y ** 2 )')
114
- cal_test('ex4', 'df/dx', 'y ^ 2')
115
-
116
- def_test('ex5', 'g(x) = x ^ 2', 'x ** 2')
117
- cal_test('ex5', 'g(2)', '4.0')
118
-
119
- def_test('ex6', 'h(x) = e ^ 2', 'e ** 2')
120
- cal_test('ex6', 'h(2)', '7.3890560989306495')
121
-
122
- def_test('ex7', 'h(x) = pix', 'pi * x')
123
- cal_test('ex7', 'h(3)', '9.42477796076938')
124
-
125
- def_test('ex8', 'h(x) = pie', 'pi * e')
126
- cal_test('ex8', 'h(2)', '8.539734222673566')
127
-
128
- def_test('ex9', 'h(x) = ( 1 / ( 2pi ) ^ ( 1 / 2.0 ) ) * e ^ ( - x ^ 2 / 2 )', '( ( 4503599627370496 / 6369051672525773 ) / ( pi ** 0.5 ) ) * ( e ** ( ( - ( x ** 2 ) ) / 2 ) )')
129
- cal_test('ex9', 'S( h(x)dx )[-oo..oo]', '1.0')
130
-
131
- def_test('ex10', 'f(x) = sin(x)', 'sin( x )')
132
- cal_test('ex10', 'f(pi)', '0.0')
133
-
134
- def_test('ex11', 'f(x) = cos(x)', 'cos( x )')
135
- cal_test('ex11', 'f(pi)', '-1.0')
136
-
137
- def_test('ex11', 'f(x) = log(x)', 'log( x )')
138
- cal_test('ex11', 'f(e)', '1.0')
49
+ it do
50
+ expect(Iq.execute('f(x, y) = x + y')).to eq(f(x, y) <= x + y)
51
+ expect(Iq.execute('g(x) = x ** 2')).to eq(g(x) <= x ** 2)
52
+ end
139
53
  end
140
54
  end
141
55
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qlang do
4
+ describe 'List' do
5
+ it do
6
+ expect(
7
+ Q.to_r.compile('{name: "Gogotanaka", age: 21, birth: (1992 8 10) }')
8
+ ).to eq(
9
+ "list(name=\"Gogotanaka\", age=21, birth=c(1992, 8, 10))"
10
+ )
11
+
12
+ expect(
13
+ Q.to_r.compile('{key1: 234234, key2: 387342 }')
14
+ ).to eq(
15
+ "list(key1=234234, key2=387342)"
16
+ )
17
+
18
+ expect(
19
+ Q.to_r.compile('{key1:234234,key2:387342,key3:38733242}')
20
+ ).to eq(
21
+ "list(key1=234234, key2=387342, key3=38733242)"
22
+ )
23
+
24
+ expect(
25
+ Q.to_r.compile('{key1:(1 3 2; 8 2 3),key2:387342,key3:38733242}')
26
+ ).to eq(
27
+ "list(key1=matrix(c(1, 3, 2, 8, 2, 3), 2, 3, byrow = TRUE), key2=387342, key3=38733242)"
28
+ )
29
+ end
30
+ end
31
+ end
@@ -28,7 +28,7 @@ describe Qlang do
28
28
  expect(
29
29
  Q.to_ruby.compile('f(x, y) = x + y')
30
30
  ).to eq(
31
- "f(x, y) <= x + y"
31
+ "f(x ,y) <= x + y"
32
32
  )
33
33
 
34
34
  expect(
@@ -1,8 +1,4 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'qlang'
3
3
  include Qlang
4
-
5
- require 'coveralls'
6
- Coveralls.wear!
7
-
8
4
  require 'pry'
@@ -0,0 +1,4 @@
1
+ loop do
2
+ print 'P:-> '
3
+ puts eval gets
4
+ end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qlang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.27
4
+ version: 0.0.141
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-15 00:00:00.000000000 Z
11
+ date: 2014-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: dydx
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 0.1.41421
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 0.1.41421
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +52,20 @@ dependencies:
66
52
  - - ">="
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dydx
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.412
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.412
69
69
  description: Enjoy MATH!
70
70
  email:
71
71
  - mail@tanakakazuki.com
@@ -74,7 +74,6 @@ executables:
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
- - ".coveralls.yml"
78
77
  - ".gitignore"
79
78
  - ".rspec"
80
79
  - ".rubocop.yml"
@@ -97,11 +96,9 @@ files:
97
96
  - lib/qlang/lexer/base.rb
98
97
  - lib/qlang/lexer/cont_lexer.rb
99
98
  - lib/qlang/lexer/func_lexer.rb
100
- - lib/qlang/lexer/tokens.rb
101
99
  - lib/qlang/lexer/wrap_lexer.rb
102
100
  - lib/qlang/parser.rb
103
101
  - lib/qlang/parser/base.rb
104
- - lib/qlang/parser/formula_parser.rb
105
102
  - lib/qlang/parser/func_parser.rb
106
103
  - lib/qlang/parser/integral_parser.rb
107
104
  - lib/qlang/parser/list_parser.rb
@@ -109,15 +106,15 @@ files:
109
106
  - lib/qlang/parser/vector_parser.rb
110
107
  - lib/qlang/version.rb
111
108
  - q_lang.gemspec
109
+ - spec/function_spec.rb
110
+ - spec/integral_spec.rb
112
111
  - spec/iq_spec.rb
113
- - spec/lexer/regular_expressions_spec.rb
114
- - spec/objects/function_spec.rb
115
- - spec/objects/integral_spec.rb
116
- - spec/objects/list_spec.rb
117
- - spec/objects/matrix_spec.rb
118
- - spec/objects/vector_spec.rb
112
+ - spec/list_spec.rb
113
+ - spec/matrix_spec.rb
119
114
  - spec/q_lang_spec.rb
120
115
  - spec/spec_helper.rb
116
+ - spec/vector_spec.rb
117
+ - tanaka.rb
121
118
  homepage: http://q-language.org/
122
119
  licenses:
123
120
  - MIT
@@ -143,12 +140,11 @@ signing_key:
143
140
  specification_version: 4
144
141
  summary: Enjoy MATH!
145
142
  test_files:
143
+ - spec/function_spec.rb
144
+ - spec/integral_spec.rb
146
145
  - spec/iq_spec.rb
147
- - spec/lexer/regular_expressions_spec.rb
148
- - spec/objects/function_spec.rb
149
- - spec/objects/integral_spec.rb
150
- - spec/objects/list_spec.rb
151
- - spec/objects/matrix_spec.rb
152
- - spec/objects/vector_spec.rb
146
+ - spec/list_spec.rb
147
+ - spec/matrix_spec.rb
153
148
  - spec/q_lang_spec.rb
154
149
  - spec/spec_helper.rb
150
+ - spec/vector_spec.rb
@@ -1,2 +0,0 @@
1
- repo_token: ZdXKADwEPNW5PJkIaC76yjqq4w04dIpuZ
2
- service_name: travis-ci
@@ -1,45 +0,0 @@
1
- module Qlang
2
- module Lexer
3
- module Tokens
4
- # FIRST TOKEN
5
- NUM = '[0-9]+'
6
- VAR = '[a-z]'
7
- FUNCV = '[a-zA-Z]'
8
- VARNUM = '[0-9a-z]'
9
- ANYSP = ' *'
10
- ANYSTR = '.+'
11
- NONL = '[^\r\n]'
12
- LPRN = '\('
13
- RPRN = '\)'
14
- LBRC = '\{'
15
- RBRC = '\}'
16
- CLN = '\:'
17
- SCLN = ';'
18
- CMA = '\,'
19
- SP = ' '
20
-
21
- # SECOND TOKEN
22
- class ::String
23
- def line_by(char)
24
- "#{ANYSP}#{self}(#{ANYSP}#{char}#{ANYSP}#{self})*#{ANYSP}"
25
- end
26
- end
27
- NUMS_BY_CMA = NUM.line_by(CMA)
28
- VARS_BY_CMA = VAR.line_by(CMA)
29
- VARNUMS_BY_CMA = VARNUM.line_by(CMA)
30
- NUMS_BY_SP = NUM.line_by(SP)
31
-
32
- # THIRD TOKEN
33
- class ::String
34
- def func_call
35
- "#{FUNCV}#{LPRN}#{ANYSP}#{self}*#{ANYSP}#{RPRN}"
36
- end
37
- end
38
- FUNCCN = NUMS_BY_CMA.func_call
39
- FUNCCV = VARS_BY_CMA.func_call
40
- FUNCCVN = VARNUMS_BY_CMA.func_call
41
-
42
- NUMS_BY_SP_BY_SCLN = NUMS_BY_SP.line_by(SCLN)
43
- end
44
- end
45
- end
@@ -1,36 +0,0 @@
1
- module Qlang
2
- module Parser
3
- # FIX:
4
- module FormulaParser
5
- def execute(lexed)
6
- ss = StringScanner.new(lexed)
7
- result = ''
8
- until ss.eos?
9
- { EXP: /\^/, BFUNC: /sin|cos|tan|log/, MUL: /(pi|[1-9a-z]){2,}/, SNGL: /(pi|[1-9a-z])/, OTHER: /([^\^1-9a-z]|^pi)+/ }.each do |token , rgx|
10
- if ss.scan(rgx)
11
- item = case token
12
- when :EXP
13
- $type == :Ruby ? '**' : '^'
14
- when :MUL
15
- sss = StringScanner.new(ss[0])
16
- ary = []
17
- until sss.eos?
18
- [/pi/, /[1-9a-z]/].each do |rgx2|
19
- ary << sss[0] if sss.scan(rgx2)
20
- end
21
- end
22
- ary.join(' * ')
23
- else
24
- ss[0]
25
- end
26
- result += item
27
- break
28
- end
29
- end
30
- end
31
- result
32
- end
33
- module_function :execute
34
- end
35
- end
36
- end
@@ -1,18 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Regular expressions' do
4
- def self.should_match(num, rgx, str)
5
- it 'ex' + num.to_s do
6
- expect(rgx =~ str).to eq(0)
7
- end
8
- end
9
- describe 'function' do
10
- should_match(1, /[fgh]\(\w( ?, ?\w)*\) ?= ?[^\r\n]+/, 'f(x) = xy')
11
- end
12
-
13
- describe 'differentiate' do
14
- rgx = /d\/d[a-zA-Z] .*/
15
- should_match(1, rgx, 'd/dx sin(x)')
16
- should_match(2, rgx, 'd/dz z^2')
17
- end
18
- end
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Qlang do
4
- describe 'Function' do
5
- context 'into R' do
6
- it do
7
- expect(
8
- Q.to_r.compile('f(x, y) = x + y')
9
- ).to eq(
10
- "f <- function(x, y) x + y"
11
- )
12
-
13
- expect(
14
- Q.to_r.compile('g(x) = x ^ 2')
15
- ).to eq(
16
- "g <- function(x) x ^ 2"
17
- )
18
-
19
- expect(
20
- Q.to_r.compile('g(x) = x ^ (2 + 2)')
21
- ).to eq(
22
- "g <- function(x) x ^ (2 + 2)"
23
- )
24
-
25
- expect(
26
- Q.to_r.compile('h(a, b, c) = a ^ 2 + b ^ 2 + c ^ 2')
27
- ).to eq(
28
- "h <- function(a, b, c) a ^ 2 + b ^ 2 + c ^ 2"
29
- )
30
- end
31
- end
32
- end
33
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Qlang do
4
- describe 'List' do
5
- it do
6
- # expect(
7
- # Q.to_r.compile('{name: "Gogotanaka", age: 21, birth: (1992 8 10) }')
8
- # ).to eq(
9
- # "list(name=\"Gogotanaka\", age=21, birth=c(1992, 8, 10))"
10
- # )
11
-
12
- expect(
13
- Q.to_r.compile('{key1: 234234, key2: 387342 }')
14
- ).to eq(
15
- "list(key1=234234, key2=387342)"
16
- )
17
-
18
- expect(
19
- Q.to_r.compile('{key1:234234,key2:387342,key3:38733242}')
20
- ).to eq(
21
- "list(key1=234234, key2=387342, key3=38733242)"
22
- )
23
-
24
- # expect(
25
- # Q.to_r.compile('{key1:(1 3 2; 8 2 3),key2:387342,key3:38733242}')
26
- # ).to eq(
27
- # "list(key1=matrix(c(1, 3, 2, 8, 2, 3), 2, 3, byrow = TRUE), key2=387342, key3=38733242)"
28
- # )
29
- end
30
- end
31
- end