Handle definitions with non-alphanumeric chars in their names.

This commit is contained in:
Simon Forman 2023-02-08 12:50:23 -08:00
parent 832cbe34e4
commit 2be2d00e6b
7 changed files with 504 additions and 277 deletions

View File

@ -51,6 +51,14 @@ lt, def_lt
neq, def_neq
le, def_le
ge, def_ge
--, def_HYPHEN_MINUS_HYPHEN_MINUS
?, def_QUESTION_MARK
&&, def_AMPERSAND_AMPERSAND
++, def_PLUS_SIGN_PLUS_SIGN
||, def_VERTICAL_LINE_VERTICAL_LINE
!-, def_EXCLAMATION_MARK_HYPHEN_MINUS
<{}, def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET
<<{}, def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET
abs, def_abs
anamorphism, def_anamorphism
app1, def_app1
@ -109,6 +117,10 @@ range, def_range
range_to_zero, def_range_to_zero
reco, def_reco
reverse, def_reverse
roll>, def_roll_GREATER_THAN_SIGN
roll<, def_roll_LESS_THAN_SIGN
rollup, def_rollup
rolldown, def_rolldown
rrest, def_rrest
run, def_run
second, def_second
@ -138,3 +150,17 @@ unquoted, def_unquoted
unswons, def_unswons
while, def_while
x, def_x
step, def_step
_step0, def__step0
_step1, def__step1
_stept, def__stept
times, def_times
_times0, def__times0
_times1, def__times1
_timest, def__timest
map, def_map
_map?, def__map_QUESTION_MARK
_mape, def__mape
_map0, def__map0
_map1, def__map1
_map2, def__map2

View File

@ -13,31 +13,51 @@ and using it to write a simple Joy script to load the defs:
Eh?
'''
import sys
import sys, unicodedata
def filt(name):
'''
Pass alphanumeric chars and underscores, convert other chars
to their Unicode names so they can work as (portions of) C
identifiers.
'''
alnum = True
for i, ch in enumerate(name):
if alnum:
if ch.isalnum() or ch == '_':
yield ch
else:
alnum = False
if i:
yield '_'
yield (
unicodedata
.name(ch)
.replace(' ', '_')
.replace('-', '_')
)
else:
if ch.isalnum() or ch == '_':
alnum = True
yield '_'
yield ch
else:
yield '_'
yield (
unicodedata
.name(ch)
.replace(' ', '_')
.replace('-', '_')
)
def convert_name(name):
return name if name.isidentifier() else ''.join(filt(name))
defs = [line.strip() for line in open('./defs.txt')]
##defs = '''\
##abs dup 0 < [] [neg] branch
##anamorphism [pop []] swap [dip swons] genrec
##app1 grba infrst
##app2 [grba swap grba swap] dip [infrst] cons ii
##app3 3 appN
##appN [grabN] codi map reverse disenstacken
##at drop first
##average [sum] [size] cleave /
##b [i] dip i
##binary unary popd
##ccccons ccons ccons
##ccons cons cons
##cleave fork popdd
##clop cleave popdd
##codi cons dip
##codireco codi reco
##dinfrirst dip infrst
##dipd [dip] codi
##disenstacken ? [uncons ?] loop pop
##swons swap cons
##infra swons swaack [i] dip swaack'''.splitlines()
print(f'''\
@ -51,13 +71,14 @@ Do not edit.
if sys.argv[-1] == '--header':
for line in defs:
name, body = line.split(None, 1)
name = convert_name(name)
print(f'void def_{name}(JoyListPtr stack, JoyListPtr expression);')
elif sys.argv[-1] == '--keywords':
sys.stdout.write(open('KEYWORDS.in').read())
for line in defs:
name, body = line.split(None, 1)
print(f'{name}, def_{name}')
print(f'{name}, def_{convert_name(name)}')
else:
print('''\
@ -72,6 +93,7 @@ of the definitions.
''')
for line in defs:
name, body = line.split(None, 1)
name = convert_name(name)
print(f'JoyList def_{name}_body;')
@ -88,6 +110,7 @@ init_defs(void)
''')
for line in defs:
name, body = line.split(None, 1)
name = convert_name(name)
print(f'\tdef_{name}_body = text_to_expression("{body}");')
print('}')
@ -101,4 +124,5 @@ Last, a set of functions to go in the wordlist, one for each definition.
''')
for line in defs:
name, body = line.split(None, 1)
name = convert_name(name)
print(f'void def_{name}(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) {{ push_quote_onto_expression(def_{name}_body, expression); }}')

View File

@ -18,6 +18,14 @@ JoyList def_lt_body;
JoyList def_neq_body;
JoyList def_le_body;
JoyList def_ge_body;
JoyList def_HYPHEN_MINUS_HYPHEN_MINUS_body;
JoyList def_QUESTION_MARK_body;
JoyList def_AMPERSAND_AMPERSAND_body;
JoyList def_PLUS_SIGN_PLUS_SIGN_body;
JoyList def_VERTICAL_LINE_VERTICAL_LINE_body;
JoyList def_EXCLAMATION_MARK_HYPHEN_MINUS_body;
JoyList def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET_body;
JoyList def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET_body;
JoyList def_abs_body;
JoyList def_anamorphism_body;
JoyList def_app1_body;
@ -76,6 +84,10 @@ JoyList def_range_body;
JoyList def_range_to_zero_body;
JoyList def_reco_body;
JoyList def_reverse_body;
JoyList def_roll_GREATER_THAN_SIGN_body;
JoyList def_roll_LESS_THAN_SIGN_body;
JoyList def_rollup_body;
JoyList def_rolldown_body;
JoyList def_rrest_body;
JoyList def_run_body;
JoyList def_second_body;
@ -105,6 +117,20 @@ JoyList def_unquoted_body;
JoyList def_unswons_body;
JoyList def_while_body;
JoyList def_x_body;
JoyList def_step_body;
JoyList def__step0_body;
JoyList def__step1_body;
JoyList def__stept_body;
JoyList def_times_body;
JoyList def__times0_body;
JoyList def__times1_body;
JoyList def__timest_body;
JoyList def_map_body;
JoyList def__map_QUESTION_MARK_body;
JoyList def__mape_body;
JoyList def__map0_body;
JoyList def__map1_body;
JoyList def__map2_body;
/*
@ -121,6 +147,14 @@ init_defs(void)
def_neq_body = text_to_expression("[true] [false] [true] cmp");
def_le_body = text_to_expression("[false] [true] [true] cmp");
def_ge_body = text_to_expression("[true] [true] [false] cmp");
def_HYPHEN_MINUS_HYPHEN_MINUS_body = text_to_expression("1 -");
def_QUESTION_MARK_body = text_to_expression("dup bool");
def_AMPERSAND_AMPERSAND_body = text_to_expression("nulco [nullary [false]] dip branch");
def_PLUS_SIGN_PLUS_SIGN_body = text_to_expression("1 +");
def_VERTICAL_LINE_VERTICAL_LINE_body = text_to_expression("nulco [nullary] dip [true] branch");
def_EXCLAMATION_MARK_HYPHEN_MINUS_body = text_to_expression("0 >=");
def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET_body = text_to_expression("[] swap");
def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET_body = text_to_expression("[] rollup");
def_abs_body = text_to_expression("dup 0 < [] [neg] branch");
def_anamorphism_body = text_to_expression("[pop []] swap [dip swons] genrec");
def_app1_body = text_to_expression("grba infrst");
@ -179,6 +213,10 @@ init_defs(void)
def_range_to_zero_body = text_to_expression("unit [down_to_zero] infra");
def_reco_body = text_to_expression("rest cons");
def_reverse_body = text_to_expression("<{} shunt");
def_roll_GREATER_THAN_SIGN_body = text_to_expression("swap swapd");
def_roll_LESS_THAN_SIGN_body = text_to_expression("swapd swap");
def_rollup_body = text_to_expression("roll>");
def_rolldown_body = text_to_expression("roll<");
def_rrest_body = text_to_expression("rest rest");
def_run_body = text_to_expression("<{} infra");
def_second_body = text_to_expression("rest first");
@ -188,7 +226,7 @@ init_defs(void)
def_spiral_next_body = text_to_expression("[[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte");
def_split_at_body = text_to_expression("[drop] [take] clop");
def_split_list_body = text_to_expression("[take reverse] [drop] clop");
def_sqr_body = text_to_expression("dup *");
def_sqr_body = text_to_expression("dup mul");
def_stackd_body = text_to_expression("[stack] dip");
def_step_zero_body = text_to_expression("0 roll> step");
def_stuncons_body = text_to_expression("stack uncons");
@ -208,6 +246,20 @@ init_defs(void)
def_unswons_body = text_to_expression("uncons swap");
def_while_body = text_to_expression("swap nulco dupdipd concat loop");
def_x_body = text_to_expression("dup i");
def_step_body = text_to_expression("[_step0] x");
def__step0_body = text_to_expression("_step1 [popopop] [_stept] branch");
def__step1_body = text_to_expression("[?] dipd roll<");
def__stept_body = text_to_expression("[uncons] dipd [dupdipd] dip x");
def_times_body = text_to_expression("[_times0] x");
def__times0_body = text_to_expression("_times1 [popopop] [_timest] branch");
def__times1_body = text_to_expression("[dup 0 >] dipd roll<");
def__timest_body = text_to_expression("[[--] dip dupdipd] dip x");
def_map_body = text_to_expression("[_map0] cons [[] [_map?] [_mape]] dip tailrec");
def__map_QUESTION_MARK_body = text_to_expression("pop bool not");
def__mape_body = text_to_expression("popd reverse");
def__map0_body = text_to_expression("[_map1] dipd _map2");
def__map1_body = text_to_expression("stackd shift");
def__map2_body = text_to_expression("[infrst] cons dipd roll< swons");
}
@ -221,6 +273,14 @@ void def_lt(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { p
void def_neq(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_neq_body, expression); }
void def_le(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_le_body, expression); }
void def_ge(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_ge_body, expression); }
void def_HYPHEN_MINUS_HYPHEN_MINUS(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_HYPHEN_MINUS_HYPHEN_MINUS_body, expression); }
void def_QUESTION_MARK(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_QUESTION_MARK_body, expression); }
void def_AMPERSAND_AMPERSAND(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_AMPERSAND_AMPERSAND_body, expression); }
void def_PLUS_SIGN_PLUS_SIGN(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_PLUS_SIGN_PLUS_SIGN_body, expression); }
void def_VERTICAL_LINE_VERTICAL_LINE(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_VERTICAL_LINE_VERTICAL_LINE_body, expression); }
void def_EXCLAMATION_MARK_HYPHEN_MINUS(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_EXCLAMATION_MARK_HYPHEN_MINUS_body, expression); }
void def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET_body, expression); }
void def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET_body, expression); }
void def_abs(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_abs_body, expression); }
void def_anamorphism(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_anamorphism_body, expression); }
void def_app1(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_app1_body, expression); }
@ -279,6 +339,10 @@ void def_range(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression)
void def_range_to_zero(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_range_to_zero_body, expression); }
void def_reco(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_reco_body, expression); }
void def_reverse(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_reverse_body, expression); }
void def_roll_GREATER_THAN_SIGN(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_roll_GREATER_THAN_SIGN_body, expression); }
void def_roll_LESS_THAN_SIGN(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_roll_LESS_THAN_SIGN_body, expression); }
void def_rollup(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_rollup_body, expression); }
void def_rolldown(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_rolldown_body, expression); }
void def_rrest(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_rrest_body, expression); }
void def_run(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_run_body, expression); }
void def_second(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_second_body, expression); }
@ -308,3 +372,17 @@ void def_unquoted(__attribute__((unused)) JoyListPtr stack, JoyListPtr expressio
void def_unswons(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_unswons_body, expression); }
void def_while(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_while_body, expression); }
void def_x(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_x_body, expression); }
void def_step(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_step_body, expression); }
void def__step0(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__step0_body, expression); }
void def__step1(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__step1_body, expression); }
void def__stept(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__stept_body, expression); }
void def_times(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_times_body, expression); }
void def__times0(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__times0_body, expression); }
void def__times1(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__times1_body, expression); }
void def__timest(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__timest_body, expression); }
void def_map(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def_map_body, expression); }
void def__map_QUESTION_MARK(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__map_QUESTION_MARK_body, expression); }
void def__mape(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__mape_body, expression); }
void def__map0(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__map0_body, expression); }
void def__map1(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__map1_body, expression); }
void def__map2(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) { push_quote_onto_expression(def__map2_body, expression); }

View File

@ -9,6 +9,14 @@ void def_lt(JoyListPtr stack, JoyListPtr expression);
void def_neq(JoyListPtr stack, JoyListPtr expression);
void def_le(JoyListPtr stack, JoyListPtr expression);
void def_ge(JoyListPtr stack, JoyListPtr expression);
void def_HYPHEN_MINUS_HYPHEN_MINUS(JoyListPtr stack, JoyListPtr expression);
void def_QUESTION_MARK(JoyListPtr stack, JoyListPtr expression);
void def_AMPERSAND_AMPERSAND(JoyListPtr stack, JoyListPtr expression);
void def_PLUS_SIGN_PLUS_SIGN(JoyListPtr stack, JoyListPtr expression);
void def_VERTICAL_LINE_VERTICAL_LINE(JoyListPtr stack, JoyListPtr expression);
void def_EXCLAMATION_MARK_HYPHEN_MINUS(JoyListPtr stack, JoyListPtr expression);
void def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET(JoyListPtr stack, JoyListPtr expression);
void def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET(JoyListPtr stack, JoyListPtr expression);
void def_abs(JoyListPtr stack, JoyListPtr expression);
void def_anamorphism(JoyListPtr stack, JoyListPtr expression);
void def_app1(JoyListPtr stack, JoyListPtr expression);
@ -67,6 +75,10 @@ void def_range(JoyListPtr stack, JoyListPtr expression);
void def_range_to_zero(JoyListPtr stack, JoyListPtr expression);
void def_reco(JoyListPtr stack, JoyListPtr expression);
void def_reverse(JoyListPtr stack, JoyListPtr expression);
void def_roll_GREATER_THAN_SIGN(JoyListPtr stack, JoyListPtr expression);
void def_roll_LESS_THAN_SIGN(JoyListPtr stack, JoyListPtr expression);
void def_rollup(JoyListPtr stack, JoyListPtr expression);
void def_rolldown(JoyListPtr stack, JoyListPtr expression);
void def_rrest(JoyListPtr stack, JoyListPtr expression);
void def_run(JoyListPtr stack, JoyListPtr expression);
void def_second(JoyListPtr stack, JoyListPtr expression);
@ -96,3 +108,17 @@ void def_unquoted(JoyListPtr stack, JoyListPtr expression);
void def_unswons(JoyListPtr stack, JoyListPtr expression);
void def_while(JoyListPtr stack, JoyListPtr expression);
void def_x(JoyListPtr stack, JoyListPtr expression);
void def_step(JoyListPtr stack, JoyListPtr expression);
void def__step0(JoyListPtr stack, JoyListPtr expression);
void def__step1(JoyListPtr stack, JoyListPtr expression);
void def__stept(JoyListPtr stack, JoyListPtr expression);
void def_times(JoyListPtr stack, JoyListPtr expression);
void def__times0(JoyListPtr stack, JoyListPtr expression);
void def__times1(JoyListPtr stack, JoyListPtr expression);
void def__timest(JoyListPtr stack, JoyListPtr expression);
void def_map(JoyListPtr stack, JoyListPtr expression);
void def__map_QUESTION_MARK(JoyListPtr stack, JoyListPtr expression);
void def__mape(JoyListPtr stack, JoyListPtr expression);
void def__map0(JoyListPtr stack, JoyListPtr expression);
void def__map1(JoyListPtr stack, JoyListPtr expression);
void def__map2(JoyListPtr stack, JoyListPtr expression);

View File

@ -4,6 +4,14 @@ lt [false] [false] [true] cmp
neq [true] [false] [true] cmp
le [false] [true] [true] cmp
ge [true] [true] [false] cmp
-- 1 -
? dup bool
&& nulco [nullary [false]] dip branch
++ 1 +
|| nulco [nullary] dip [true] branch
!- 0 >=
<{} [] swap
<<{} [] rollup
abs dup 0 < [] [neg] branch
anamorphism [pop []] swap [dip swons] genrec
app1 grba infrst
@ -62,6 +70,10 @@ range [0 <=] [1 - dup] anamorphism
range_to_zero unit [down_to_zero] infra
reco rest cons
reverse <{} shunt
roll> swap swapd
roll< swapd swap
rollup roll>
rolldown roll<
rrest rest rest
run <{} infra
second rest first
@ -71,7 +83,7 @@ size [pop ++] step_zero
spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte
split_at [drop] [take] clop
split_list [take reverse] [drop] clop
sqr dup *
sqr dup mul
stackd [stack] dip
step_zero 0 roll> step
stuncons stack uncons
@ -91,3 +103,17 @@ unquoted [i] dip
unswons uncons swap
while swap nulco dupdipd concat loop
x dup i
step [_step0] x
_step0 _step1 [popopop] [_stept] branch
_step1 [?] dipd roll<
_stept [uncons] dipd [dupdipd] dip x
times [_times0] x
_times0 _times1 [popopop] [_timest] branch
_times1 [dup 0 >] dipd roll<
_timest [[--] dip dupdipd] dip x
map [_map0] cons [[] [_map?] [_mape]] dip tailrec
_map? pop bool not
_mape popd reverse
_map0 [_map1] dipd _map2
_map1 stackd shift
_map2 [infrst] cons dipd roll< swons

View File

@ -36,7 +36,7 @@
#line 13 "KEYWORDS.txt"
struct dict_entry;
#include <string.h>
/* maximum key range = 273, duplicates = 0 */
/* maximum key range = 294, duplicates = 0 */
#ifdef __GNUC__
__inline
@ -50,32 +50,32 @@ keyword_hash (register const char *str, register size_t len)
{
static const unsigned short asso_values[] =
{
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 5, 274, 274, 274, 75, 274, 274,
274, 274, 70, 65, 274, 45, 274, 30, 274, 65,
60, 50, 274, 274, 274, 274, 274, 274, 274, 274,
0, 25, 20, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 40, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 35, 60, 0,
5, 30, 40, 75, 15, 15, 274, 35, 40, 55,
0, 15, 0, 100, 70, 30, 25, 0, 5, 85,
10, 127, 5, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
274, 274, 274, 274, 274, 274
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 40, 295, 295, 295, 95, 60, 295,
295, 295, 80, 10, 295, 0, 295, 60, 110, 35,
20, 60, 295, 295, 295, 295, 295, 295, 295, 295,
90, 20, 30, 85, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 0, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 5, 295, 60, 55, 0,
5, 30, 40, 105, 5, 15, 295, 50, 40, 25,
0, 15, 0, 110, 70, 30, 25, 0, 65, 95,
25, 75, 25, 45, 45, 0, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
295, 295, 295, 295, 295, 295
};
register unsigned int hval = len;
@ -99,324 +99,372 @@ in_word_set (register const char *str, register size_t len)
{
enum
{
TOTAL_KEYWORDS = 126,
TOTAL_KEYWORDS = 152,
MIN_WORD_LENGTH = 1,
MAX_WORD_LENGTH = 14,
MIN_HASH_VALUE = 1,
MAX_HASH_VALUE = 273
MAX_HASH_VALUE = 294
};
static const struct dict_entry wordlist[] =
{
{""},
#line 17 "KEYWORDS.txt"
{"<", def_lt},
{""}, {""}, {""}, {""}, {""}, {""},
#line 28 "KEYWORDS.txt"
{"-", sub},
#line 54 "KEYWORDS.txt"
{"--", def_HYPHEN_MINUS_HYPHEN_MINUS},
{""}, {""}, {""}, {""}, {""},
#line 39 "KEYWORDS.txt"
{"dup", dup},
{""}, {""},
#line 77 "KEYWORDS.txt"
#line 85 "KEYWORDS.txt"
{"dupdip", def_dupdip},
{""}, {""},
#line 75 "KEYWORDS.txt"
#line 83 "KEYWORDS.txt"
{"dupd", def_dupd},
#line 76 "KEYWORDS.txt"
#line 84 "KEYWORDS.txt"
{"dupdd", def_dupdd},
{""},
#line 78 "KEYWORDS.txt"
#line 86 "KEYWORDS.txt"
{"dupdipd", def_dupdipd},
#line 43 "KEYWORDS.txt"
{"pop", pop},
{""},
#line 102 "KEYWORDS.txt"
#line 110 "KEYWORDS.txt"
{"popop", def_popop},
#line 140 "KEYWORDS.txt"
{"x", def_x},
#line 103 "KEYWORDS.txt"
#line 26 "KEYWORDS.txt"
{"+", add},
#line 111 "KEYWORDS.txt"
{"popopop", def_popopop},
#line 38 "KEYWORDS.txt"
{"dip", dip},
#line 100 "KEYWORDS.txt"
#line 108 "KEYWORDS.txt"
{"popd", def_popd},
#line 101 "KEYWORDS.txt"
#line 109 "KEYWORDS.txt"
{"popdd", def_popdd},
#line 104 "KEYWORDS.txt"
#line 112 "KEYWORDS.txt"
{"popopd", def_popopd},
#line 105 "KEYWORDS.txt"
#line 113 "KEYWORDS.txt"
{"popopdd", def_popopdd},
{""},
#line 71 "KEYWORDS.txt"
#line 35 "KEYWORDS.txt"
{"cmp", cmp_joyfunc},
#line 79 "KEYWORDS.txt"
{"dipd", def_dipd},
{""},
#line 41 "KEYWORDS.txt"
{"i", i_joyfunc},
{""},
#line 31 "KEYWORDS.txt"
{"div", tdiv_q},
{""}, {""},
#line 135 "KEYWORDS.txt"
#line 57 "KEYWORDS.txt"
{"++", def_PLUS_SIGN_PLUS_SIGN},
{""}, {""}, {""},
#line 147 "KEYWORDS.txt"
{"uncons", def_uncons},
#line 64 "KEYWORDS.txt"
#line 72 "KEYWORDS.txt"
{"ccccons", def_ccccons},
{""},
#line 68 "KEYWORDS.txt"
#line 76 "KEYWORDS.txt"
{"codi", def_codi},
{""},
#line 16 "KEYWORDS.txt"
{">", def_gt},
#line 19 "KEYWORDS.txt"
{"<>", def_neq},
#line 69 "KEYWORDS.txt"
#line 15 "KEYWORDS.txt"
{"=", def_eq},
#line 59 "KEYWORDS.txt"
{"!-", def_EXCLAMATION_MARK_HYPHEN_MINUS},
#line 77 "KEYWORDS.txt"
{"codireco", def_codireco},
#line 136 "KEYWORDS.txt"
#line 148 "KEYWORDS.txt"
{"unit", def_unit},
{""},
#line 37 "KEYWORDS.txt"
{"concat", concat},
#line 89 "KEYWORDS.txt"
#line 97 "KEYWORDS.txt"
{"ii", def_ii},
{""},
#line 36 "KEYWORDS.txt"
{"cons", cons},
#line 65 "KEYWORDS.txt"
#line 73 "KEYWORDS.txt"
{"ccons", def_ccons},
#line 15 "KEYWORDS.txt"
{"=", def_eq},
#line 20 "KEYWORDS.txt"
{"<=", def_le},
#line 27 "KEYWORDS.txt"
{"add", add},
#line 70 "KEYWORDS.txt"
#line 152 "KEYWORDS.txt"
{"x", def_x},
#line 107 "KEYWORDS.txt"
{"pm", def_pm},
#line 23 "KEYWORDS.txt"
{"mod", tdiv_r},
#line 78 "KEYWORDS.txt"
{"dinfrirst", def_dinfrirst},
{""}, {""},
#line 18 "KEYWORDS.txt"
{"!=", def_neq},
#line 35 "KEYWORDS.txt"
{"cmp", cmp_joyfunc},
#line 67 "KEYWORDS.txt"
#line 144 "KEYWORDS.txt"
{"third", def_third},
{""}, {""}, {""},
#line 75 "KEYWORDS.txt"
{"clop", def_clop},
#line 95 "KEYWORDS.txt"
#line 103 "KEYWORDS.txt"
{"nulco", def_nulco},
#line 30 "KEYWORDS.txt"
{"/", tdiv_q},
#line 72 "KEYWORDS.txt"
#line 16 "KEYWORDS.txt"
{">", def_gt},
#line 80 "KEYWORDS.txt"
{"disenstacken", def_disenstacken},
{""},
#line 133 "KEYWORDS.txt"
{"tuck", def_tuck},
#line 132 "KEYWORDS.txt"
{"third", def_third},
{""},
#line 138 "KEYWORDS.txt"
#line 67 "KEYWORDS.txt"
{"appN", def_appN},
#line 128 "KEYWORDS.txt"
{"shunt", def_shunt},
#line 90 "KEYWORDS.txt"
{"fourth", def_fourth},
#line 150 "KEYWORDS.txt"
{"unswons", def_unswons},
#line 94 "KEYWORDS.txt"
#line 102 "KEYWORDS.txt"
{"not", def_not},
#line 79 "KEYWORDS.txt"
#line 87 "KEYWORDS.txt"
{"enstacken", def_enstacken},
{""},
#line 114 "KEYWORDS.txt"
#line 126 "KEYWORDS.txt"
{"second", def_second},
#line 21 "KEYWORDS.txt"
{">=", def_ge},
#line 113 "KEYWORDS.txt"
#line 125 "KEYWORDS.txt"
{"run", def_run},
#line 42 "KEYWORDS.txt"
{"loop", loop},
#line 116 "KEYWORDS.txt"
{"shunt", def_shunt},
#line 82 "KEYWORDS.txt"
{"fourth", def_fourth},
{""}, {""},
#line 59 "KEYWORDS.txt"
{"appN", def_appN},
{""},
#line 118 "KEYWORDS.txt"
{"spiral_next", def_spiral_next},
#line 129 "KEYWORDS.txt"
{"tailrec", def_tailrec},
#line 23 "KEYWORDS.txt"
{"mod", tdiv_r},
#line 117 "KEYWORDS.txt"
{"size", def_size},
{""},
#line 91 "KEYWORDS.txt"
{"infrst", def_infrst},
#line 60 "KEYWORDS.txt"
{"at", def_at},
#line 83 "KEYWORDS.txt"
{"gcd", def_gcd},
#line 58 "KEYWORDS.txt"
{"app3", def_app3},
#line 115 "KEYWORDS.txt"
#line 160 "KEYWORDS.txt"
{"_timest", def__timest},
#line 27 "KEYWORDS.txt"
{"add", add},
#line 145 "KEYWORDS.txt"
{"tuck", def_tuck},
#line 127 "KEYWORDS.txt"
{"shift", def_shift},
#line 28 "KEYWORDS.txt"
{"-", sub},
#line 50 "KEYWORDS.txt"
{"lt", def_lt},
#line 124 "KEYWORDS.txt"
{"stuncons", def_stuncons},
#line 74 "KEYWORDS.txt"
{"drop", def_drop},
#line 90 "KEYWORDS.txt"
{"infra", def_infra},
{""},
#line 97 "KEYWORDS.txt"
{"of", def_of},
{""},
#line 57 "KEYWORDS.txt"
#line 130 "KEYWORDS.txt"
{"spiral_next", def_spiral_next},
#line 18 "KEYWORDS.txt"
{"!=", def_neq},
#line 137 "KEYWORDS.txt"
{"sum", def_sum},
#line 65 "KEYWORDS.txt"
{"app2", def_app2},
{""},
#line 122 "KEYWORDS.txt"
{"stackd", def_stackd},
#line 99 "KEYWORDS.txt"
{"infrst", def_infrst},
#line 159 "KEYWORDS.txt"
{"_times1", def__times1},
#line 161 "KEYWORDS.txt"
{"map", def_map},
#line 153 "KEYWORDS.txt"
{"step", def_step},
{""},
#line 156 "KEYWORDS.txt"
{"_stept", def__stept},
#line 50 "KEYWORDS.txt"
{"lt", def_lt},
#line 136 "KEYWORDS.txt"
{"stuncons", def_stuncons},
#line 82 "KEYWORDS.txt"
{"drop", def_drop},
{""}, {""},
#line 105 "KEYWORDS.txt"
{"of", def_of},
{""},
#line 64 "KEYWORDS.txt"
{"app1", def_app1},
#line 157 "KEYWORDS.txt"
{"times", def_times},
#line 155 "KEYWORDS.txt"
{"_step1", def__step1},
#line 52 "KEYWORDS.txt"
{"le", def_le},
#line 119 "KEYWORDS.txt"
#line 131 "KEYWORDS.txt"
{"split_at", def_split_at},
#line 56 "KEYWORDS.txt"
{"app1", def_app1},
#line 120 "KEYWORDS.txt"
#line 129 "KEYWORDS.txt"
{"size", def_size},
#line 132 "KEYWORDS.txt"
{"split_list", def_split_list},
#line 66 "KEYWORDS.txt"
#line 74 "KEYWORDS.txt"
{"cleave", def_cleave},
#line 61 "KEYWORDS.txt"
{"average", def_average},
{""},
#line 123 "KEYWORDS.txt"
{"step_zero", def_step_zero},
{""},
#line 84 "KEYWORDS.txt"
{"genrec", def_genrec},
#line 99 "KEYWORDS.txt"
{"pm", def_pm},
#line 137 "KEYWORDS.txt"
{"unquoted", def_unquoted},
#line 88 "KEYWORDS.txt"
{"ifte", def_ifte},
{""}, {""},
#line 106 "KEYWORDS.txt"
{"product", def_product},
{""},
#line 110 "KEYWORDS.txt"
{"reco", def_reco},
{""},
#line 62 "KEYWORDS.txt"
{"b", def_b},
#line 80 "KEYWORDS.txt"
{"flatten", def_flatten},
{""}, {""}, {""},
#line 107 "KEYWORDS.txt"
{"quoted", def_quoted},
#line 49 "KEYWORDS.txt"
{"gt", def_gt},
{""},
#line 130 "KEYWORDS.txt"
{"take", def_take},
#line 45 "KEYWORDS.txt"
{"stack", stack},
#line 26 "KEYWORDS.txt"
{"+", add},
#line 73 "KEYWORDS.txt"
{"down_to_zero", def_down_to_zero},
#line 109 "KEYWORDS.txt"
{"range_to_zero", def_range_to_zero},
#line 32 "KEYWORDS.txt"
{"bool", truthy},
{""},
#line 55 "KEYWORDS.txt"
{"anamorphism", def_anamorphism},
#line 53 "KEYWORDS.txt"
{"ge", def_ge},
#line 141 "KEYWORDS.txt"
{"tailrec", def_tailrec},
#line 25 "KEYWORDS.txt"
{"mul", mul},
#line 135 "KEYWORDS.txt"
{"step_zero", def_step_zero},
#line 95 "KEYWORDS.txt"
{"hypot", def_hypot},
#line 70 "KEYWORDS.txt"
{"b", def_b},
#line 68 "KEYWORDS.txt"
{"at", def_at},
#line 106 "KEYWORDS.txt"
{"pam", def_pam},
#line 96 "KEYWORDS.txt"
{"ifte", def_ifte},
#line 166 "KEYWORDS.txt"
{"_map2", def__map2},
{""},
#line 108 "KEYWORDS.txt"
{"range", def_range},
#line 24 "KEYWORDS.txt"
{"*", mul},
#line 111 "KEYWORDS.txt"
{"reverse", def_reverse},
#line 125 "KEYWORDS.txt"
{"sum", def_sum},
#line 114 "KEYWORDS.txt"
{"product", def_product},
#line 91 "KEYWORDS.txt"
{"gcd", def_gcd},
#line 118 "KEYWORDS.txt"
{"reco", def_reco},
#line 98 "KEYWORDS.txt"
{"infra", def_infra},
#line 30 "KEYWORDS.txt"
{"/", tdiv_q},
#line 104 "KEYWORDS.txt"
{"nullary", def_nullary},
#line 149 "KEYWORDS.txt"
{"unquoted", def_unquoted},
#line 66 "KEYWORDS.txt"
{"app3", def_app3},
#line 163 "KEYWORDS.txt"
{"_mape", def__mape},
#line 134 "KEYWORDS.txt"
{"stackd", def_stackd},
{""}, {""},
#line 32 "KEYWORDS.txt"
{"bool", truthy},
#line 165 "KEYWORDS.txt"
{"_map1", def__map1},
#line 122 "KEYWORDS.txt"
{"rollup", def_rollup},
#line 20 "KEYWORDS.txt"
{"<=", def_le},
#line 123 "KEYWORDS.txt"
{"rolldown", def_rolldown},
{""}, {""},
#line 115 "KEYWORDS.txt"
{"quoted", def_quoted},
#line 58 "KEYWORDS.txt"
{"||", def_VERTICAL_LINE_VERTICAL_LINE},
#line 60 "KEYWORDS.txt"
{"<{}", def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET},
{""},
#line 146 "KEYWORDS.txt"
{"unary", def_unary},
#line 92 "KEYWORDS.txt"
{"genrec", def_genrec},
#line 81 "KEYWORDS.txt"
{"down_to_zero", def_down_to_zero},
#line 29 "KEYWORDS.txt"
{"sub", sub},
{""},
#line 34 "KEYWORDS.txt"
{"clear", clear},
{""},
#line 88 "KEYWORDS.txt"
{"flatten", def_flatten},
{""}, {""},
#line 98 "KEYWORDS.txt"
{"pam", def_pam},
{""},
#line 139 "KEYWORDS.txt"
#line 151 "KEYWORDS.txt"
{"while", def_while},
#line 22 "KEYWORDS.txt"
{"%", tdiv_r},
#line 71 "KEYWORDS.txt"
{"binary", def_binary},
#line 19 "KEYWORDS.txt"
{"<>", def_neq},
#line 31 "KEYWORDS.txt"
{"div", tdiv_q},
{""},
#line 29 "KEYWORDS.txt"
{"sub", sub},
#line 47 "KEYWORDS.txt"
{"swap", swap},
#line 40 "KEYWORDS.txt"
{"first", first},
{""}, {""},
#line 54 "KEYWORDS.txt"
{"abs", def_abs},
#line 63 "KEYWORDS.txt"
{"anamorphism", def_anamorphism},
#line 49 "KEYWORDS.txt"
{"gt", def_gt},
#line 117 "KEYWORDS.txt"
{"range_to_zero", def_range_to_zero},
#line 44 "KEYWORDS.txt"
{"rest", rest},
#line 126 "KEYWORDS.txt"
{"swapd", def_swapd},
{""},
#line 128 "KEYWORDS.txt"
{"swoncat", def_swoncat},
{""},
#line 81 "KEYWORDS.txt"
{"fork", def_fork},
#line 127 "KEYWORDS.txt"
{"swons", def_swons},
{""},
#line 134 "KEYWORDS.txt"
{"unary", def_unary},
{""}, {""}, {""}, {""},
#line 87 "KEYWORDS.txt"
{"hypot", def_hypot},
{""},
#line 96 "KEYWORDS.txt"
{"nullary", def_nullary},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 93 "KEYWORDS.txt"
{"neg", def_neg},
#line 120 "KEYWORDS.txt"
{"roll>", def_roll_GREATER_THAN_SIGN},
#line 24 "KEYWORDS.txt"
{"*", mul},
#line 158 "KEYWORDS.txt"
{"_times0", def__times0},
{""}, {""},
#line 116 "KEYWORDS.txt"
{"range", def_range},
{""},
#line 53 "KEYWORDS.txt"
{"ge", def_ge},
{""},
#line 142 "KEYWORDS.txt"
{"take", def_take},
#line 45 "KEYWORDS.txt"
{"stack", stack},
#line 55 "KEYWORDS.txt"
{"?", def_QUESTION_MARK},
#line 140 "KEYWORDS.txt"
{"swoncat", def_swoncat},
{""}, {""},
#line 139 "KEYWORDS.txt"
{"swons", def_swons},
#line 154 "KEYWORDS.txt"
{"_step0", def__step0},
{""},
#line 62 "KEYWORDS.txt"
{"abs", def_abs},
#line 89 "KEYWORDS.txt"
{"fork", def_fork},
#line 162 "KEYWORDS.txt"
{"_map?", def__map_QUESTION_MARK},
#line 17 "KEYWORDS.txt"
{"<", def_lt},
#line 56 "KEYWORDS.txt"
{"&&", def_AMPERSAND_AMPERSAND},
{""}, {""}, {""}, {""}, {""}, {""},
#line 47 "KEYWORDS.txt"
{"swap", swap},
{""},
#line 22 "KEYWORDS.txt"
{"%", tdiv_r},
#line 69 "KEYWORDS.txt"
{"average", def_average},
{""}, {""},
#line 138 "KEYWORDS.txt"
{"swapd", def_swapd},
#line 33 "KEYWORDS.txt"
{"branch", branch},
{""}, {""}, {""}, {""},
{""}, {""}, {""},
#line 124 "KEYWORDS.txt"
{"rrest", def_rrest},
{""},
#line 119 "KEYWORDS.txt"
{"reverse", def_reverse},
{""}, {""},
#line 164 "KEYWORDS.txt"
{"_map0", def__map0},
{""},
#line 143 "KEYWORDS.txt"
{"ternary", def_ternary},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
#line 100 "KEYWORDS.txt"
{"make_generator", def_make_generator},
#line 121 "KEYWORDS.txt"
{"roll<", def_roll_LESS_THAN_SIGN},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 61 "KEYWORDS.txt"
{"<<{}", def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
#line 93 "KEYWORDS.txt"
{"grabN", def_grabN},
#line 46 "KEYWORDS.txt"
{"swaack", swaack},
{""},
#line 101 "KEYWORDS.txt"
{"neg", def_neg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 112 "KEYWORDS.txt"
{"rrest", def_rrest},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 63 "KEYWORDS.txt"
{"binary", def_binary},
#line 92 "KEYWORDS.txt"
{"make_generator", def_make_generator},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""},
#line 85 "KEYWORDS.txt"
{"grabN", def_grabN},
{""}, {""}, {""}, {""}, {""}, {""},
#line 48 "KEYWORDS.txt"
{"eq", def_eq},
#line 51 "KEYWORDS.txt"
{"neq", def_neq},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
#line 133 "KEYWORDS.txt"
{"sqr", def_sqr},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
#line 86 "KEYWORDS.txt"
{"grba", def_grba},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
#line 131 "KEYWORDS.txt"
{"ternary", def_ternary},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
#line 121 "KEYWORDS.txt"
{"sqr", def_sqr}
#line 94 "KEYWORDS.txt"
{"grba", def_grba}
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)

View File

@ -82,7 +82,7 @@ size [pop ++] step_zero
spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte
split_at [drop] [take] clop
split_list [take reverse] [drop] clop
sqr dup *
sqr dup mul
stackd [stack] dip
step_zero 0 roll> step
stuncons stack uncons
@ -90,7 +90,6 @@ sum [+] step_zero
swapd [swap] dip
swons swap cons
swoncat swap concat
sqr dup mul
tailrec [i] genrec
take <<{} [shift] times pop
ternary binary popd