Thun/implementations/C/convert_defs.py

78 lines
1.6 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
clear [] swaack pop
cleave fork popdd
clop cleave popdd
cmp [[>] swap] dipd [ifte] ccons [=] swons ifte
codi cons dip
codireco codi reco
dinfrirst dip infrst
dipd [dip] codi
disenstacken ? [uncons ?] loop pop'''.splitlines()
for line in defs:
name, body = line.split(None, 1)
print(f'{name}, def_{name}')
print()
print()
print('void')
print('init_defs(void)')
print('{')
for line in defs:
name, body = line.split(None, 1)
print(f'\tdef_{name}_body = text_to_expression("{body}");')
print('}')
print()
print()
for line in defs:
name, body = line.split(None, 1)
print(f'JoyList def_{name}_body;')
print()
print()
for line in defs:
name, body = line.split(None, 1)
print(f'void def_{name}(JoyListPtr stack, JoyListPtr expression);')
print()
print()
for line in defs:
name, body = line.split(None, 1)
print(f'void def_{name}(__attribute__((unused)) JoyListPtr stack, JoyListPtr expression) {{ push_quote(def_{name}_body, expression); }}')