@@ -103,39 +103,35 @@ def parse(code, spacing="\n "):
103103 else :
104104 arity = c_to_i [active_char ][1 ]
105105
106+ # Sugar Chaining
107+ sugar_chars = 'FMLBRID#VW'
108+ sugar_active_char = active_char
109+ while sugar_char in sugar_chars and remainder and remainder [0 ] in sugar_chars :
110+ sugar_active_char += sugar_char
111+ sugar_char = remainder [0 ]
112+ remainder = remainder [1 :]
106113 if arity > 0 :
107114 # <binary function/infix>F: Fold operator
108115 if sugar_char == 'F' :
109116 if arity == 2 :
110117 reduce_arg1 = lambda_vars ['.U' ][0 ][0 ]
111118 reduce_arg2 = lambda_vars ['.U' ][0 ][- 1 ]
112119 return parse (".U" +
113- active_char +
120+ sugar_active_char +
114121 reduce_arg1 +
115122 reduce_arg2 +
116123 remainder )
117124 else :
118125 # Just splat it - it's a common use case.
119- return parse (active_char + ".*" + remainder )
126+ return parse (sugar_active_char + ".*" + remainder )
120127
121128 # <function>M: Map operator
122129 if sugar_char == 'M' :
123130 m_arg = lambda_vars ['m' ][0 ][0 ]
124- if remainder and remainder [0 ] in 'LMR' :
125- while remainder and remainder [0 ] in 'LMR' :
126- if remainder [0 ] == 'M' :
127- active_char += remainder [0 ]
128- remainder = remainder [1 :]
129- if remainder and remainder [0 ] in 'LR' :
130- active_char += remainder [0 ]
131- remainder = remainder [1 :]
132- seg , remainder = next_seg (remainder )
133- active_char += seg
134- return parse ('m' + active_char + m_arg + remainder )
135131 if arity == 1 :
136- return parse ('m' + active_char + m_arg + remainder )
132+ return parse ('m' + sugar_active_char + m_arg + remainder )
137133 else :
138- return parse ('m%sF%s%s' % (active_char , m_arg , remainder ))
134+ return parse ('m%sF%s%s' % (sugar_active_char , m_arg , remainder ))
139135 # <binary function>L<any><seq>: Left Map operator
140136 # >LG[1 2 3 4 -> 'm>Gd[1 2 3 4'.
141137 if sugar_char == 'L' :
@@ -145,19 +141,19 @@ def parse(code, spacing="\n "):
145141 seg , remainder = next_seg (remainder )
146142 pyth_seg += seg
147143 m_arg = lambda_vars ['m' ][0 ][0 ]
148- return parse ('m' + active_char + pyth_seg + m_arg + remainder )
144+ return parse ('m' + sugar_active_char + pyth_seg + m_arg + remainder )
149145
150146 # <function>V<seq><seq> Vectorize operator.
151147 # Equivalent to <func>MC,<seq><seq>.
152148 if sugar_char == 'V' :
153- return parse ("%sMC,%s" % (active_char , remainder ))
149+ return parse ("%sMC,%s" % (sugar_active_char , remainder ))
154150
155151 # <function>W<condition><arg><rgs> Condition application operator.
156152 # Equivalent to ?<condition><function><arg><args><arg>
157153 if sugar_char == 'W' :
158154 condition , rest_code1 = parse (remainder )
159155 arg1 , rest_code2 = state_maintaining_parse (rest_code1 )
160- func , rest_code2b = parse (active_char + rest_code1 )
156+ func , rest_code2b = parse (sugar_active_char + rest_code1 )
161157 return ('(%s if %s else %s)' % (func , condition , arg1 ), rest_code2b )
162158
163159 # <function>B<arg><args> -> ,<arg><function><arg><args>
@@ -171,7 +167,7 @@ def parse(code, spacing="\n "):
171167 func_char = func_dict [sugar_char ]
172168 parsed , rest = state_maintaining_parse (remainder )
173169 pyth_seg = remainder [:len (remainder ) - len (rest )]
174- return parse (func_char + pyth_seg + active_char + remainder )
170+ return parse (func_char + pyth_seg + sugar_active_char + remainder )
175171
176172 # Right operators
177173 # R is Map operator
@@ -185,7 +181,7 @@ def parse(code, spacing="\n "):
185181 }
186182 func_char = func_dict [sugar_char ]
187183 lambda_arg = lambda_vars [func_char ][0 ][0 ]
188- return parse (func_char + active_char + lambda_arg + remainder )
184+ return parse (func_char + sugar_active_char + lambda_arg + remainder )
189185
190186 # =<function/infix>, ~<function/infix>: augmented assignment.
191187 if active_char in ('=' , '~' ):
0 commit comments