Csub
Csub is a C-like language. It looks like C, yet it is way simpler that you have to define most operators by yourself. It is designed by User:A.
Syntax
Define a variable:
int a=10;
Define an if statement:
if(condition){...}
Else statement:
if{...}
condition:an expression containing numbers, variables, +, -, <, and >.
Define a while loop
while(condition){...}
Input(equivalent to the C++ std::cin>>)
read(...);
Output(equivalent to the C++ std::cout<<)
write(...);
Define a function
int function(...){...}
Specification
There are only 5 keywords: int, if, else, return and while.
There are only 5 operators: +, -, <, >, and =.
There are only 2 built-ins:write() and read().
Implementation
Official compiler to C++(dead link)
Turing-completeness
This is Turing-complete, because 3-celled brainfuck can compile to it.
Here, "a" is any variable.
+: a++;
-: a--;
> and <: these don't directly produce code; instead, they switch the currently operating variable.
[: while a{
]: }
Example programs
Hello, world!Program
int main()
{
write("Hello, world!\n");
}
Cat program
int main()
{
int a[999]="";
while(1)
{
read(a);
write(a);
}
}
Fibonacci sequence
int main()
{
int a=0,b=1;
write(a);write(" ");write(b);write(" ");
while(1){
a=a+b;
write(a);write(" ");
b=a+b;
write(b);write(" ");
}
}
99 bottles of beer
int main()
{
int b=99;
while(ge(b,0)) {
if(eq(b,0)) {
write("No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n");
}else{
if(eq(b,1)){
write("1 bottle of beer on the wall, 1 bottle of beer.\nTake one down and pass it around, no more bottles of beer on the wall\n");
}else{
write(b);
write("bottles of beer on the wall, ");
write(b);
write(" bottles of beer.\n");
write("Take one down and pass it around, ");
write(b-1);
if(gt(b-1,1)){
write("bottles")
}else{
write("bottle");
}
write("of beer on the wall.\n");
}
}
b=b-1;
}
}
Endless Square Numbers Program
int main()
{
int a=0;
while(a~<0){
b=a*a
write(b);write("\n");
a=a+1
}
}
Digital root calculator
int main()
{
int a;
read(a);
while(a>9){
a=a-9;
}
write(a);
}
Implementing other operators
Csub only has 5 operators(+,-,<,>,and =).
This turns out to be not quite useful for actual programming. These are functions defined to represent various operators.
NOT function
int not(int a){
if(a){
return 0;
}else{
return 1;
}
}
AND function
int and(int a,int b){
if(a){
if(b){
return 1;
}
}
return 0;
}
OR function
int or(int a,int b){
if(a){
return 1;
}
if(b){
return 1;
}
return 0;
}
LE(less than or equal) function
int le(int a,int b){
if(a<b+1){
return 1;
}if{
return 0;
}
}
GE(greater than or equal) function
int ge(int a,int b){
if(a>b-1){
return 1;
}if{
return 0;
}
}
NE(not equal) function
int ne(int a,int b){
if(or(a<b,a>b)){
return 1;
}
return 0;
}
EQ(equal) function
int eq(int a,int b){
if(and(ge(a,b),le(a,b))){
return 1;
}
return 0;
}
MOD(remainder of division) function
int mod(int a,int b){
return a-mul(b,div(a,b));
}
MUL(multiplication) function
int mul(int a,int b){
int cnt=a;
int res=0;
while(cnt>0){
res=res+b;
cnt=cnt-1;
}
return res;
}
DIV(division) function
int div(int a,int b){
int cnt=a;
int res=0;
while(cnt>b){
res=res+1;
cnt=cnt-b;
}
return cnt;
}
POW(to the power of) function
int pow(int a,int b){
int cnt=b;
int res=1;
while(cnt>0){
res=mul(res,a);
cnt=cnt-1;
}
return res;
}
LSH(left shift) function
int lsh(int a,int b){
return mul(a,pow(2,b));
}
RSH(right shift) function
int rsh(int a,int b){
return div(a,pow(2,b));
}
Implementing breaks and continues
break:You have to put your code inside a function. Return 0 does the job.
This code breaks if i is equal to 5.
def whileLoop(){
var i=9;
while(i>0)
{
write(i);
i=i-1;
if(eq(i,5))
{
return 0;
}
}
return 0;
}
continue
continue:Also, you have to put your code inside a function. Calling the function does the job.
This code skips the printing i when i is equal to 4.
def continueDemo()
{
var i=10;
while(i>0)
{
i=i-1;
if(eq(i,4))
{
continueDemo();
}
write(i);
}
}