flor 0.15.0 → 0.16.0
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 +5 -5
- data/CHANGELOG.md +14 -1
- data/CREDITS.md +1 -0
- data/LICENSE.txt +1 -1
- data/Makefile +6 -2
- data/README.md +2 -1
- data/flor.gemspec +12 -2
- data/lib/flor.rb +3 -3
- data/lib/flor/colours.rb +1 -1
- data/lib/flor/conf.rb +3 -4
- data/lib/flor/core/executor.rb +31 -61
- data/lib/flor/core/node.rb +213 -96
- data/lib/flor/core/procedure.rb +194 -75
- data/lib/flor/core/texecutor.rb +6 -7
- data/lib/flor/djan.rb +41 -22
- data/lib/flor/flor.rb +137 -42
- data/lib/flor/id.rb +77 -59
- data/lib/flor/log.rb +43 -22
- data/lib/flor/migrations/0001_tables.rb +7 -7
- data/lib/flor/parser.rb +271 -74
- data/lib/flor/pcore/_apply.rb +108 -0
- data/lib/flor/pcore/_atom.rb +2 -4
- data/lib/flor/pcore/_att.rb +54 -37
- data/lib/flor/pcore/_dmute.rb +18 -0
- data/lib/flor/pcore/_dol.rb +17 -0
- data/lib/flor/pcore/_dqs.rb +35 -0
- data/lib/flor/pcore/_head.rb +25 -0
- data/lib/flor/pcore/_obj.rb +1 -3
- data/lib/flor/pcore/_pat_guard.rb +1 -1
- data/lib/flor/pcore/_pat_obj.rb +11 -3
- data/lib/flor/pcore/_pat_regex.rb +16 -2
- data/lib/flor/pcore/_ref.rb +51 -0
- data/lib/flor/pcore/_rxs.rb +27 -0
- data/lib/flor/pcore/_val.rb +11 -6
- data/lib/flor/pcore/{logo.rb → andor.rb} +4 -6
- data/lib/flor/pcore/apply.rb +72 -2
- data/lib/flor/pcore/arith.rb +16 -4
- data/lib/flor/pcore/array_qmark.rb +100 -0
- data/lib/flor/pcore/break.rb +1 -2
- data/lib/flor/pcore/case.rb +1 -1
- data/lib/flor/pcore/cmp.rb +3 -2
- data/lib/flor/pcore/collect.rb +2 -2
- data/lib/flor/pcore/cond.rb +19 -1
- data/lib/flor/pcore/cursor.rb +12 -11
- data/lib/flor/pcore/define.rb +30 -4
- data/lib/flor/pcore/do_return.rb +3 -0
- data/lib/flor/pcore/flatten.rb +39 -0
- data/lib/flor/pcore/if.rb +15 -5
- data/lib/flor/pcore/includes.rb +5 -2
- data/lib/flor/pcore/inject.rb +1 -1
- data/lib/flor/pcore/iterator.rb +28 -18
- data/lib/flor/pcore/keys.rb +2 -2
- data/lib/flor/pcore/map.rb +19 -1
- data/lib/flor/pcore/match.rb +2 -2
- data/lib/flor/pcore/matchr.rb +18 -5
- data/lib/flor/pcore/max.rb +51 -0
- data/lib/flor/pcore/merge.rb +134 -0
- data/lib/flor/pcore/move.rb +1 -1
- data/lib/flor/pcore/noret.rb +1 -1
- data/lib/flor/pcore/not.rb +15 -1
- data/lib/flor/pcore/on.rb +11 -0
- data/lib/flor/pcore/on_cancel.rb +5 -1
- data/lib/flor/pcore/on_error.rb +69 -4
- data/lib/flor/pcore/push.rb +4 -9
- data/lib/flor/pcore/range.rb +5 -5
- data/lib/flor/pcore/reduce.rb +5 -18
- data/lib/flor/pcore/return.rb +26 -0
- data/lib/flor/pcore/reverse.rb +4 -0
- data/lib/flor/pcore/sequence.rb +8 -1
- data/lib/flor/pcore/set.rb +74 -15
- data/lib/flor/pcore/shuffle.rb +71 -0
- data/lib/flor/pcore/slice.rb +137 -0
- data/lib/flor/pcore/sort.rb +244 -0
- data/lib/flor/pcore/sort_by.rb +67 -0
- data/lib/flor/pcore/split.rb +39 -0
- data/lib/flor/pcore/stall.rb +1 -1
- data/lib/flor/pcore/strings.rb +123 -0
- data/lib/flor/pcore/timestamp.rb +34 -0
- data/lib/flor/pcore/to_array.rb +2 -3
- data/lib/flor/pcore/twig.rb +1 -1
- data/lib/flor/pcore/type_of.rb +37 -0
- data/lib/flor/pcore/until.rb +3 -3
- data/lib/flor/punit/cancel.rb +3 -3
- data/lib/flor/punit/ccollect.rb +29 -0
- data/lib/flor/punit/cmap.rb +76 -20
- data/lib/flor/punit/concurrence.rb +440 -33
- data/lib/flor/punit/cron.rb +1 -1
- data/lib/flor/punit/every.rb +1 -1
- data/lib/flor/punit/graft.rb +2 -3
- data/lib/flor/punit/on_timeout.rb +5 -1
- data/lib/flor/punit/part.rb +63 -0
- data/lib/flor/punit/schedule.rb +1 -1
- data/lib/flor/punit/task.rb +52 -10
- data/lib/flor/punit/trap.rb +4 -5
- data/lib/flor/tools/shell.rb +37 -18
- data/lib/flor/unit/caller.rb +23 -11
- data/lib/flor/unit/executor.rb +33 -12
- data/lib/flor/unit/ganger.rb +10 -1
- data/lib/flor/unit/hook.rb +2 -1
- data/lib/flor/unit/hooker.rb +13 -2
- data/lib/flor/unit/loader.rb +7 -7
- data/lib/flor/unit/logger.rb +15 -17
- data/lib/flor/unit/models.rb +4 -2
- data/lib/flor/unit/models/execution.rb +83 -38
- data/lib/flor/unit/models/message.rb +16 -0
- data/lib/flor/unit/models/pointer.rb +24 -0
- data/lib/flor/unit/models/timer.rb +25 -4
- data/lib/flor/unit/models/trace.rb +14 -0
- data/lib/flor/unit/models/trap.rb +39 -14
- data/lib/flor/unit/scheduler.rb +11 -7
- data/lib/flor/unit/storage.rb +55 -39
- data/lib/flor/unit/taskers.rb +17 -14
- data/lib/flor/unit/waiter.rb +4 -3
- metadata +40 -10
- data/lib/flor/changes.rb +0 -26
- data/lib/flor/dollar.rb +0 -224
- data/lib/flor/unit/hooks.rb +0 -37
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
class Flor::Pro::Ref < Flor::Procedure
|
3
|
+
|
4
|
+
names %w[ _ref _rep ]
|
5
|
+
|
6
|
+
def pre_execute
|
7
|
+
|
8
|
+
@node['rets'] = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def receive_last
|
12
|
+
|
13
|
+
rs = @node['rets']
|
14
|
+
rs = rs[0] if rs.size == 1 && rs[0].match(/[.\[]/)
|
15
|
+
pa = Dense::Path.make(rs).to_a
|
16
|
+
|
17
|
+
payload['ret'] =
|
18
|
+
if tree[0] == '_rep'
|
19
|
+
pa
|
20
|
+
elsif pa.size == 2 && pa[1] == 'ret' && field?(pa)
|
21
|
+
parent ?
|
22
|
+
parent_node_procedure.node_payload_ret :
|
23
|
+
node_payload_ret
|
24
|
+
else
|
25
|
+
lookup_value(pa)
|
26
|
+
end
|
27
|
+
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def field?(path)
|
34
|
+
|
35
|
+
(s = path[0]) && s.is_a?(String) && s.match(/\Af(ld|ield)?\z/)
|
36
|
+
end
|
37
|
+
|
38
|
+
def lookup_value(path)
|
39
|
+
|
40
|
+
super(path)
|
41
|
+
|
42
|
+
rescue KeyError => ke
|
43
|
+
|
44
|
+
return nil if field?(ke.work_path)
|
45
|
+
return nil if child_id == 1 && (n = parent_node) && n['heat0'] == '_head'
|
46
|
+
return nil if ke.miss[1].any? && ke.miss[4].empty?
|
47
|
+
|
48
|
+
raise
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class Flor::Pro::RegularExpressionString < Flor::Procedure
|
3
|
+
|
4
|
+
name '_rxs'
|
5
|
+
|
6
|
+
def pre_execute
|
7
|
+
|
8
|
+
@node['rets'] = []
|
9
|
+
@node['atts'] = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute_child(index=0, sub=nil, h=nil)
|
13
|
+
|
14
|
+
payload['ret'] = node_payload_ret
|
15
|
+
# always pass the noe_payload_ret to children
|
16
|
+
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def receive_last
|
21
|
+
|
22
|
+
rex = [ '_rxs', "/#{@node['rets'].join}/#{att('rxopts')}", tree[2] ]
|
23
|
+
|
24
|
+
wrap('ret' => rex)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
data/lib/flor/pcore/_val.rb
CHANGED
@@ -5,15 +5,20 @@ class Flor::Pro::Val < Flor::Procedure
|
|
5
5
|
|
6
6
|
def wrap_reply
|
7
7
|
|
8
|
-
|
8
|
+
payload['ret'] = tree_to_value(@node['heat']) \
|
9
|
+
if node_open?
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
super
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
end
|
14
|
+
protected
|
15
15
|
|
16
|
-
|
16
|
+
def tree_to_value(t)
|
17
|
+
|
18
|
+
case t[0]
|
19
|
+
when '_func', '_proc', '_tasker' then t
|
20
|
+
else t[1]
|
21
|
+
end
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
class Flor::Pro::
|
2
|
+
class Flor::Pro::Andor < Flor::Procedure
|
3
3
|
#
|
4
4
|
# When `and` evaluates the children and returns false as soon
|
5
5
|
# as one of returns a falsy value. Returns true else.
|
@@ -23,7 +23,7 @@ class Flor::Pro::Logo < Flor::Procedure
|
|
23
23
|
|
24
24
|
def execute
|
25
25
|
|
26
|
-
payload['ret'] =
|
26
|
+
payload['ret'] = (heap == 'and')
|
27
27
|
|
28
28
|
super
|
29
29
|
end
|
@@ -32,11 +32,9 @@ class Flor::Pro::Logo < Flor::Procedure
|
|
32
32
|
|
33
33
|
c = children[@fcid]; return super if c[0] == '_att' && [1].size == 2
|
34
34
|
|
35
|
-
h0 = @node['heat0']
|
36
|
-
|
37
35
|
ret = Flor.true?(payload['ret'])
|
38
36
|
|
39
|
-
return wrap_reply if ((
|
37
|
+
return wrap_reply if ((heap == 'or' && ret) || (heap == 'and' && ! ret))
|
40
38
|
|
41
39
|
super
|
42
40
|
end
|
@@ -51,7 +49,7 @@ class Flor::Pro::Logo < Flor::Procedure
|
|
51
49
|
# def receive_last
|
52
50
|
#
|
53
51
|
# payload['ret'] =
|
54
|
-
# if
|
52
|
+
# if heap == 'or'
|
55
53
|
# !! @node['rets'].index { |r| Flor.true?(r) }
|
56
54
|
# else
|
57
55
|
# ! @node['rets'].index { |r| Flor.false?(r) }
|
data/lib/flor/pcore/apply.rb
CHANGED
@@ -23,6 +23,41 @@ class Flor::Pro::Apply < Flor::Procedure
|
|
23
23
|
# ```
|
24
24
|
# where flor figures out by itself it has to use this "apply" procedure
|
25
25
|
# to call the function.
|
26
|
+
#
|
27
|
+
# ## rubyesque blocks
|
28
|
+
#
|
29
|
+
# In Ruby, one case pass a block on a function call:
|
30
|
+
# ```ruby
|
31
|
+
# def f(i)
|
32
|
+
# i * yield
|
33
|
+
# end
|
34
|
+
# p f(5) { |j| 10 }
|
35
|
+
# ```
|
36
|
+
# which just prints `50`.
|
37
|
+
#
|
38
|
+
# This can be achieved in flor like this:
|
39
|
+
# ```
|
40
|
+
# define f i
|
41
|
+
# * i (yield _)
|
42
|
+
# f 5
|
43
|
+
# 10
|
44
|
+
# echo f.ret
|
45
|
+
# ```
|
46
|
+
#
|
47
|
+
# If one needs to have a "block" with parameters, it can be done by having
|
48
|
+
# an anonymous function definition has the only thing in the block:
|
49
|
+
# ```
|
50
|
+
# define f i
|
51
|
+
# + i (yield i)
|
52
|
+
# f 5
|
53
|
+
# def j
|
54
|
+
# * 3 j
|
55
|
+
# f.ret #=> 20
|
56
|
+
# ```
|
57
|
+
#
|
58
|
+
# ## see also
|
59
|
+
#
|
60
|
+
# define.
|
26
61
|
|
27
62
|
name 'apply'
|
28
63
|
|
@@ -38,22 +73,57 @@ class Flor::Pro::Apply < Flor::Procedure
|
|
38
73
|
super
|
39
74
|
end
|
40
75
|
|
76
|
+
def receive_last_att
|
77
|
+
|
78
|
+
return do_apply unless tree[1][@ncid]
|
79
|
+
|
80
|
+
rewrite_block_into_function
|
81
|
+
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
41
85
|
def receive_last
|
42
86
|
|
43
|
-
|
87
|
+
do_apply
|
88
|
+
end
|
44
89
|
|
90
|
+
protected
|
91
|
+
|
92
|
+
def do_apply
|
93
|
+
|
94
|
+
args = @node['atts']
|
45
95
|
nht = @node['heat']
|
46
96
|
|
47
97
|
src =
|
48
98
|
Flor.is_proc_tree?(nht) && nht[1]['proc'] == 'apply' ?
|
49
|
-
args.shift :
|
99
|
+
args.shift[1] :
|
50
100
|
nht
|
51
101
|
|
102
|
+
args << [ 'yield', payload_ret ] \
|
103
|
+
if ! from_att? && Flor.is_func_tree?(payload_ret)
|
104
|
+
|
52
105
|
ms = apply(src, args, tree[2])
|
53
106
|
|
54
107
|
@node['applied'] = ms.first['nid']
|
55
108
|
|
56
109
|
ms
|
57
110
|
end
|
111
|
+
|
112
|
+
def rewrite_block_into_function
|
113
|
+
|
114
|
+
t = tree
|
115
|
+
cn = t[1][@ncid..-1]
|
116
|
+
c0 = cn[0]
|
117
|
+
|
118
|
+
return if cn.size == 1 && %w[ def fun ].include?(c0[0])
|
119
|
+
#
|
120
|
+
# if the single child is a "def" or "fun", no need to rewrite,
|
121
|
+
# that single child function becomes the block
|
122
|
+
|
123
|
+
bt = [ 'def', cn, t[2] ]
|
124
|
+
t[1] = (@fcid ? t[1][0..@fcid] : []) + [ bt ]
|
125
|
+
|
126
|
+
@node['tree'] = t
|
127
|
+
end
|
58
128
|
end
|
59
129
|
|
data/lib/flor/pcore/arith.rb
CHANGED
@@ -42,16 +42,28 @@ class Flor::Pro::Arith < Flor::Procedure
|
|
42
42
|
fail Flor::FlorError.new('modulo % requires at least 2 arguments', self) \
|
43
43
|
if sign == :% && count < 2
|
44
44
|
|
45
|
-
|
45
|
+
ret =
|
46
46
|
if @node['rets'].compact.empty?
|
47
47
|
DEFAULTS[sign]
|
48
48
|
elsif sign == :+
|
49
|
-
@node['rets'].reduce { |r, e|
|
49
|
+
@node['rets'].reduce { |r, e|
|
50
|
+
# TODO use djan instead of #to_s?
|
51
|
+
# TODO use JSON instead of #to_s or djan?
|
52
|
+
r + (r.is_a?(String) ? e.to_s : e) }
|
50
53
|
else
|
51
|
-
@node['rets']
|
54
|
+
rets = @node['rets']
|
55
|
+
rets = rets.collect(&:to_f) \
|
56
|
+
if sign == :/ || rets.find { |r| r.is_a?(Float) }
|
57
|
+
rets.reduce(&sign)
|
52
58
|
end
|
53
59
|
|
54
|
-
|
60
|
+
unless ret.is_a?(String)
|
61
|
+
round = ret.round
|
62
|
+
ret = round if round.to_f.to_s == ret.to_f.to_s
|
63
|
+
end
|
64
|
+
# follow JSON somehow, in show "1.0" as "1"...
|
65
|
+
|
66
|
+
wrap_reply('ret' => ret)
|
55
67
|
end
|
56
68
|
end
|
57
69
|
|
@@ -0,0 +1,100 @@
|
|
1
|
+
|
2
|
+
class Flor::Pro::ArrayQmark < Flor::Procedure
|
3
|
+
#
|
4
|
+
# Returns true if the argument or the incoming ret matches in type.
|
5
|
+
#
|
6
|
+
# ```
|
7
|
+
# array? [] # => true,
|
8
|
+
# []; array? _ # => true,
|
9
|
+
# array? false # => false,
|
10
|
+
# false; array? _ # => false,
|
11
|
+
#
|
12
|
+
# object? {} # => true,
|
13
|
+
# object? false # => false,
|
14
|
+
#
|
15
|
+
# number? 0 # => true,
|
16
|
+
# number? 0.1 # => true,
|
17
|
+
# number? "dang" # => false,
|
18
|
+
# number? [] # => false,
|
19
|
+
#
|
20
|
+
# string? "hello" # => true,
|
21
|
+
# string? [] # => false,
|
22
|
+
#
|
23
|
+
# true? true # => true,
|
24
|
+
# true? false # => false,
|
25
|
+
# true? 0 # => false,
|
26
|
+
#
|
27
|
+
# boolean? true # => true,
|
28
|
+
# boolean? false # => true,
|
29
|
+
# boolean? [] # => false,
|
30
|
+
#
|
31
|
+
# null? null # => true,
|
32
|
+
# null? 0 # => false,
|
33
|
+
#
|
34
|
+
# false? false # => true,
|
35
|
+
# false? true # => false,
|
36
|
+
# false? "false" # => false,
|
37
|
+
#
|
38
|
+
# nil? null # => true,
|
39
|
+
# nil? 0 # => false,
|
40
|
+
#
|
41
|
+
# pair? [ 0 1 ] # => true,
|
42
|
+
# pair? [] # => false,
|
43
|
+
# pair? 0 # => false,
|
44
|
+
#
|
45
|
+
# float? 1.0 # => true,
|
46
|
+
# float? 1 # => false,
|
47
|
+
# float? {} # => false,
|
48
|
+
#
|
49
|
+
# boolean? true tag: "xxx" # => true,
|
50
|
+
# true; boolean? tag: "xxx" # => true,
|
51
|
+
# string? {} tag: "xxx" # => false,
|
52
|
+
# {}; string? tag: "xxx" # => false,
|
53
|
+
# ```
|
54
|
+
#
|
55
|
+
# ## see also
|
56
|
+
#
|
57
|
+
# type-of, type
|
58
|
+
|
59
|
+
names %w[
|
60
|
+
array? object? boolean? number? string? null?
|
61
|
+
list? dict? hash? nil?
|
62
|
+
false? true?
|
63
|
+
pair? float? ]
|
64
|
+
|
65
|
+
def pre_execute
|
66
|
+
|
67
|
+
@node['ret'] = receive_payload_ret
|
68
|
+
|
69
|
+
unatt_unkeyed_children
|
70
|
+
end
|
71
|
+
|
72
|
+
def receive_last
|
73
|
+
|
74
|
+
t = Flor.type(@node['ret'])
|
75
|
+
|
76
|
+
r =
|
77
|
+
case h = heap
|
78
|
+
|
79
|
+
when 'array?', 'list?' then t == :array
|
80
|
+
when 'object?', 'hash?' 'dict?' then t == :object
|
81
|
+
when 'boolean?' then t == :boolean
|
82
|
+
when 'number?' then t == :number
|
83
|
+
when 'string?' then t == :string
|
84
|
+
when 'null?', 'nil?' then t == :null
|
85
|
+
|
86
|
+
when 'false?' then @node['ret'] == false
|
87
|
+
when 'true?' then @node['ret'] == true
|
88
|
+
|
89
|
+
when 'pair?' then t == :array && @node['ret'].length == 2
|
90
|
+
when 'float?' then t == :number && @node['ret'].to_s.index('.') != nil
|
91
|
+
|
92
|
+
else fail(Flor::FlorError.new("#{h.inspect} not yet implemented", self))
|
93
|
+
end
|
94
|
+
|
95
|
+
wrap_reply('ret' => r)
|
96
|
+
end
|
97
|
+
|
98
|
+
def receive_payload_ret; payload['ret']; end # don't duplicate the ret
|
99
|
+
end
|
100
|
+
|
data/lib/flor/pcore/break.rb
CHANGED
@@ -60,7 +60,6 @@ class Flor::Pro::Break < Flor::Procedure
|
|
60
60
|
|
61
61
|
ref = att('ref')
|
62
62
|
nid = tags_to_nids(ref).first || @node['heat'][1]['nid']
|
63
|
-
#p [ :break, @node['heap'], nid ]
|
64
63
|
|
65
64
|
payload['ret'] = att(nil) if has_att?(nil)
|
66
65
|
|
@@ -68,7 +67,7 @@ class Flor::Pro::Break < Flor::Procedure
|
|
68
67
|
|
69
68
|
if nid
|
70
69
|
|
71
|
-
ms += wrap_cancel('nid' => nid, 'flavour' =>
|
70
|
+
ms += wrap_cancel('nid' => nid, 'flavour' => heap)
|
72
71
|
end
|
73
72
|
|
74
73
|
unless is_ancestor_node?(nid)
|
data/lib/flor/pcore/case.rb
CHANGED
data/lib/flor/pcore/cmp.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
class Flor::Pro::Cmp < Flor::Procedure
|
3
3
|
|
4
|
-
names %w[ = == < > ]
|
4
|
+
names %w[ = == < > <= >= != <> ]
|
5
5
|
|
6
6
|
def pre_execute
|
7
7
|
|
@@ -14,7 +14,8 @@ class Flor::Pro::Cmp < Flor::Procedure
|
|
14
14
|
if @node['rets'].size > 1
|
15
15
|
case tree[0]
|
16
16
|
when '=', '==' then check_equal
|
17
|
-
when '
|
17
|
+
when '!=', '<>' then ! check_equal
|
18
|
+
when '<', '>', '>=', '<=' then check_lesser
|
18
19
|
else true
|
19
20
|
end
|
20
21
|
else
|
data/lib/flor/pcore/collect.rb
CHANGED
@@ -4,7 +4,7 @@ require 'flor/pcore/iterator'
|
|
4
4
|
|
5
5
|
class Flor::Pro::Collect < Flor::Macro::Iterator
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# A simplified version of [map](map.md).
|
8
8
|
#
|
9
9
|
# ```
|
10
10
|
# map [ 1, 2, 3 ]
|
@@ -38,7 +38,7 @@ class Flor::Pro::Collect < Flor::Macro::Iterator
|
|
38
38
|
#
|
39
39
|
# ## see also
|
40
40
|
#
|
41
|
-
# Map.
|
41
|
+
# Map, cmap, ccollect.
|
42
42
|
|
43
43
|
name 'collect'
|
44
44
|
|
data/lib/flor/pcore/cond.rb
CHANGED
@@ -35,9 +35,27 @@ class Flor::Pro::Cond < Flor::Procedure
|
|
35
35
|
# else | "ten or bigger"
|
36
36
|
# ```
|
37
37
|
#
|
38
|
+
# Please note that, as for [if](if.md), composite consequences have to be
|
39
|
+
# "packaged":
|
40
|
+
# ```
|
41
|
+
# cond
|
42
|
+
# a < 4
|
43
|
+
# sequence
|
44
|
+
# do_this
|
45
|
+
# do_that
|
46
|
+
# a < 7
|
47
|
+
# concurrence
|
48
|
+
# do_this
|
49
|
+
# do_that
|
50
|
+
# else
|
51
|
+
# sequence
|
52
|
+
# do_this 'default'
|
53
|
+
# do_that 'default'
|
54
|
+
# ```
|
55
|
+
#
|
38
56
|
# ## see also
|
39
57
|
#
|
40
|
-
# If, match.
|
58
|
+
# If, match, case.
|
41
59
|
|
42
60
|
name 'cond'
|
43
61
|
|