Meow (None1)
Jump to navigation
Jump to search
Meow is the one and only pre-2023 esolang invented by User:None1 and developed in 7 months. The author's aim was not to write an esolang but a normal language, but it has been more and more esoteric that it became an esolang.
Commands
Meow is an assembly-like esolang that allows comments, functions variables, libraries and do-while loops. Invalid commands are ignored
It also has a REPL.
ToDo: Add stuff here.
Examples
Hello World
prtstr Hello, World!
Power
read arg1 read arg2 library math run fpow out ret
Interpreter
The original interpreter, in C++, is as follows:
#include<cstdio>
#include<map>
#include<string>
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<stack>
#include<vector>
#include<ctime>
#include<csignal>
#include<queue>
using namespace std;
stack<int> cond;
map<string,long double> mp;
int argvn,numof1;
char cd[1000000],cc[1000000],z[1000000],x[1000000],y[1000000];
string dc,curf,mg;
map<string,vector<string> > mp2;
bool isf=0;
ifstream jjn;
typedef struct ufrg{
int curcode;
string name;
}cstp;
stack<cstp> cs;
queue<long double> args;
long double retpp;
void inp2();
void inp3();
long double md(long double a,long double b){
bool bb=0;
if(a<0) bb=1;
if(a<0) a=-a;
if(b<0) b=-b;
long double tmp=b,res=0;
while(b<=a) b*=2;
if(b-tmp>=-1e-15&&b-tmp<=1e-15) res=a;
else{
while(b>=tmp){
if(b<=a){
a-=b;
}b/=2;
}
}
if(bb) a=tmp-a;
return a;
}
long double calc(long double a,long double b,string op){
if(op=="add") return a+b;
else if(op=="sub") return a-b;
else if(op=="mul") return a*b;
else if(op=="div") return a/b;
else if(op=="mod") return md(a,b);
else return 0;
}
char est(long double d){
long double e=d-int(d);
if(e<-(1e-10)) e=-e;
if(e>=0.5) return char(d-e+1);
else return char(d-e);
}
void ig(int num){
signal(SIGINT,ig);
}
void inp(){
sprintf(cd,"%s",dc.c_str());
sscanf(cd,"%s",cc);
string f(cc);
if(f=="end"&&!cond.empty()){
if(cond.top()) numof1--;
cond.pop();
}
else if(f=="add"||f=="sub"||f=="mul"||f=="div"||f=="mod"){
sscanf(cd,"%*s%s%s%s",x,y,z);
long double a,b;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&b);
else b=mp[string(y)];
long double res=calc(a,b,f);
mp[string(z)]=res;
}
else if(f=="del"){
sscanf(cd,"%*s%s",x);
if(mp.find(string(x))!=mp.end()) mp.erase(mp.find(string(x)));
}
else if(f=="out"){
sscanf(cd,"%*s%s",x);
long double a;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
printf("%.15Lg",a);
}
else if(f=="outc"){
sscanf(cd,"%*s%s",x);
long double a;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
printf("%c",est(a));
}
else if(f=="read"){
sscanf(cd,"%*s%s",x);
long double d;
scanf("%Lf%*c",&d);
mp[string(x)]=d;
}
else if(f=="readc"){
sscanf(cd,"%*s%s",x);
char d;
scanf("%c%*c",&d);
mp[string(x)]=d;
}
else if(f=="scanc"){
sscanf(cd,"%*s%s",x);
char d;
scanf("%c",&d);
mp[string(x)]=d;
}
else if(f=="equal"){
sscanf(cd,"%*s%s%s",x,y);
long double a,b;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&b);
else b=mp[string(y)];
if(a-b<=1e-15&&a-b>=-(1e-15)){
cond.push(1);numof1++;
}else{
cond.push(0);
}
}
else if(f=="big"){
sscanf(cd,"%*s%s%s",x,y);
long double a,b;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&b);
else b=mp[string(y)];
if(a-b>1e-15){
cond.push(1);numof1++;
}else{
cond.push(0);
}
}
else if(f=="small"){
sscanf(cd,"%*s%s%s",x,y);
long double a,b;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&b);
else b=mp[string(y)];
if(a-b<-(1e-15)){
cond.push(1);numof1++;
}else{
cond.push(0);
}
}else if(f=="meow") ;
else if(f=="exit") exit(0);
else if(f=="library"){
sscanf(cd,"%*s%s",x);
sprintf(x,"%s.meow",x);
ifstream fg(x);
if(!fg){
sprintf(y,"C:\\meow\\%s",x);
ifstream uv(y);
if(!uv) return;
while(!uv.eof()){
if(!cs.empty()){
cstp CSTP=cs.top();
if(CSTP.curcode==mp2[CSTP.name].size()) cs.pop();
else{
dc=mp2[CSTP.name][CSTP.curcode];
CSTP.curcode++;
cs.pop();
cs.push(CSTP);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
continue;
}
getline(uv,dc);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
uv.close();
}
else{
while(!fg.eof()){
if(!cs.empty()){
cstp CSTP=cs.top();
if(CSTP.curcode==mp2[CSTP.name].size()) cs.pop();
else{
dc=mp2[CSTP.name][CSTP.curcode];
CSTP.curcode++;
cs.pop();
cs.push(CSTP);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
continue;
}
getline(fg,dc);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
}
fg.close();
}
else if(f=="func"){
sscanf(cd,"%*s%s",x);
curf=string(x);
mp2[string(x)]=vector<string>();
isf=1;
}else if(f=="run"){
sscanf(cd,"%*s%s",x);
if(string(x)=="clock"){
retpp=clock();
}
else{
cstp CSTP;
CSTP.curcode=0;
CSTP.name=string(x);
cs.push(CSTP);
}
}else if(f=="refa"){
sscanf(cd,"%*s%s%s%s",x,y,z);
long double yfu;
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&yfu);
else yfu=mp[string(y)];
sprintf(x,"%s %.0Lg",x,yfu);
mp[string(z)]=mp[string(x)];
}else if(f=="edita"){
sscanf(cd,"%*s%s%s%s",x,y,z);
long double yfu;
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&yfu);
else yfu=mp[string(y)];
sprintf(x,"%s %.0Lg",x,yfu);
long double rrr;
if((z[0]>='0'&&z[0]<='9')||z[0]=='-'||z[0]=='.'||z[0]=='+') sscanf(z,"%Lf",&rrr);
else rrr=mp[string(z)];
mp[string(x)]=rrr;
}else if(f=="dela"){
sscanf(cd,"%*s%s%s",x,y);
long double yfu;
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&yfu);
else yfu=mp[string(y)];
sprintf(x,"%s %.0Lg",x,yfu);
if(mp.find(string(x))!=mp.end()) mp.erase(mp.find(string(x)));
}else if(f=="nocc"){
signal(SIGINT,ig);
}else if(f=="addarg"){
sscanf(cd,"%*s%s",x);
long double a;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
args.push(a);
}
else if(f=="poparg"){
if(!args.empty()){
sscanf(cd,"%*s%s",x);
mp[string(x)]=args.front();
args.pop();
}
}else if(f=="addret"){
sscanf(cd,"%*s%s",x);
long double a;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
retpp=a;
}else if(f=="popret"){
sscanf(cd,"%*s%s",x);
mp[string(x)]=retpp;
}else if(f=="ctrl"){
sscanf(cd,"%*s%s",x);
printf("\e[%s",x);
}else if(f=="clr"){
system("cls");
}else if(f=="prtstr"){
printf("%s",cd+7);
}else if(f=="do"){
mp2[mg+="_"]=vector<string>();
string j;
do{
if(argvn>1){
getline(jjn,j);
}else{
putchar('>');
getline(cin,j);
}
mp2[mg].push_back(j);
}while(j.substr(0,5)!="while");
mp2[mg].push_back(string(j.c_str()+5));
mp2[mg].push_back("run "+mg);
mp2[mg].push_back("end");
cstp CSTP;
CSTP.curcode=0;
CSTP.name=mg;
cs.push(CSTP);
}
}
void inp2(){
sprintf(cd,"%s",dc.c_str());
sscanf(cd,"%s",cc);
string f(cc);
if(f=="end"&&!cond.empty()){
if(cond.top()) numof1--;
cond.pop();
}
else if(f=="big"){
sscanf(cd,"%*s%s%s",x,y);
long double a,b;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&b);
else b=mp[string(y)];
if(a-b>1e-10){
cond.push(1);
numof1++;
}else{
cond.push(0);
}
}
else if(f=="small"){
sscanf(cd,"%*s%s%s",x,y);
long double a,b;
if((x[0]>='0'&&x[0]<='9')||x[0]=='-'||x[0]=='.'||x[0]=='+') sscanf(x,"%Lf",&a);
else a=mp[string(x)];
if((y[0]>='0'&&y[0]<='9')||y[0]=='-'||y[0]=='.'||y[0]=='+') sscanf(y,"%Lf",&b);
else b=mp[string(y)];
if(a-b<-(1e-10)){
cond.push(1);
numof1++;
}else{
cond.push(0);
}
}else if(f=="meow") ;
else if(f=="exit") exit(0);
}
void inp3(){
sprintf(cd,"%s",dc.c_str());
sscanf(cd,"%s",cc);
string f(cc);
if(f=="endf"){
mp2[curf].pop_back();
isf=0;
}
}
int main(int argc,char *argv[]){
mp["SYST"]=time(0)%86400;
mp["SYSD"]=time(0)/86400;
cond.push(1);
argvn=argc;
if(argc<=1){
while(1){
if(!cs.empty()){
cstp CSTP=cs.top();
if(CSTP.curcode==mp2[CSTP.name].size()) cs.pop();
else{
dc=mp2[CSTP.name][CSTP.curcode];
CSTP.curcode++;
cs.pop();
cs.push(CSTP);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
continue;
}
printf(">");
getline(cin,dc);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
}else{
ifstream fi(argv[1]);
if(!fi){
printf("Error:file not found");
return 0;
}
while(!fi.eof()){
if(!cs.empty()){
cstp CSTP=cs.top();
if(CSTP.curcode==mp2[CSTP.name].size()) cs.pop();
else{
dc=mp2[CSTP.name][CSTP.curcode];
CSTP.curcode++;
cs.pop();
cs.push(CSTP);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
continue;
}
getline(fi,dc);
if(isf){
vector<string> sv=mp2[curf];
sv.push_back(dc);
mp2[curf]=sv;
inp3();
}else{
if(numof1==cond.size()-1) inp();
else inp2();
}
}
}
return 0;
}