Thun/implementations/C/convert_defs.py

105 lines
2.2 KiB
Python

'''
It's cheap, but it works.
Doesn't handle non-alnum names.
Because the strings are parsed at start time, rather than compile time,
it's basically the same as implementing an inscribe command
and using it to write a simple Joy script to load the defs:
for line in defs:
print(f'[{line}] inscribe')
Eh?
'''
import sys
#list(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'''\
/*
Auto-generated file by {' '.join(sys.argv)}
Do not edit.
*/
''')
if sys.argv[-1] == '--header':
for line in defs:
name, body = line.split(None, 1)
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}')
else:
print('''\
#include "joy.h"
#include "definitions.h"
/*
Declare a bunch of list pointers to eventually hold the body expressions
of the definitions.
*/
''')
for line in defs:
name, body = line.split(None, 1)
print(f'JoyList def_{name}_body;')
print('''
/*
Next, we want an initializer function to fill out the body pointers.
*/
void
init_defs(void)
{
''')
for line in defs:
name, body = line.split(None, 1)
print(f'\tdef_{name}_body = text_to_expression("{body}");')
print('}')
print('''
/*
Last, a set of functions to go in the wordlist, one for each definition.
*/
''')
for line in defs:
name, body = line.split(None, 1)
print(f'void def_{name}(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) {{ push_quote_onto_expression(def_{name}_body, expression); }}')