Skip to content

Commit 8752181

Browse files
committed
Extended Sugar Char chaining
1 parent c02fa0a commit 8752181

2 files changed

Lines changed: 20 additions & 23 deletions

File tree

‎pyth.py‎

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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 ('=', '~'):

‎test.py‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
('#/2-2Z=+Z1', '1\n2'),
5656
('.A#[Y]0]1,1 0,4 5\\a', "[[], [1], [4, 5], 'a']"),
5757
('%#2[3 4 5 1 0', '[3, 5, 1]'),
58+
('_I#["aba""dasd""kewek', "['aba', 'kewek']"),
5859
# $
5960
("\n$'\\0121'", '\n1'),
6061
# %
@@ -266,9 +267,9 @@
266267
('*M[[3 1 2)[8 7 6', '[6, 336]'),
267268
('XM[[U3 1 4)[2 U3 _1', '[[0, 4, 2], [0, 1, 1]]'),
268269
('_MM[,1 2,3 4', '[[-1, -2], [-3, -4]]'),
269-
('/ML3[,1 2,3 4', '[[3, 1], [1, 0]]'),
270-
('/MR3[,1 2,3 4', '[[0, 0], [1, 1]]'),
271-
('*MML2[,,1 4,5 2,,3 1,3 6', '[[[2, 8], [10, 4]], [[6, 2], [6, 12]]]'),
270+
('/LL3[,1 2,3 4', '[[3, 1], [1, 0]]'),
271+
('/RL3[,1 2,3 4', '[[0, 0], [1, 1]]'),
272+
('*LLL2[,,1 4,5 2,,3 1,3 6', '[[[2, 8], [10, 4]], [[6, 2], [6, 12]]]'),
272273
# N
273274
('N', '"'),
274275
# O

0 commit comments

Comments
 (0)