quanty 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/quanty.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'util/quanty/parse'
2
+ require 'util/quanty/fact'
3
+ require 'util/quanty/main'
4
+
5
+ class Quanty
6
+ VERSION = '1.1.0'
7
+ end
data/mkdump.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'lib/quanty/parse.rb'
2
+ require 'lib/quanty/fact.rb'
3
+
4
+ Quanty::Fact::mkdump ARGV[0]
data/parse.y ADDED
@@ -0,0 +1,106 @@
1
+ #
2
+ # parse.y, quanty/parse.rb
3
+ #
4
+ # Copyright (c) 2001 Masahiro Tanaka <masa@ir.isas.ac.jp>
5
+ #
6
+ # This program is free software.
7
+ # You can distribute/modify this program under the terms of
8
+ # the GNU General Public License version 2 or later.
9
+
10
+ class Parse
11
+
12
+ prechigh
13
+ nonassoc UMINUS
14
+ right POW UPOW
15
+ left '*' '/' '|'
16
+ left '+' '-'
17
+ preclow
18
+
19
+ rule
20
+
21
+ target: val
22
+ | /* none */ { result = Quanty::Fact.new }
23
+ | num { result = Quanty::Fact.new(val[0]) }
24
+ ;
25
+
26
+ num : NUMBER
27
+ | '-' NUMBER = UMINUS { result = -val[1] }
28
+ | num '+' num { result += val[2] }
29
+ | num '-' num { result -= val[2] }
30
+ | num '|' num { result /= val[2] }
31
+ | num '/' num { result /= val[2] }
32
+ | num '*' num { result *= val[2] }
33
+ | num POW num { result **= val[2] }
34
+ | '(' num ')' { result = val[1] }
35
+ ;
36
+
37
+ val : seq
38
+ | num seq { result = val[1].fac!(val[0]) }
39
+ | '/' exp { result = val[1].pow!(-1) }
40
+ | num '/' exp { result = val[2].pow!(-1).fac!(val[0]) }
41
+ ;
42
+
43
+ seq : exp
44
+ | seq exp { result.mul!(val[1]) }
45
+ | seq '*' exp { result.mul!(val[2]) }
46
+ | seq '/' exp { result.div!(val[2]) }
47
+ | seq '*' num { result.fac!(val[2]) }
48
+ | seq '/' num { result.fac!(val[2]**-1) }
49
+ ;
50
+
51
+ exp : unit
52
+ | unit num = UPOW { result.pow!(val[1]) }
53
+ | unit POW num { result.pow!(val[2]) }
54
+ ;
55
+
56
+ unit : WORD { result = Quanty::Fact.new(val[0]) }
57
+ | '(' val ')' { result = val[1] }
58
+ | '[' val ']' { result = val[1] }
59
+ ;
60
+
61
+ end
62
+
63
+ ---- header ----
64
+
65
+ # parse.y, quanty/parse.rb
66
+ #
67
+ # by Masahiro Tanaka <masa@ir.isas.ac.jp>
68
+ #
69
+ class Quanty
70
+
71
+ ---- inner ----
72
+
73
+ def parse( str )
74
+ @q = []
75
+
76
+ while str.size > 0 do
77
+ #p str
78
+ case str
79
+ when /\A[\s\n]+/ou
80
+ when /\A\d+\.?\d*([eE][+-]?\d+)?/ou
81
+ @q.push [:NUMBER, $&.to_f]
82
+ when /\A([A-Z]\.){2}/u
83
+ when /\A[A-Za-z_]+ -/u
84
+ when /\A[A-Za-z_µ]+([A-Za-z_µ0-9-]+[A-Za-z_µ])?/ou
85
+ @q.push [:WORD, $&]
86
+ when /\A[$%'"]'?/ou
87
+ @q.push [:WORD, $&]
88
+ when /\A\^|\A\*\*/ou
89
+ @q.push [:POW, $&]
90
+ when /\A./ou
91
+ @q.push [$&,$&]
92
+ end
93
+ str = $'
94
+ end
95
+ @q.push [false, '$end']
96
+
97
+ do_parse
98
+ end
99
+
100
+ def next_token
101
+ @q.shift
102
+ end
103
+
104
+ ---- footer ----
105
+
106
+ end # class Quanty
data/quanty-en.rd ADDED
@@ -0,0 +1,107 @@
1
+ =begin
2
+ = class Quanty
3
+
4
+ == SYNOPSIS
5
+
6
+ A class whose instances consist of "value (physical quantity)" and "unit".
7
+ Featuring:
8
+ * Unit conversion like ((%units%)) command.
9
+ * Operation between quantities having different units,
10
+ like ((*km*)) and ((*mile*)), with automatic unit conversion.
11
+
12
+ == EXAMPLE
13
+
14
+ require 'quanty'
15
+ Quanty(1.23,'km') + Quanty(4.56,'m') #=> Quanty(1.23456,'km')
16
+ Quanty(123,'mile') / Quanty(2,'hr') #=> Quanty(61,'mile / hr')
17
+ Quanty(61,'miles/hr').want('m/s') #=> Quanty(27.26944,'m/s')
18
+ Quanty(1.0,'are') == Quanty(10,'m')**2 #=> true
19
+ Math.cos(Quanty(60,'degree')) #=> 0.5
20
+
21
+ == Quanty class
22
+
23
+ === Super Class:
24
+ Object (Numeric is better??)
25
+
26
+ === Class method:
27
+ --- Quanty.new([value],[unit])
28
+ --- Quanty([value],[unit])
29
+ Create Quanty class instance having ((|value|)) and ((|unit|)) (is String).
30
+ If ((|value|)) is omitted, ((|value|)) = 1 is assumed.
31
+ If ((|unit|)) is omitted, ((|unit|)) = "" is assumed,
32
+ which is regarded as a quantity with "dimensionless" unit
33
+ (i.e. all dimensions of unit are zero).
34
+ Refer to ((<Notation of unit>)) below.
35
+
36
+ === Methods:
37
+ --- self + other
38
+ --- self - other
39
+ Addition and subtraction of quantities.
40
+ Operation is made after
41
+ the unit of ((|other|)) is converted to the unit of ((|self|)).
42
+ Exception is raised if unit conversion is failed.
43
+ Return the Quanty class instance with the unit of ((|self|)).
44
+
45
+ --- self * other
46
+ Multiplication of quantities.
47
+ Resulting unit is made by concatenating ((|self|)) and ((|other|)).
48
+ --- self / other
49
+ Division of quantities.
50
+ Resulting unit is made by placing (({"/"}))
51
+ between ((|self|)) and ((|other|)), and concatenating them.
52
+
53
+ --- self ** number
54
+ Power of quantities.
55
+ Resulting unit is made by "(unit of self)^((|number|))"
56
+
57
+ --- self == other
58
+ --- self < other
59
+ --- self <= other
60
+ --- self > other
61
+ --- self >= other
62
+ Comparison of quantities.
63
+
64
+ --- coerce(number)
65
+ Convert ((|number|)) to Quanty class instance with dimensionless unit,
66
+ then return [((|number|)), ((|self|))].
67
+
68
+ --- to_f
69
+ If ((|self|)) is a quantity with a dimensionless unit, return its value.
70
+ If ((|self|)) is a quantity with an angular unit,
71
+ return the value converted into radian.
72
+ Otherwise, raise exception.
73
+
74
+ --- unit
75
+ Return the string of unit.
76
+
77
+ --- val
78
+ --- value
79
+ Return the value.
80
+
81
+ --- want(unit)
82
+ Convert ((|self|)) to a quantity with ((|unit|)) (is String),
83
+ and return Quanty class instance.
84
+
85
+ == Notation of unit
86
+
87
+ * Multiplication
88
+ 'N m' , 'N*m' are same.
89
+
90
+ * Division
91
+ '/s' , 'm/s'
92
+
93
+ * Power
94
+ 'm-2' , 'm^-2' , 'm**-2' are all same.
95
+
96
+ * Numerical factor
97
+ '12 inch' --- same as 'feet'.
98
+
99
+ * Combination
100
+ 'm/s*m' --- same as 'm^2/s'.
101
+ 'm/(s*m)' --- same as '/s'.
102
+
103
+ * See ((%parse.y%)) for more.
104
+
105
+ by ((<Masahiro Tanaka|URL:http://www.ir.isas.ac.jp/~masa/index-e.html>))
106
+ (2001-04-25)
107
+ =end
data/quanty-ja.rd ADDED
@@ -0,0 +1,102 @@
1
+ =begin
2
+ = class Quanty
3
+
4
+ == ����
5
+
6
+ ���� (ʪ����)�פȡ�ñ�̡פ�ʻ�����ĥ��饹��
7
+ ((%units%)) ���ޥ�ɤΤ褦��ñ���Ѵ���ǽ��¾��
8
+ ((*km*)) �� ((*mile*)) �ʤɡ��ۤʤ�ñ�̤�����̤α黻���ǽ��
9
+
10
+ == ��
11
+
12
+ require 'quanty'
13
+ Quanty(1.23,'km') + Quanty(4.56,'m') #=> Quanty(1.23456,'km')
14
+ Quanty(123,'mile') / Quanty(2,'hr') #=> Quanty(61,'mile / hr')
15
+ Quanty(61,'miles/hr').want('m/s') #=> Quanty(27.26944,'m/s')
16
+ Quanty(1.0,'are') == Quanty(10,'m')**2 #=> true
17
+ Math.cos(Quanty(60,'degree')) #=> 0.5
18
+
19
+ == Quanty ���饹
20
+
21
+ === �����ѡ����饹:
22
+ �Ȥꤢ���� Object��(Numeric�Τۤ����褤����)
23
+
24
+ === ���饹�᥽�å�:
25
+ --- Quanty.new([value],[unit])
26
+ --- Quanty([value],[unit])
27
+ �̤��ͤ�((|value|))��ñ�̤�((|unit|)) (ʸ����)�Ȥ���
28
+ Unit ���饹�Υ��󥹥��󥹤��������롣
29
+ ((|value|))����ά���줿���ϡ�1�����ꤵ�줿����Ʊ����
30
+ ((|unit|))����ά���줿���ϡ�""�����ꤵ�줿����Ʊ���ǡ�ñ�̤ʤ��̤ˤʤ롣
31
+ ñ�̤ν����ϡ�����((<ñ��ɽ��ˡ>))�򻲾ȡ�
32
+
33
+ === �᥽�å�:
34
+ --- self + other
35
+ --- self - other
36
+ �̤βû���������
37
+ ((|other|))��ñ�̤�((|self|))��ñ�̤��Ѵ����Ʊ黻���롣
38
+ ñ���Ѵ����Ǥ��ʤ�����㳰��ȯ�����롣
39
+ ��̤�((|self|))��ñ�̤ˤ��� Quanty ���饹�Υ��󥹥��󥹤��֤���
40
+
41
+ --- self * other
42
+ �̤ξ軻��
43
+ ��̤�ñ�̤ϡ�((|self|))��((|other|))��ñ�̤�Ϣ�뤷�ƺ�롣
44
+ --- self / other
45
+ �̤ν�����
46
+ ��̤�ñ�̤ϡ�
47
+ ((|self|))��((|other|))��ñ�̤�(({"/"}))��Ϥ����Ϣ�뤷�ƺ�롣
48
+
49
+ --- self ** number
50
+ �̤��Ѿ衣
51
+ ��̤�ñ�̤ϡ�"(((|self|))��ñ��)^((|number|))" �Ȥ��ƺ�롣
52
+
53
+ --- self == other
54
+ --- self < other
55
+ --- self <= other
56
+ --- self > other
57
+ --- self >= other
58
+ �̤���ӡ�
59
+
60
+ --- coerce(number)
61
+ ((|number|))��ñ�̤ʤ�Quanty���饹�Υ��󥹥��󥹤ˤ���
62
+ [((|number|)),((|self|))]�Ȥ����֤���
63
+
64
+ --- to_f
65
+ ((|self|))��ñ�̤ʤ��̤ξ��ϡ����Ȥ��ͤ��֤���
66
+ ((|self|))�����٤ξ��ϡ�radian���Ѵ������ͤ��֤���
67
+ ����ʳ���ñ�̤ξ��ϡ��㳰��ȯ�����롣
68
+
69
+ --- unit
70
+ ñ�̤�ʸ������֤���
71
+
72
+ --- val
73
+ --- value
74
+ �̤��ͤ��֤���
75
+
76
+ --- want(unit)
77
+ ((|self|))�� ((|unit|)) (ʸ����) ��ñ�̤Ȥ����̤��Ѵ����롣
78
+
79
+
80
+ == ñ��ɽ��ˡ
81
+
82
+ * ��ˡ
83
+ 'N m' �� 'N*m' ��Ʊ����
84
+
85
+ * ��ˡ
86
+ '/s' , 'm/s'
87
+
88
+ * �٤�
89
+ 'm-2' , 'm^-2' , 'm**-2' �Ϥ��٤�Ʊ����
90
+
91
+ * ������
92
+ '12 inch' --- 'feet' ��Ʊ����
93
+
94
+ * ����
95
+ 'm/s*m' --- 'm^2/s' ��Ʊ����
96
+ 'm/(s*m)' --- '/s' ��Ʊ����
97
+
98
+ * �ܺ٤� ((%parse.y%)) �򻲾ȤΤ��ȡ�
99
+
100
+ by ((<Masahiro Tanaka|URL:http://www.ir.isas.ac.jp/~masa/>))
101
+ (2001-04-25)
102
+ =end
data/test.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'quanty'
2
+ require 'irb/xmp'
3
+
4
+ xmp 'Quanty(1,"N").fact'
5
+ xmp 'Quanty(1,"erg").fact'
6
+ xmp 'Quanty(1.0,"are") > Quanty(3.0,"m") ** 2'
7
+ xmp 'Quanty(1.0,"are") + Quanty(3.0,"km") ** 2'
8
+ xmp 'Quanty(3.0,"N") * Quanty(2.0,"10 km^2.5m")'
9
+ xmp 'Quanty(3.0,"N") / Quanty(2.0,"km2")'
10
+ xmp 'Quanty(3.0,"m") / Quanty(2.0,"km")'
11
+ xmp 'Quanty(3.0,"cm") + Quanty(2.0,"inch")'
12
+ xmp 'Quanty(1.23,"km") + Quanty(4.56,"m")'
13
+ xmp '4.56 + Quanty(1.23,"1000") '
14
+ xmp '3 * Quanty(4,"cm") '