annotate src/core.c/Junction.pm6 @ 0:c341f82e7ad7 default tip

Rakudo branch in cr.ie.u-ryukyu.ac.jp
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 26 Dec 2019 16:50:27 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 my class Junction { # declared in BOOTSTRAP
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 # class Junction is Mu
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 # has Mu $!storage; # elements of Junction
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 # has str $!type; # type of Junction
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 # Both of these are also accessed directly inside optimizer when
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 # optimizing param typechecks with where clauses
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 method !SET-SELF(\type,\values) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 ($!type = type),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 nqp::iseq_s($!type,"any")
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 || nqp::iseq_s($!type,"all")
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 || nqp::iseq_s($!type,"none")
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 || nqp::iseq_s($!type,"one"),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 ($!storage := nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 nqp::isconcrete(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 $_ := nqp::getattr(values.map({nqp::decont($_)}).eager.list,List,'$!reified')),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 $_,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 nqp::create(IterationBuffer))),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 self
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 Failure.new("Junction can only have 'any', 'all', 'none', 'one' type")
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 # Swap 2 Junctions in place if they need to be for an infix operation
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 # on the two Junctions. Returns a truthy (0|1)value if the Junctions
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 # were of the same type and can be merged.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 method INFIX-TWO(Junction:U: Junction:D \a, Junction:D \b) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 nqp::iseq_s(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 (my \atype := nqp::getattr(nqp::decont(a),Junction,'$!type')),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 (my \btype := nqp::getattr(nqp::decont(b),Junction,'$!type'))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 nqp::isne_s(atype,"one"), # same
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 nqp::if( # not same
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 (nqp::iseq_s(btype,"all") || nqp::iseq_s(btype,"none"))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 && (nqp::iseq_s(atype,"any") || nqp::iseq_s(atype,"one")),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 nqp::stmts( # need to be swapped
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 nqp::bindattr(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 (my \ajunc := nqp::clone(nqp::decont(b))),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 nqp::getattr(nqp::decont(a),Junction,'$!storage')
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 nqp::bindattr(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 (my \bjunc := nqp::clone(nqp::decont(a))),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 nqp::getattr(nqp::decont(b),Junction,'$!storage')
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 (a = ajunc),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 (b = bjunc),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 0 # not same, now swapped
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 proto method new(|) {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 multi method new(Junction: \values, Str :$type!) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 nqp::create(Junction)!SET-SELF($type,values)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 multi method new(Junction: Str:D \type, \values) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 nqp::create(Junction)!SET-SELF(type,values)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 multi method defined(Junction:D:) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 nqp::hllbool(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 (my int $elems = nqp::elems($!storage)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 (my int $i),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 nqp::iseq_s($!type,'any'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 && nqp::isfalse(nqp::atpos($!storage,$i).defined),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 nqp::iseq_s($!type,'all'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 && nqp::atpos($!storage,$i).defined,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 nqp::iseq_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 nqp::iseq_s($!type,'none'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 && nqp::isfalse(nqp::atpos($!storage,$i).defined),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 nqp::iseq_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 nqp::stmts( # $!type eq 'one'
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 (my int $seen = 0),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 ($i = nqp::sub_i($i,1)), # increment in condition
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 nqp::islt_i(($i = nqp::add_i($i,1)),$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 && nqp::isle_i($seen,1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 nqp::atpos($!storage,$i).defined,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 ($seen = nqp::add_i($seen,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 nqp::iseq_i($seen,1)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 multi method Bool(Junction:D:) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 nqp::hllbool(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 (my int $elems = nqp::elems($!storage)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 (my int $i),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 nqp::iseq_s($!type,'any'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 && nqp::isfalse(nqp::atpos($!storage,$i)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 nqp::iseq_s($!type,'all'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 && nqp::atpos($!storage,$i),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 nqp::iseq_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 nqp::iseq_s($!type,'none'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 && nqp::isfalse(nqp::atpos($!storage,$i)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 nqp::iseq_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 nqp::stmts( # $!type eq 'one'
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 (my int $seen = 0),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 ($i = nqp::sub_i($i,1)), # increment in condition
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 nqp::islt_i(($i = nqp::add_i($i,1)),$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 && nqp::isle_i($seen,1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 nqp::atpos($!storage,$i),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 ($seen = nqp::add_i($seen,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 nqp::iseq_i($seen,1)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 multi method ACCEPTS(Junction:U: Mu:D \topic) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 nqp::hllbool(nqp::istype(topic, Junction));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 multi method ACCEPTS(Junction:U: Any \topic) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 nqp::hllbool(nqp::istype(topic, Junction));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 multi method ACCEPTS(Junction:D: Mu \topic) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 nqp::hllbool(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 (my int $elems = nqp::elems($!storage)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 (my int $i),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 nqp::iseq_s($!type,'any'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 && nqp::isfalse(nqp::atpos($!storage,$i).ACCEPTS(topic)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 nqp::iseq_s($!type,'all'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 && nqp::atpos($!storage,$i).ACCEPTS(topic),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 nqp::iseq_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 nqp::iseq_s($!type,'none'),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 nqp::islt_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 && nqp::isfalse(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 nqp::atpos($!storage,$i).ACCEPTS(topic)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 ($i = nqp::add_i($i,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 nqp::iseq_i($i,$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 nqp::stmts( # $!type eq 'one'
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 (my int $seen),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 ($i = nqp::sub_i($i,1)), # increment in condition
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 nqp::islt_i(($i = nqp::add_i($i,1)),$elems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 && nqp::isle_i($seen,1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 nqp::atpos($!storage,$i).ACCEPTS(topic),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 ($seen = nqp::add_i($seen,1))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 nqp::iseq_i($seen,1)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 multi method Str(Junction:D:) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 (my \storage := nqp::bindattr(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 (my \junction := nqp::clone(self)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 nqp::clone(nqp::getattr(self,Junction,'$!storage'))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 )),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 (my int $elems = nqp::elems(storage)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 (my int $i = -1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 nqp::islt_i(($i = nqp::add_i($i,1)),$elems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 nqp::unless(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 nqp::istype(nqp::atpos(storage,$i),Str),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 nqp::bindpos(storage,$i,nqp::atpos(storage,$i).Str)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 junction
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 multi method gist(Junction:D:) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 my int $elems = nqp::elems($!storage);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 my $gists := nqp::setelems(nqp::list_s,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 nqp::bindpos_s($gists,$i,nqp::atpos($!storage,$i).gist)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 while nqp::islt_i(++$i,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 $!type ~ '(' ~ nqp::join(', ',$gists) ~ ')'
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 multi method perl(Junction:D:) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 my int $elems = nqp::elems($!storage);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 my $perls := nqp::setelems(nqp::list_s,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 nqp::bindpos_s($perls,$i,nqp::atpos($!storage,$i).perl)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 while nqp::islt_i(++$i,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 $!type ~ '(' ~ nqp::join(', ',$perls) ~ ')'
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 method CALL-ME(|c) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 self.AUTOTHREAD(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 -> $obj, |c { $obj(|c) },
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 self, |c);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 method sink(Junction:D: --> Nil) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 my int $elems = nqp::elems($!storage);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 nqp::atpos($!storage,$i).sink while nqp::islt_i(++$i,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 # Helper method for handling those cases where auto-threading doesn't cut it.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 # Call the given Callable with each of the Junction values, and return a
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 # Junction with the results of the calls.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 method THREAD(&call) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 my \storage := nqp::getattr(self,Junction,'$!storage');
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 my int $elems = nqp::elems(storage);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 my \result := nqp::setelems(nqp::list,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 nqp::islt_i(++$i,$elems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 nqp::bindpos(result,$i,call(nqp::atpos(storage,$i)))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 );
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 nqp::p6bindattrinvres(nqp::clone(self),Junction,'$!storage',result)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 method AUTOTHREAD(&call, |args) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 my \positionals := nqp::getattr(nqp::decont(args),Capture,'@!list');
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 sub thread_junction(int $pos) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 my \junction := nqp::decont(nqp::atpos(positionals, $pos));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 my \storage := nqp::getattr(junction,Junction,'$!storage');
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 my int $elems = nqp::elems(storage);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 my \result := nqp::setelems(nqp::list,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 nqp::islt_i(($i = nqp::add_i($i,1)),$elems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 # Next line is Officially Naughty, since captures are
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 # meant to be immutable. But hey, it's our capture to
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 # be naughty with...
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 nqp::bindpos(positionals,$pos,nqp::atpos(storage,$i)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 nqp::bindpos(result,$i,call(|args))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 );
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 nqp::p6bindattrinvres(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 nqp::clone(junction),Junction,'$!storage',result)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
332
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 # Look for a junctional arg in the positionals.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 # we have to autothread the first all or none junction before
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 # doing any one or any junctions.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 my int $first_any_one = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 my int $elems = nqp::elems(positionals);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 while nqp::islt_i(++$i,$elems) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
340
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 # Junctional positional argument?
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 my Mu $arg := nqp::atpos(positionals, $i);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 if nqp::istype($arg,Junction) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 my str $type = nqp::getattr_s(nqp::decont($arg),Junction,'$!type');
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 nqp::iseq_s($type,'any') || nqp::iseq_s($type,'one')
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 ?? $first_any_one == -1
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 ?? ($first_any_one = $i)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 !! Nil
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 !! return thread_junction($i);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 return thread_junction($first_any_one) if $first_any_one >= 0;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
353
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 # Otherwise, look for one in the nameds.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 my \nameds := nqp::getattr(nqp::decont(args), Capture, '%!hash');
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 my \iter := nqp::iterator(nameds);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 while iter {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 if nqp::istype(nqp::iterval(nqp::shift(iter)),Junction) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 my \junction := nqp::decont(nqp::iterval(iter));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 my \storage := nqp::getattr(junction,Junction,'$!storage');
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 my int $elems = nqp::elems(storage);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 my \result := nqp::setelems(nqp::list,$elems);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 my int $i = -1;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
364
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 while nqp::islt_i(++$i,$elems) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
366 # also naughty, like above
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 nqp::bindkey(nameds,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
368 nqp::iterkey_s(iter),nqp::atpos(storage,$i));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
369 nqp::bindpos(result,$i,call(|args));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
371
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 my \threaded := nqp::clone(nqp::decont(junction));
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 nqp::bindattr(threaded,Junction,'$!storage',result);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 return threaded;
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
377
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 # If we get here, wasn't actually anything to autothread.
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 call(|args);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 proto sub any(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 #multi sub any(@values) { @values.any } # this breaks S02-literals/radix.t
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 multi sub any(+values) { values.any }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
386
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 proto sub all(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 multi sub all(@values) { @values.all }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 multi sub all(+values) { values.all }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 proto sub one(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
392 multi sub one(@values) { @values.one }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 multi sub one(+values) { values.one }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 proto sub none(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 multi sub none(@values) { @values.none }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
397 multi sub none(+values) { values.none }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 proto sub infix:<|>(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 multi sub infix:<|>(+values) { values.any }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
401
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 proto sub infix:<&>(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 multi sub infix:<&>(+values) { values.all }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
404
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 proto sub infix:<^>(|) is pure {*}
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
406 multi sub infix:<^>(+values) is pure { values.one }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
407
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 multi sub infix:<~>(Str:D $a, Junction:D $b) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 $a,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 nqp::stmts( # something to concat with
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 (my \storage := nqp::bindattr(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 (my \junction := nqp::clone($b)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 nqp::clone(nqp::getattr($b,Junction,'$!storage'))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 )),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 (my int $elems = nqp::elems(storage)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 (my int $i = -1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 nqp::islt_i(($i = nqp::add_i($i,1)),$elems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 nqp::bindpos(storage,$i,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 nqp::istype((my \value := nqp::atpos(storage,$i)),Junction),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 infix:<~>($a,value),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 nqp::concat($a,nqp::if(nqp::istype(value,Str),value,value.Str))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 junction
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 $b.Str # nothing to concat with
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
435
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 multi sub infix:<~>(Junction:D $a, Str:D $b) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 $b,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 nqp::stmts( # something to concat with
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 (my \storage := nqp::bindattr(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 (my \junction := nqp::clone($a)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 nqp::clone(nqp::getattr($a,Junction,'$!storage'))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 )),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 (my int $elems = nqp::elems(storage)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 (my int $i = -1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 nqp::islt_i(($i = nqp::add_i($i,1)),$elems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 nqp::bindpos(storage,$i,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 nqp::istype((my \value := nqp::atpos(storage,$i)),Junction),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 infix:<~>(value,$b),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 nqp::concat(nqp::if(nqp::istype(value,Str),value,value.Str),$b)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 junction
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 $a.Str # nothing to concat with
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 multi sub infix:<~>(Junction:D \a, Junction:D \b) {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 nqp::stmts( # basic setup
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 (my int $mergable = Junction.INFIX-TWO(my $a = a, my $b = b)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 (my \astor := nqp::getattr(nqp::decont($a),Junction,'$!storage')),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 (my \bstor := nqp::getattr(nqp::decont($b),Junction,'$!storage')),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 (my int $aelems = nqp::elems(astor)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 (my int $belems = nqp::elems(bstor)),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 (my int $i = -1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 (my \seen := nqp::hash),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
473 (my \outer := nqp::bindattr( # outer eigenstates
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 (my \junction := nqp::clone(nqp::decont($a))),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 $mergable,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 nqp::list,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 nqp::setelems(nqp::list,$aelems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
481 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 )),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 nqp::while( # outer loop
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 nqp::islt_i(($i = nqp::add_i($i,1)),$aelems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
485 nqp::stmts(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 (my \aval := nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 nqp::istype(nqp::atpos(astor,$i),Str),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 nqp::atpos(astor,$i),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 nqp::atpos(astor,$i).Str
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 )),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 (my int $j = -1),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 $mergable,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 nqp::while( # merge eigenstates
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 nqp::islt_i(($j = nqp::add_i($j,1)),$belems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
496 nqp::unless(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 nqp::existskey(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 seen,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 (my \concat := nqp::concat(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 aval,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 nqp::istype(nqp::atpos(bstor,$j),Str),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 nqp::atpos(bstor,$j),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 nqp::atpos(bstor,$j).Str,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 ))
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 nqp::bindkey( # new one, remember
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
509 seen,nqp::push(outer,concat),1)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 nqp::stmts( # cannot merge eigenstates
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
513 (my \inner := nqp::bindattr(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
514 nqp::bindpos(outer,$i,nqp::clone(nqp::decont($b))),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 Junction,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 '$!storage',
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 nqp::setelems(nqp::list,$belems)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
518 )),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
519 nqp::while(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 nqp::islt_i(($j = nqp::add_i($j,1)),$belems),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 nqp::bindpos(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 inner,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 $j,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 nqp::concat(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 aval,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 nqp::if(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
527 nqp::istype(nqp::atpos(bstor,$j),Str),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 nqp::atpos(bstor,$j),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
529 nqp::atpos(bstor,$j).Str,
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
531 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
532 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
534 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
535 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
536 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 ),
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
538 junction
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
539 )
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 }
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
541
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
542 nqp::p6setautothreader( -> |c {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
543 Junction.AUTOTHREAD(|c)
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
544 } );
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
545 Mu.HOW.setup_junction_fallback(Junction, -> $name, |c {
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
546 Junction.AUTOTHREAD(
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
547 -> \obj, |c { obj."$name"(|c) },
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
548 |c);
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
549 } );
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
550
c341f82e7ad7 Rakudo branch in cr.ie.u-ryukyu.ac.jp
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
551 # vim: ft=perl6 expandtab sw=4