UnnumericPy
UnnumericPy is an esoteric programming language created by User:Marina and inspired by UnnumericJS. It is an equivalent to Python, but if the code has any digits it will raise a syntax error.
Examples
Hello world
print("Hello World")
Cat program
i = input(">>>")
print(i)
Truth machine
a=input(">>> ")
if a==str(int(False)):
print(int(False))
elif a==str(int(True)):
while True:
print(int(True))
else:
raise Exception
Here, int(False) and int(True) are used for 0s and 1s.
A shorter one that doesn't use number literals (int(False) and int(True)):
a=input(">>> ")
if int(a):
while ' ':
print(a)
else:
print(a)
Syntax error
0
Interpreter
Python
def unnumericpy(code):
for i in range(10):
if str(i) in code:
raise SyntaxError("syntax error")
exec(code)
Expressiveness
All of Python can be expressed in UnnumericPy.
Literals
We replace integer, floating-point, and complex literals first. The integers can be generated from arithmetic on -1, 0, and 1. The literals True and False can be used as 0 and 1. -1 is constructed as ~0. They can also be constructed from the integer constructor:
int() # 0 ~int() # -1 -(~int()) # 1
The floating-point numbers are generated as ratios of integers using the true-division operator. The special cases do not require digits:
float("nan")
float("inf") # and float("-inf") or -float("inf")
Complex numbers are built using their constructor instead of literals.
Names
Next, we recover the ability to access names containing digits. To access a local or global, use the string constructor and string concatenation to build the name as a string, then use it as a key on the corresponding scope dictionary. For example, to access the local name "x2":
locals()["x" + str(-(~int() + ~int()))]
This generalizes to imports as well, since package names are passed as strings. For example, to import the standard-library module "sqlite3":
from importlib import import_module
three = -(~int() + ~int() + ~int())
sql = import_module("sqlite" + str(three))
Turing completeness
Because all of Python is still expressible, UnnumericPy is trivially Turing-complete.