pione 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (270) hide show
  1. data/.gitignore +4 -3
  2. data/.simplecov +7 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +3 -0
  5. data/History.txt +13 -0
  6. data/README.md +2 -0
  7. data/Rakefile +16 -6
  8. data/bin/pione-val +5 -0
  9. data/example/AbstractRule/package.yml +1 -0
  10. data/example/HelloWorld/package.yml +2 -0
  11. data/example/HelloWorld/scenario/scenario.yml +2 -0
  12. data/example/LoopByTouch/LoopByTouch.pione +28 -0
  13. data/example/LoopByTouch/package.yml +1 -0
  14. data/example/MakePair/package.yml +2 -0
  15. data/example/MakePair/{data → scenario/input}/1.i +0 -0
  16. data/example/MakePair/{data → scenario/input}/2.i +0 -0
  17. data/example/MakePair/{data → scenario/input}/3.i +0 -0
  18. data/example/MakePair/{data → scenario/input}/4.i +0 -0
  19. data/example/MakePair/{data → scenario/input}/5.i +0 -0
  20. data/example/MakePair/scenario/scenario.yml +1 -0
  21. data/example/ScoreAggregation/ScoreAggregation.pione +122 -0
  22. data/example/ScoreAggregation/bin/apply-template.rb +10 -0
  23. data/example/ScoreAggregation/bin/histgram-graph.sh +18 -0
  24. data/example/ScoreAggregation/bin/mean-summary.rb +10 -0
  25. data/example/ScoreAggregation/bin/personal-bar-graph.sh +18 -0
  26. data/example/ScoreAggregation/bin/personal-pre-statistics.rb +37 -0
  27. data/example/ScoreAggregation/bin/total-mean.rb +10 -0
  28. data/example/ScoreAggregation/bin/total-statistics.rb +43 -0
  29. data/example/ScoreAggregation/generate-data.rb +63 -0
  30. data/example/ScoreAggregation/package.yml +1 -0
  31. data/example/ScoreAggregation/scenario/case1/input/A.score +15 -0
  32. data/example/ScoreAggregation/scenario/case1/input/B.score +15 -0
  33. data/example/ScoreAggregation/scenario/case1/input/C.score +15 -0
  34. data/example/ScoreAggregation/scenario/case1/input/D.score +15 -0
  35. data/example/ScoreAggregation/scenario/case1/input/E.score +15 -0
  36. data/example/ScoreAggregation/scenario/case1/input/F.score +15 -0
  37. data/example/ScoreAggregation/scenario/case1/input/G.score +15 -0
  38. data/example/ScoreAggregation/scenario/case1/input/H.score +15 -0
  39. data/example/ScoreAggregation/scenario/case1/input/I.score +15 -0
  40. data/example/ScoreAggregation/scenario/case1/input/J.score +15 -0
  41. data/example/ScoreAggregation/scenario/case1/input/K.score +15 -0
  42. data/example/ScoreAggregation/scenario/case1/input/L.score +15 -0
  43. data/example/ScoreAggregation/scenario/case1/input/M.score +15 -0
  44. data/example/ScoreAggregation/scenario/case1/input/N.score +15 -0
  45. data/example/ScoreAggregation/scenario/case1/input/O.score +15 -0
  46. data/example/ScoreAggregation/scenario/case1/input/P.score +15 -0
  47. data/example/ScoreAggregation/scenario/case1/input/Q.score +15 -0
  48. data/example/ScoreAggregation/scenario/case1/input/R.score +15 -0
  49. data/example/ScoreAggregation/scenario/case1/input/S.score +15 -0
  50. data/example/ScoreAggregation/scenario/case1/input/T.score +15 -0
  51. data/example/ScoreAggregation/scenario/case1/input/U.score +15 -0
  52. data/example/ScoreAggregation/scenario/case1/input/V.score +15 -0
  53. data/example/ScoreAggregation/scenario/case1/input/W.score +15 -0
  54. data/example/ScoreAggregation/scenario/case1/input/X.score +15 -0
  55. data/example/ScoreAggregation/scenario/case1/input/Y.score +15 -0
  56. data/example/ScoreAggregation/scenario/case1/input/Z.score +15 -0
  57. data/example/ScoreAggregation/scenario/case1/input/stat-template.erb +24 -0
  58. data/example/ScoreAggregation/scenario/case1/scenario.yml +3 -0
  59. data/example/{SequentialProcess/SequentialProcess.pione → SerialProcessing/SerialProcessing.pione} +0 -0
  60. data/example/SerialProcessing/package.yml +1 -0
  61. data/example/WorkflowPatterns/01_Sequence/Sequence.pione +21 -0
  62. data/example/WorkflowPatterns/02_PrallelSplit/ParallelSplit.pione +29 -0
  63. data/example/WorkflowPatterns/03_Synchronization/Synchronization.pione +30 -0
  64. data/example/WorkflowPatterns/04_ExclusiveChoice/ExclusiveChoice.pione +44 -0
  65. data/example/WorkflowPatterns/05_SimpleMerge/SimpleMerge.pione +44 -0
  66. data/example/WorkflowPatterns/06_MultiChoice/MultiChoice.pione +48 -0
  67. data/example/WorkflowPatterns/07_StructuredSynchronizingMerge/StructuredSynchronizingMerge.pione +71 -0
  68. data/example/WorkflowPatterns/08_MultiMerge/MultiMerge.pione +44 -0
  69. data/example/WorkflowPatterns/11_ImplicitTermination/ImplicitTermination.pione +29 -0
  70. data/example/WorkflowPatterns/12_MultipleInstancesWithoutSynchronization/MultipleInstancesWithoutSynchronization.pione +29 -0
  71. data/example/WorkflowPatterns/13_MultipleInstancesWithDesignTimeKnowledge/MultipleInstancesWithDesignTimeKnowledge.pione +28 -0
  72. data/example/WorkflowPatterns/14_MultipleInstancesWithRunTimeKnowledge/MultipleInstancesWithRunTimeKnowledge.pione +33 -0
  73. data/example/WorkflowPatterns/33_GeneralizedANDJoin/GeneralizedANDJoin.pione +21 -0
  74. data/example/WorkflowPatterns/37_LocalSynchronizingMerge/LocalSynchronizingMerge.pione +101 -0
  75. data/example/WorkflowPatterns/41_ThreadMerge/ThreadMerge.pione +43 -0
  76. data/example/WorkflowPatterns/42_ThreadSplit/ThreadSplit.pione +16 -0
  77. data/lib/pione.rb +23 -47
  78. data/lib/pione/agent/broker.rb +1 -1
  79. data/lib/pione/agent/input-generator.rb +1 -1
  80. data/lib/pione/agent/logger.rb +62 -49
  81. data/lib/pione/agent/messenger.rb +38 -0
  82. data/lib/pione/agent/rule-provider.rb +3 -3
  83. data/lib/pione/agent/task-worker.rb +14 -2
  84. data/lib/pione/agent/tuple-space-client.rb +1 -1
  85. data/lib/pione/agent/tuple-space-server-client-life-checker.rb +5 -3
  86. data/lib/pione/command.rb +2 -0
  87. data/lib/pione/command/basic-command.rb +1 -1
  88. data/lib/pione/command/pione-client.rb +57 -16
  89. data/lib/pione/command/pione-log.rb +5 -5
  90. data/lib/pione/command/pione-syntax-checker.rb +22 -7
  91. data/lib/pione/command/pione-task-worker.rb +36 -19
  92. data/lib/pione/command/pione-tuple-space-viewer.rb +3 -3
  93. data/lib/pione/command/pione-val.rb +40 -0
  94. data/lib/pione/component.rb +8 -0
  95. data/lib/pione/{system → component}/document.rb +13 -11
  96. data/lib/pione/component/package.rb +269 -0
  97. data/lib/pione/component/rule.rb +206 -0
  98. data/lib/pione/location/basic-location.rb +49 -7
  99. data/lib/pione/location/ftp-location.rb +19 -6
  100. data/lib/pione/location/local-location.rb +15 -6
  101. data/lib/pione/log.rb +4 -1
  102. data/lib/pione/log/{domain-info.rb → domain-log.rb} +23 -11
  103. data/lib/pione/{util/console-message.rb → log/message-log.rb} +16 -15
  104. data/lib/pione/log/process-log.rb +35 -86
  105. data/lib/pione/log/process-record.rb +24 -11
  106. data/lib/pione/log/system-log.rb +107 -0
  107. data/lib/pione/log/xes-log.rb +54 -48
  108. data/lib/pione/model.rb +1 -3
  109. data/lib/pione/model/assignment.rb +1 -0
  110. data/lib/pione/model/basic-model.rb +31 -15
  111. data/lib/pione/model/block.rb +1 -1
  112. data/lib/pione/model/boolean.rb +10 -23
  113. data/lib/pione/model/constraints.rb +12 -0
  114. data/lib/pione/model/data-expr.rb +31 -36
  115. data/lib/pione/model/feature-expr.rb +6 -23
  116. data/lib/pione/model/float.rb +29 -18
  117. data/lib/pione/model/integer.rb +44 -56
  118. data/lib/pione/model/keyed-sequence.rb +11 -4
  119. data/lib/pione/model/message.rb +4 -4
  120. data/lib/pione/model/ordinal-sequence.rb +12 -14
  121. data/lib/pione/model/package-expr.rb +53 -0
  122. data/lib/pione/model/parameters.rb +12 -11
  123. data/lib/pione/model/pione-method.rb +2 -2
  124. data/lib/pione/model/rule-expr.rb +30 -52
  125. data/lib/pione/model/sequence.rb +26 -26
  126. data/lib/pione/model/string.rb +13 -54
  127. data/lib/pione/model/ticket-expr.rb +12 -53
  128. data/lib/pione/model/type.rb +7 -1
  129. data/lib/pione/model/variable-table.rb +5 -4
  130. data/lib/pione/model/variable.rb +0 -5
  131. data/lib/pione/option/common-option.rb +2 -1
  132. data/lib/pione/option/task-worker-owner-option.rb +1 -1
  133. data/lib/pione/patch/drb-patch.rb +1 -1
  134. data/lib/pione/patch/em-ftpd-patch.rb +7 -0
  135. data/lib/pione/patch/rinda-patch.rb +53 -0
  136. data/lib/pione/patch/uri-patch.rb +5 -0
  137. data/lib/pione/relay/relay-socket.rb +2 -2
  138. data/lib/pione/rule-handler/action-handler.rb +71 -64
  139. data/lib/pione/rule-handler/basic-handler.rb +50 -32
  140. data/lib/pione/rule-handler/flow-handler.rb +51 -34
  141. data/lib/pione/rule-handler/update-criteria.rb +43 -20
  142. data/lib/pione/system.rb +13 -0
  143. data/lib/pione/system/domain-info.rb +34 -0
  144. data/lib/pione/system/global.rb +8 -1
  145. data/lib/pione/system/object.rb +1 -1
  146. data/lib/pione/transformer/expr-transformer.rb +3 -3
  147. data/lib/pione/transformer/literal-transformer.rb +3 -3
  148. data/lib/pione/transformer/rule-definition-transformer.rb +11 -9
  149. data/lib/pione/tuple-space/tuple-space-server-interface.rb +19 -1
  150. data/lib/pione/tuple-space/tuple-space-server.rb +9 -2
  151. data/lib/pione/tuple.rb +30 -0
  152. data/lib/pione/tuple/data-null-tuple.rb +14 -0
  153. data/lib/pione/tuple/message-tuple.rb +7 -0
  154. data/lib/pione/tuple/process-log-tuple.rb +13 -0
  155. data/lib/pione/tuple/touch-tuple.rb +14 -0
  156. data/lib/pione/uri-scheme/myftp-scheme.rb +45 -0
  157. data/lib/pione/util.rb +18 -0
  158. data/lib/pione/util/cpu.rb +20 -0
  159. data/lib/pione/util/error-report.rb +9 -1
  160. data/lib/pione/util/evaluatable.rb +47 -0
  161. data/lib/pione/util/ftp-server.rb +468 -0
  162. data/lib/pione/util/id.rb +39 -0
  163. data/lib/pione/util/indentation.rb +19 -0
  164. data/lib/pione/util/ip-address.rb +35 -0
  165. data/lib/pione/util/misc.rb +0 -47
  166. data/lib/pione/util/uuid.rb +28 -0
  167. data/lib/pione/util/variable-holdable.rb +38 -0
  168. data/lib/pione/version.rb +1 -1
  169. data/pione.gemspec +16 -14
  170. data/test/agent/spec_logger.rb +35 -44
  171. data/test/agent/spec_messenger.rb +25 -0
  172. data/test/agent/spec_rule-provider.rb +1 -1
  173. data/test/agent/spec_task-worker.rb +7 -13
  174. data/test/{system → component}/spec_document.rb +20 -20
  175. data/test/component/spec_package.rb +77 -0
  176. data/test/component/spec_package/TestPackage/Test.pione +14 -0
  177. data/test/component/spec_package/TestPackage/bin/count +3 -0
  178. data/test/component/spec_package/TestPackage/package.yml +7 -0
  179. data/test/component/spec_package/TestPackage/scenario/case1/input/1.txt +1 -0
  180. data/test/component/spec_package/TestPackage/scenario/case1/scenario.yml +1 -0
  181. data/test/component/spec_rule.rb +140 -0
  182. data/test/endurance-test/graph.plt +12 -0
  183. data/test/endurance-test/run.sh +65 -0
  184. data/test/location/location-behavior.rb +125 -0
  185. data/test/location/spec_ftp-location.rb +28 -90
  186. data/test/location/spec_local-location.rb +26 -76
  187. data/test/log/raw-process-log/pione-process.log +710 -0
  188. data/test/log/spec_domain-log.rb +57 -0
  189. data/test/log/spec_message-log.rb +44 -0
  190. data/test/log/spec_process-log.rb +88 -0
  191. data/test/log/spec_process-record.rb +148 -0
  192. data/test/log/spec_system-log.rb +142 -0
  193. data/test/log/spec_xes-log.rb +2 -2
  194. data/test/model/spec_assignment.rb +26 -25
  195. data/test/model/spec_block.rb +51 -97
  196. data/test/model/spec_boolean.rb +0 -5
  197. data/test/model/spec_call-rule.rb +6 -6
  198. data/test/model/spec_data-expr.rb +0 -7
  199. data/test/model/spec_data-expr.yml +8 -0
  200. data/test/model/spec_float.rb +1 -1
  201. data/test/model/spec_float.yml +13 -0
  202. data/test/model/spec_integer.rb +1 -1
  203. data/test/model/spec_integer.yml +12 -1
  204. data/test/model/spec_keyed-sequence.yml +5 -0
  205. data/test/model/spec_message.rb +2 -4
  206. data/test/model/spec_package-expr.rb +19 -0
  207. data/test/model/spec_parameters.rb +56 -88
  208. data/test/model/spec_pione-method.rb +15 -14
  209. data/test/model/spec_rule-expr.rb +4 -52
  210. data/test/model/spec_rule-expr.yml +11 -0
  211. data/test/model/spec_sequence.yml +6 -0
  212. data/test/model/spec_string.rb +21 -13
  213. data/test/model/spec_string.yml +10 -2
  214. data/test/model/spec_ticket-expr.rb +25 -3
  215. data/test/model/spec_variable.rb +8 -8
  216. data/test/rule-handler/spec_action-handler.pione +37 -0
  217. data/test/rule-handler/spec_action-handler.rb +41 -97
  218. data/test/rule-handler/spec_flow-handler.rb +24 -30
  219. data/test/rule-handler/spec_update-criteria.pione +16 -0
  220. data/test/rule-handler/spec_update-criteria.rb +7 -4
  221. data/test/rule-handler/spec_update-criteria.yml +191 -0
  222. data/test/system/spec_domain-info.rb +25 -0
  223. data/test/test-util.rb +38 -228
  224. data/test/transformer/spec_block-transformer.rb +1 -1
  225. data/test/transformer/spec_expr-transformer.rb +30 -39
  226. data/test/transformer/spec_flow-element-transformer.rb +17 -17
  227. data/test/transformer/spec_literal-transformer.rb +3 -3
  228. data/test/transformer/spec_rule-definition-transformer.rb +55 -76
  229. data/test/{spec_data-finder.rb → tuple-space/spec_data-finder.rb} +1 -1
  230. data/test/{spec_data-finder.yml → tuple-space/spec_data-finder.yml} +0 -0
  231. data/test/tuple/spec_data-tuple.rb +5 -76
  232. data/test/tuple/spec_finished-tuple.rb +5 -46
  233. data/test/tuple/spec_message-tuple.rb +10 -0
  234. data/test/tuple/spec_task-tuple.rb +4 -110
  235. data/test/tuple/spec_touch-tuple.rb +14 -0
  236. data/test/tuple/tuple-behavior.rb +14 -0
  237. data/test/uri-scheme/spec_local-scheme.rb +1 -1
  238. data/test/uri-scheme/spec_myftp-scheme.rb +73 -0
  239. data/test/uri-scheme/spec_myftp-scheme.yml +85 -0
  240. data/test/util/spec_cpu.rb +8 -0
  241. data/test/util/spec_error-report.rb +42 -0
  242. data/test/util/spec_evaluatable.rb +18 -0
  243. data/test/util/spec_ftp-server.rb +249 -0
  244. data/test/util/spec_id.pione +14 -0
  245. data/test/util/spec_id.rb +77 -0
  246. data/test/util/spec_indentation.rb +77 -0
  247. data/test/util/spec_ip-address.rb +15 -0
  248. data/test/util/spec_uuid.rb +11 -0
  249. data/test/util/spec_variable-holdable.rb +69 -0
  250. metadata +282 -83
  251. data/bin/pione-eval +0 -111
  252. data/demo/demo.rb +0 -311
  253. data/demo/public/base.css +0 -94
  254. data/demo/public/demo.js +0 -107
  255. data/demo/public/index.html +0 -91
  256. data/demo/public/jquery-1.8.3.min.js +0 -2
  257. data/lib/pione/model/binary-operator.rb +0 -90
  258. data/lib/pione/model/list.rb +0 -108
  259. data/lib/pione/model/package.rb +0 -56
  260. data/lib/pione/model/rule-io.rb +0 -178
  261. data/lib/pione/model/rule.rb +0 -295
  262. data/lib/pione/system/identifier.rb +0 -61
  263. data/lib/pione/tuple/log-tuple.rb +0 -14
  264. data/lib/pione/util/terminal.rb +0 -78
  265. data/test/log/data/sample.log +0 -1003
  266. data/test/model/spec_binary-operator.rb +0 -39
  267. data/test/model/spec_package.rb +0 -15
  268. data/test/model/spec_rule.rb +0 -158
  269. data/test/spec_identifier.rb +0 -29
  270. data/test/spec_log.rb +0 -52
@@ -2,48 +2,14 @@ module Pione
2
2
  module Model
3
3
  # PioneInteger represents integer value in PIONE system.
4
4
  class PioneInteger < Value
5
- # @api private
6
- def task_id_string
7
- "Integer<#{@value}>"
8
- end
9
-
10
5
  # @api private
11
6
  def textize
12
7
  @value.to_s
13
8
  end
14
9
 
15
- # Return the ruby's value.
16
- #
17
- # @return [Integer]
18
- # ruby's value
19
- def to_ruby
20
- return @value
21
- end
22
-
23
10
  def to_seq
24
11
  IntegerSequence.new([self])
25
12
  end
26
-
27
- # @api private
28
- def ==(other)
29
- return false unless other.kind_of?(self.class)
30
- @value == other.value
31
- end
32
-
33
- alias :eql? :"=="
34
-
35
- # @api private
36
- def hash
37
- @value.hash
38
- end
39
-
40
- # @api private
41
- def inspect
42
- "#<PioneInteger %s>" % @value
43
- end
44
-
45
- # @api private
46
- alias :to_s :inspect
47
13
  end
48
14
 
49
15
  class IntegerSequence < OrdinalSequence
@@ -53,95 +19,95 @@ module Pione
53
19
  end
54
20
 
55
21
  TypeInteger.instance_eval do
56
- define_pione_method(">", [TypeInteger], TypeBoolean) do |rec, other|
22
+ define_pione_method(">", [TypeInteger], TypeBoolean) do |vtable, rec, other|
57
23
  sequential_map2(TypeBoolean, rec, other) do |rec_elt, other_elt|
58
24
  rec_elt.value > other_elt.value
59
25
  end
60
26
  end
61
27
 
62
- define_pione_method(">=", [TypeInteger], TypeBoolean) do |rec, other|
28
+ define_pione_method(">=", [TypeInteger], TypeBoolean) do |vtable, rec, other|
63
29
  BooleanSequence.new(
64
- [PioneBoolean.new(rec.call_pione_method(">", other).value || rec.call_pione_method("==", other).value)]
30
+ [PioneBoolean.new(rec.call_pione_method(vtable, ">", other).value || rec.call_pione_method(vtable, "==", other).value)]
65
31
  )
66
32
  end
67
33
 
68
- define_pione_method("<", [TypeInteger], TypeBoolean) do |rec, other|
34
+ define_pione_method("<", [TypeInteger], TypeBoolean) do |vtable, rec, other|
69
35
  sequential_map2(TypeBoolean, rec, other) do |rec_elt, other_elt|
70
36
  rec_elt.value < other_elt.value
71
37
  end
72
38
  end
73
39
 
74
- define_pione_method("<=", [TypeInteger], TypeBoolean) do |rec, other|
40
+ define_pione_method("<=", [TypeInteger], TypeBoolean) do |vtable, rec, other|
75
41
  BooleanSequence.new(
76
42
  [PioneBoolean.new(
77
- rec.call_pione_method("<", other).value ||
78
- rec.call_pione_method("==", other).value
43
+ rec.call_pione_method(vtable, "<", other).value ||
44
+ rec.call_pione_method(vtable, "==", other).value
79
45
  )]
80
46
  )
81
47
  end
82
48
 
83
- define_pione_method("+", [TypeInteger], TypeInteger) do |rec, other|
49
+ define_pione_method("+", [TypeInteger], TypeInteger) do |vtable, rec, other|
84
50
  sequential_map2(TypeInteger, rec, other) do |rec_elt, other_elt|
85
51
  rec_elt.value + other_elt.value
86
52
  end
87
53
  end
88
54
 
89
- define_pione_method("-", [TypeInteger], TypeInteger) do |rec, other|
55
+ define_pione_method("-", [TypeInteger], TypeInteger) do |vtable, rec, other|
90
56
  sequential_map2(TypeInteger, rec, other) do |rec_elt, other_elt|
91
57
  rec_elt.value - other_elt.value
92
58
  end
93
59
  end
94
60
 
95
- define_pione_method("*", [TypeInteger], TypeInteger) do |rec, other|
61
+ define_pione_method("*", [TypeInteger], TypeInteger) do |vtable, rec, other|
96
62
  sequential_map2(TypeInteger, rec, other) do |rec_elt, other_elt|
97
63
  rec_elt.value * other_elt.value
98
64
  end
99
65
  end
100
66
 
101
- define_pione_method("%", [TypeInteger], TypeInteger) do |rec, other|
67
+ define_pione_method("%", [TypeInteger], TypeInteger) do |vtable, rec, other|
102
68
  # TODO: zero division error
103
69
  sequential_map2(TypeInteger, rec, other) do |rec_elt, other_elt|
104
70
  rec_elt.value % other_elt.value
105
71
  end
106
72
  end
107
73
 
108
- define_pione_method("/", [TypeInteger], TypeInteger) do |rec, other|
74
+ define_pione_method("/", [TypeInteger], TypeInteger) do |vtable, rec, other|
109
75
  # TODO: zero division error
110
76
  sequential_map2(TypeInteger, rec, other) do |rec_elt, other_elt|
111
77
  rec_elt.value / other_elt.value
112
78
  end
113
79
  end
114
80
 
115
- define_pione_method("as_string", [], TypeString) do |rec|
81
+ define_pione_method("as_string", [], TypeString) do |vtable, rec|
116
82
  sequential_map1(TypeString, rec) {|elt| elt.value.to_s}
117
83
  end
118
84
 
119
- define_pione_method("as_integer", [], TypeInteger) do |rec|
85
+ define_pione_method("as_integer", [], TypeInteger) do |vtable, rec|
120
86
  rec
121
87
  end
122
88
 
123
- define_pione_method("as_float", [], TypeFloat) do |rec|
89
+ define_pione_method("as_float", [], TypeFloat) do |vtable, rec|
124
90
  sequential_map1(TypeFloat, rec) {|elt| elt.value.to_f}
125
91
  end
126
92
 
127
- define_pione_method("next", [], TypeInteger) do |rec|
93
+ define_pione_method("next", [], TypeInteger) do |vtable, rec|
128
94
  sequential_map1(TypeInteger, rec) {|elt| elt.value.next}
129
95
  end
130
96
 
131
- define_pione_method("prev", [], TypeInteger) do |rec|
97
+ define_pione_method("prev", [], TypeInteger) do |vtable, rec|
132
98
  sequential_map1(TypeInteger, rec) {|elt| elt.value.pred}
133
99
  end
134
100
 
135
- define_pione_method("even?", [], TypeBoolean) do |rec|
101
+ define_pione_method("even?", [], TypeBoolean) do |vtable, rec|
136
102
  sequential_pred1(rec) {|elt| elt.value.even?}
137
103
  end
138
104
 
139
- define_pione_method("odd?", [], TypeBoolean) do |rec|
105
+ define_pione_method("odd?", [], TypeBoolean) do |vtable, rec|
140
106
  sequential_pred1(rec) {|elt| elt.value.odd?}
141
107
  end
142
108
 
143
109
  # upto : *integer -> *integer
144
- define_pione_method("upto", [TypeInteger], TypeInteger) do |rec, max|
110
+ define_pione_method("upto", [TypeInteger], TypeInteger) do |vtable, rec, max|
145
111
  sequential_fold2(TypeInteger, rec, max) do |seq, rec_elt, max_elt|
146
112
  if rec_elt.value < max_elt.value
147
113
  rec_elt.value.upto(max_elt.value).inject(seq) do |_seq, i|
@@ -153,8 +119,8 @@ module Pione
153
119
  end
154
120
  end
155
121
 
156
- # downto : *integer -> *integer
157
- define_pione_method("downto", [TypeInteger], TypeInteger) do |rec, min|
122
+ # downto : integer -> integer
123
+ define_pione_method("downto", [TypeInteger], TypeInteger) do |vtable, rec, min|
158
124
  sequential_fold2(TypeInteger, rec, min) do |seq, rec_elt, min_elt|
159
125
  if rec_elt.value > min_elt.value
160
126
  rec_elt.value.downto(min_elt.value).inject(seq) do |_seq, i|
@@ -165,6 +131,28 @@ module Pione
165
131
  end
166
132
  end
167
133
  end
134
+
135
+ # max : integer
136
+ define_pione_method("max", [], TypeInteger) do |vtable, rec|
137
+ fold1(IntegerSequence.empty, rec) do |seq, elt|
138
+ if seq.elements.size == 0 or seq.elements.first.value < elt.value
139
+ elt.to_seq
140
+ else
141
+ seq
142
+ end
143
+ end
144
+ end
145
+
146
+ # min : integer
147
+ define_pione_method("min", [], TypeInteger) do |vtable, rec|
148
+ fold1(IntegerSequence.empty, rec) do |seq, elt|
149
+ if seq.elements.size == 0 or seq.elements.first.value > elt.value
150
+ elt.to_seq
151
+ else
152
+ seq
153
+ end
154
+ end
155
+ end
168
156
  end
169
157
  end
170
158
  end
@@ -51,7 +51,7 @@ module Pione
51
51
  end
52
52
  end
53
53
 
54
- # Concatenate another sequence.
54
+ # Concatenate the sequence and another one.
55
55
  #
56
56
  # @param other [Sequence]
57
57
  # other sequence
@@ -123,21 +123,28 @@ module Pione
123
123
  end
124
124
 
125
125
  TypeKeyedSequence.instance_eval do
126
- define_pione_method("keys", [], :index_type) do |rec|
126
+ # keys : index_type
127
+ define_pione_method("keys", [], :index_type) do |vtable, rec|
127
128
  keys = rec.elements.keys
128
129
  rec.ordinal_sequence_of_element(keys.first).new(keys)
129
130
  end
130
131
 
131
- define_pione_method("values", [], :element_type) do |rec|
132
+ # values : element_type
133
+ define_pione_method("values", [], :element_type) do |vtable, rec|
132
134
  vals = rec.elements.values.flatten
133
135
  rec.ordinal_sequence_of_element(vals.first).new(vals)
134
136
  end
135
137
 
136
- define_pione_method("[]", [:index_type], :element_type) do |rec, index|
138
+ # [] : index_type -> element_type
139
+ define_pione_method("[]", [:index_type], :element_type) do |vtable, rec, index|
137
140
  index.elements.map do |index_elt|
138
141
  rec.elements[index_elt]
139
142
  end.flatten.tap{|x| break rec.ordinal_sequence_of_element(x.first).new(x, rec.attribute)}
140
143
  end
144
+
145
+ define_pione_method("textize", [], TypeString) do |vtable, rec|
146
+ rec.call_pione_method(vtable, "values").call_pione_method(vtable, "textize")
147
+ end
141
148
  end
142
149
  end
143
150
  end
@@ -21,8 +21,8 @@ module Pione
21
21
  # message arguments
22
22
  def initialize(name, receiver, *arguments)
23
23
  @name = name
24
- @receiver = receiver.to_pione
25
- @arguments = arguments.map{|arg| arg.to_pione}
24
+ @receiver = receiver
25
+ @arguments = arguments
26
26
  super()
27
27
  end
28
28
 
@@ -42,7 +42,7 @@ module Pione
42
42
  if pione_method = @receiver.pione_model_type.find_method(@name, @receiver, *@arguments)
43
43
  pione_method.get_output_type(@receiver)
44
44
  else
45
- raise MethodNotFound.new(@name.to_s, self)
45
+ raise MethodNotFound.new(@name.to_s, @receiver, *@arguments)
46
46
  end
47
47
  end
48
48
 
@@ -55,7 +55,7 @@ module Pione
55
55
  def eval(vtable)
56
56
  receiver = @receiver.eval(vtable)
57
57
  arguments = @arguments.map{|arg| arg.eval(vtable)}
58
- receiver.call_pione_method(@name, *arguments)
58
+ receiver.call_pione_method(vtable, @name, *arguments)
59
59
  end
60
60
 
61
61
  # Return true if the receiver or arguments include variables.
@@ -14,49 +14,47 @@ module Pione
14
14
  end
15
15
 
16
16
  TypeOrdinalSequence.instance_eval do
17
- define_pione_method("==", [:receiver_type], TypeBoolean) do |rec, other|
17
+ define_pione_method("==", [:receiver_type], TypeBoolean) do |vtable, rec, other|
18
18
  if rec.elements.size == other.elements.size
19
19
  rec.elements.size.times.all? do |i|
20
- rec.elements[i].value == other.elements[i].value
20
+ rec.elements[i] == other.elements[i]
21
21
  end.tap {|x| break BooleanSequence.new([PioneBoolean.new(x)])}
22
22
  else
23
23
  BooleanSequence.new([PioneBoolean.new(false)])
24
24
  end
25
25
  end
26
26
 
27
- define_pione_method("nth", [TypeInteger], :receiver_type) do |rec, index|
28
- map1(index) do |elt|
29
- elt.value == 0 ? rec : rec.elements[elt.value-1]
30
- end
27
+ define_pione_method("nth", [TypeInteger], :receiver_type) do |vtable, rec, index|
28
+ map1(index) {|elt| elt.value == 0 ? rec : rec.elements[elt.value-1]}
31
29
  end
32
30
 
33
- define_pione_method("[]", [:index_type], :receiver_type) do |rec, index|
34
- rec.call_pione_method("nth", index)
31
+ define_pione_method("[]", [:index_type], :receiver_type) do |vtable, rec, index|
32
+ rec.call_pione_method(vtable, "nth", index)
35
33
  end
36
34
 
37
- define_pione_method("reverse", [], :receiver_type) do |rec|
35
+ define_pione_method("reverse", [], :receiver_type) do |vtable, rec|
38
36
  rec.class.new(rec.elements.reverse, rec.attribute)
39
37
  end
40
38
 
41
- define_pione_method("head", [], :receiver_type) do |rec|
39
+ define_pione_method("head", [], :receiver_type) do |vtable, rec|
42
40
  rec.class.new([rec.elements[0]], rec.attribute)
43
41
  end
44
42
 
45
- define_pione_method("tail", [], :receiver_type) do |rec|
43
+ define_pione_method("tail", [], :receiver_type) do |vtable, rec|
46
44
  # NOTE: #tail should fail when the sequence length is less than 1
47
45
  rec.class.new(rec.elements[1..-1], rec.attribute)
48
46
  end
49
47
 
50
- define_pione_method("last", [], :receiver_type) do |rec|
48
+ define_pione_method("last", [], :receiver_type) do |vtable, rec|
51
49
  rec.class.new([rec.elements[-1]], rec.attribute)
52
50
  end
53
51
 
54
- define_pione_method("init", [], :receiver_type) do |rec|
52
+ define_pione_method("init", [], :receiver_type) do |vtable, rec|
55
53
  # NOTE: #init should fail when the sequence length is less than 1
56
54
  rec.class.new(rec.elements[0..-2], rec.attribute)
57
55
  end
58
56
 
59
- define_pione_method("type", [], TypeString) do |rec|
57
+ define_pione_method("type", [], TypeString) do |vtable, rec|
60
58
  case rec
61
59
  when StringSequence
62
60
  "string"
@@ -0,0 +1,53 @@
1
+ module Pione
2
+ module Model
3
+ # PackageExpr is an expression of PIONE package.
4
+ class PackageExpr < Element
5
+ attr_reader :name
6
+
7
+ # Create a package with name.
8
+ #
9
+ # @param name [String]
10
+ # package name
11
+ def initialize(name)
12
+ @name = name
13
+ super()
14
+ end
15
+
16
+ # @api private
17
+ def textize
18
+ "package-expr(\"%s\")" % [@name]
19
+ end
20
+
21
+ # Return a rule path.
22
+ #
23
+ # @param other [RuleExpr]
24
+ # rule expression
25
+ # @return [String]
26
+ # rule path string
27
+ def +(other)
28
+ raise ArgumentError.new(other) unless other.kind_of?(RuleExpr)
29
+ "#{@name}:#{other.name}"
30
+ end
31
+ end
32
+
33
+ class PackageExprSequence < Sequence
34
+ set_pione_model_type TypePackageExpr
35
+ set_element_class PackageExpr
36
+ end
37
+
38
+ TypePackageExpr.instance_eval do
39
+ define_pione_method("bin", [], TypeString) do |vtable, rec|
40
+ base = Location[vtable.get(Variable.new("__BASE__")).value]
41
+ bin = base + "package" + rec.elements.first.name + "bin"
42
+ working_directory = Location[vtable.get(Variable.new("__WORKING_DIRECTORY__")).first.value]
43
+ bin.entries.each do |entry|
44
+ path = working_directory + "bin" + entry.basename
45
+ unless path.exist?
46
+ entry.copy(working_directory + "bin" + entry.basename)
47
+ end
48
+ end
49
+ PioneString.new((working_directory + "bin").path).to_seq
50
+ end
51
+ end
52
+ end
53
+ end
@@ -99,7 +99,8 @@ module Pione
99
99
 
100
100
  # @api private
101
101
  def textize
102
- "{" + @data.map{|k,v| "%s:%s" % [k.textize[1..-1], v.textize]}.join(", ") + "}"
102
+ # "{" + @data.map{|k,v| "%s:%s" % [k.textize[1..-1], v.textize]}.join(", ") + "}"
103
+ "{" + @data.map.sort.map{|k,v| "%s:%s" % [k.textize[1..-1], v.textize]}.join(", ") + "}"
103
104
  end
104
105
 
105
106
  # Return value of parameter name.
@@ -323,19 +324,19 @@ module Pione
323
324
  # end
324
325
 
325
326
  TypeParameters.instance_eval do
326
- define_pione_method('==', [TypeParameters], TypeBoolean) do |rec, other|
327
+ define_pione_method('==', [TypeParameters], TypeBoolean) do |vtable, rec, other|
327
328
  PioneBoolean.new(rec.data == other.data)
328
329
  end
329
330
 
330
- define_pione_method("!=", [TypeParameters], TypeBoolean) do |rec, other|
331
- PioneBoolean.not(rec.call_pione_method("==", other))
331
+ define_pione_method("!=", [TypeParameters], TypeBoolean) do |vtable, rec, other|
332
+ PioneBoolean.not(rec.call_pione_method(vtable, "==", other))
332
333
  end
333
334
 
334
- define_pione_method("[]", [TypeString], TypeSequence) do |rec, name|
335
+ define_pione_method("[]", [TypeString], TypeSequence) do |vtable, rec, name|
335
336
  rec.get(Variable.new(name.value))
336
337
  end
337
338
 
338
- define_pione_method("get", [TypeString], TypeSequence) do |rec, name|
339
+ define_pione_method("get", [TypeString], TypeSequence) do |vtable, rec, name|
339
340
  rec.get(Variable.new(name.value))
340
341
  end
341
342
 
@@ -343,20 +344,20 @@ module Pione
343
344
  "set",
344
345
  [TypeString, TypeSequence],
345
346
  TypeParameters
346
- ) do |rec, name, val|
347
+ ) do |vtable, rec, name, val|
347
348
  rec.set(Variable.new(name.value), val)
348
349
  end
349
350
 
350
- define_pione_method("empty?", [], TypeBoolean) do |rec|
351
+ define_pione_method("empty?", [], TypeBoolean) do |vtable, rec|
351
352
  PioneBoolean.new(rec.empty?)
352
353
  end
353
354
 
354
- define_pione_method("as_string", [], TypeString) do |rec|
355
+ define_pione_method("as_string", [], TypeString) do |vtable, rec|
355
356
  PioneString.new(rec.string_form)
356
357
  end
357
358
 
358
- define_pione_method("str", [], TypeString) do |rec|
359
- rec.call_pione_method("as_string")
359
+ define_pione_method("str", [], TypeString) do |vtable, rec|
360
+ rec.call_pione_method(vtable, "as_string")
360
361
  end
361
362
  end
362
363
  end