Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.22 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<setjmp.h>
  5. #include<ctype.h>
  6. #include<gc.h>
  7. #include<unicode/ustdio.h>
  8. #include<unicode/ustring.h>
  9. #define free
  10.  
  11. typedef UChar UC;
  12. typedef UC*US;
  13. typedef char C;
  14. typedef C*S;
  15. #define CUS const US
  16. typedef S*SS;
  17. typedef int I;
  18. typedef long long L;
  19. typedef double D;
  20. typedef size_t Z;
  21. typedef void U;
  22. typedef U*P;
  23. typedef P*PS;
  24. typedef enum{N,Y}B;
  25. #define R return
  26. #define BK break
  27. #define SW(e) switch(e) {
  28. #define CS(e) case e:
  29. #define DO(v) for(I v=0;;){
  30. #define EL default:
  31. #define ES }else{
  32. #define EIF(e) }else if(e){
  33. #define WH(e) while(e){
  34. #define WY while(Y){
  35. #define NL() putchar('\n')
  36.  
  37. jmp_buf J;
  38. L ln, cl;
  39. B ir=N;
  40.  
  41. US erh;
  42. #define sh(s)erh=u8_strdup(s); //set help
  43. #define eh()erh=u8_strconv_from_locale(""); //erase help
  44. U e(S s){fprintf(stderr,"|%s\n",s);if(u8_strlen(erh)>0){fprintf(stderr,"|\t%s\n",erh);free(erh);eh();}if(ir)longjmp(J,1);else exit(1);} //report error
  45.  
  46. #define XE  e("syntax error")
  47. #define TE  e("type error")
  48. #define PE  e("parse error")
  49. #define SPE e("spelling error")
  50. #define DE  e("domain error")
  51. #define SE  e("stack error")
  52. #define YE  e("syntax error")
  53. #define ME  e("memory error")
  54. #define IE  e("arity error")
  55. #define BE  e("balance error")
  56.  
  57. P al(Z z){P r;if(!(r=GC_MALLOC(z)))ME;R r;} //alloc
  58. P als(Z z){R al(sizeof(C)*(z+1));} //alloc str
  59. P alu(Z z){R al(sizeof(UC)*(z+1));} //alloc ustr
  60. #define rl(p,z)if(!(p=GC_REALLOC(p,z)))ME; //realloc
  61.  
  62. #define FR(e) // nope
  63. #define MC(s,d,c) memcpy(s,d,c)
  64. #define SL(e) strlen(e)
  65. #define USL(e) u8_strlen(e)
  66. #define SZ(e) sizeof(e)
  67. #define NUL(e) memcpy(e,0,SZ(e))
  68. #define NLU(e,s) memcpy(e,0,s)
  69. #define NLS(e) e[0]=0
  70. #define MZ 2048
  71.  
  72. US rel(){Z z;S r=als(MZ);if(!fgets(r,MZ,stdin)){if(feof(stdin)){*r=0;R u8_strconv_from_locale(r);}else DE;}z=strlen(r);if(r[z-1]=='\n')r[z-1]=0;if(z>1&&r[z-2]=='\r')r[z-2]=0;R u8_strconv_from_locale(r);} //read line
  73.  
  74. typedef struct{PS s;Z t,z;}AE; // stack element
  75. typedef AE*A; // stack
  76. A ma(Z z){A s=al(sizeof(AE));s->s=al(z*sizeof(P));
  77.           s->t=0;s->z=z;R s;} //make stack
  78. U u(A s,P v){if(v==NULL)R;if(s->t+1>s->z)SE;s->s[s->t++]=v;} //put
  79. P t(A s){if(s->t==0)SE;R s->s[--s->t];} //take
  80. P sk(A s){if(s->t==0)SE;R s->s[s->t-1];} //seek
  81. Z l(A s){R s->t;} //len
  82. U fa(A s){FR(s->s);FR(s);} //free stack
  83.  
  84. A Ma=0; //main stack
  85. typedef enum{TD,TS,TL,TC,TP,TV}T; // type
  86. typedef struct VB VB;typedef VB* V;
  87. typedef V(*DYAD)(V,V);
  88. typedef V(*MONAD)(V);
  89. V mvv(UC o);
  90. struct VB{T t;union{D d;struct{UC o;I a;DYAD d;MONAD m;}v;struct{US s;Z z;}s;A l;struct{V x,y;}p;};};typedef VB*V; // value
  91.  
  92. US tos(V m,B q){
  93.   Z z;I i;US b,t;Z lx;US tx;
  94.   SW(m->t)
  95.   CS(TV)b=alu(2);b[0]=m->v.o;b[1]=0;BK;
  96.   CS(TD)b=alu(MZ);sprintf(b,"%.15g",m->d);if(b[0]=='-')b[0]='_';BK;
  97.   CS(TS)b=alu(m->s.z+(q?4:0));if(q)b[0]='\'';MC(b+1,m->s.s,m->s.z);if(q)b[u8_strlen(b)]='\'';b[u8_strlen(b)]=0;BK;
  98.   CS(TL)b=alu(1);b[0]='[';z=1;for(i=0;i<l(m->l);++i){Z l;if(i){rl(b,z+1);b[z++]=' ';}t=tos(m->l->s[i],Y);l=u8_strlen(t);rl(b,z+l);MC(b+z,t,l);z+=l;FR(t);}rl(b,z+2);b[z]=']';b[z+1]=0;BK;
  99.   CS(TC)b=alu(m->s.z+3);b[0]='{';MC(b+1,m->s.s,m->s.z);MC(b+1+m->s.z,"}",2);BK;
  100.   CS(TP)t=tos(m->p.x,Y);tx=tos(m->p.x,Y);z=u8_strlen(t);lx=u8_strlen(tx);b=al(z+lx+5);sprintf(b,"(%s: %s)",t,tx);FR(t);FR(tx);BK;
  101.   EL DE;}
  102.   R b;
  103. } //value to str
  104. V mv(){R al(SZ(VB));} //make value
  105. V mvd(D d){V m=mv();m->t=TD;m->d=d;R m;} //make number value
  106. V mcv(US s,Z z){V m=mv();m->t=TC;m->s.s=u8_strdup(s);
  107.                 m->s.z=z;R m;} //make code value
  108. V mvcn(US s,Z z){V m=mv();m->t=TC;
  109.                  m->s.s=s;m->s.z=z;R m;} //make code (non-copy) value
  110. V mvs(US s){V m=mv();m->t=TS;m->s.s=u8_strdup(s);
  111.             m->s.z=u8_strlen(s);R m;} //make str value
  112. V msc(UC c){UC b[]={c,0};R mvs(b);} //make str value from char
  113. V mvl(A l){V m=mv();m->t=TL;m->l=l;R m;} //make list value
  114. V mvp(V x,V y){V m=mv();m->t=TP;
  115.               m->p.x=x;m->p.y=y;R m;} //make pair value
  116. Z ll(V s){R l(s->l);} //list len
  117. V lat(V s,Z i){R s->l->s[i];} //list at
  118. U frm(V m){
  119.   SW(m->t)
  120.   CS(TS)CS(TC)FR(m->s.s);BK;
  121.   CS(TL)while(l(m->l))frm(t(m->l));fa(m->l);BK;
  122.   CS(TD)CS(TV)BK;
  123.   CS(TP)frm(m->p.x);frm(m->p.y);BK;
  124.   }FR(m);
  125. } //free value
  126. V d(V);V da(V m){A s=ma(MZ);Z i=0;for(i=0;i<l(m->l);++i)u(s,d(m->l->s[i]));R mvl(s);} //dup array
  127. V d(V m){
  128.   Z z;S s;
  129.   SW(m->t)
  130.   CS(TV)R mvv(m->v.o);
  131.   CS(TC)R mcv(m->s.s,m->s.z);
  132.   CS(TS)R mvs(m->s.s);
  133.   CS(TD)R mvd(m->d);
  134.   CS(TL)R da(m);BK;
  135.   CS(TP)R mvp(d(m->p.x),d(m->p.y));
  136.   EL DE;}R 0;
  137. } //dup val
  138. B eq(V a,V b){
  139.   if(a->t!=b->t)R N;
  140.   SW(a->t)
  141.   CS(TV)R a->v.a==b->v.a&&a->v.o==b->v.o;
  142.   CS(TS)CS(TC)R a->s.z!=b->s.z?0:memcmp(a->s.s,b->s.s,a->s.z)==0;
  143.   CS(TD)R a->d==b->d;
  144.   CS(TP)R eq(a->p.x,b->p.x)&&eq(a->p.y,b->p.y);
  145.   EL TE;}R N;
  146. } //equal
  147. B tr(V m){
  148.   SW(m->t)
  149.   CS(TV)R Y;
  150.   CS(TS)CS(TC)R m->s.z!=0;
  151.   CS(TL)R l(m->l)!=0;
  152.   CS(TP)R tr(m->p.x)&&tr(m->p.y);
  153.   CS(TD)R m->d!=0;
  154.   }
  155. } //truthy
  156. US ucts(UC c){US b=alu(2);b[0]=c;b[1]=0;
  157.               R b;} //char to ustr
  158.  
  159. typedef struct _VR{UC s[256];V v;struct _VR *n;}ENV; //environment
  160. ENV*v[512]; //main environment
  161.  
  162. L h(US s){US q;L k;
  163.          for(k=0,q=s;*q;q++)k=(k<<3)^*q;
  164.          R k%512;} //hash
  165. V fe(US s){ENV*p;L k;k=h(s);
  166.   for(p=v[k];p;p=p->n)if(u8_strcmp(s,p->s)==0)R p->v;
  167.   R 0;} //find entry
  168. U be(US s,V x){ENV*p;L k;k=h(s);
  169.   for(p=v[k];p;p=p->n)if(!u8_strcmp(s,p->s)){p->v=x;R;}
  170.   p=al(sizeof(ENV));u8_strncpy(p->s,s,255);p->s[255]=0;
  171.   p->v=x;p->n=v[k];v[k]=p;} //bind entry
  172. D pd(S s){S err;D r=strtod(s,&err);
  173.   if(r==0&&!isspace(*err)&&s==err)PE;
  174.   R r;} //parse number
  175. I r(US s,B q);
  176. US tra(US s,B inl);
  177. #define ud(s,d)u(s,mvd(d)) //put number
  178. #define us(s,r)u(s,mvs(r))
  179. typedef enum{SN,SR,SD,SC,SL,SV}E; //state (none, string, number, code, list, var)
  180. #define IS(s) if(st == s) {
  181. #define NO(s) if(st != s) {
  182. #define NOT(s) (st != s)
  183. #define OR(s) || st == s
  184. #define SI(s) st = s
  185.  
  186. #define D(n)V D##n(V x,V y)
  187. #define M(n)V M##n(V x)
  188.  
  189. US Dtos(UC o,V x,V y){US b=alu(1024);u8_snprintf(b,1024,"%U%U%c",tos(x,Y),tos(y,Y),o);
  190.                R b;} //dyad to string
  191. US Mtos(UC o,V x){US b=alu(1024);u8_snprintf(b,1024,"%U%c",tos(x,Y),o);R b;} //monad to string
  192. #define TED(o)sh(Dtos(o,x,y));TE;
  193. #define TEM(o)sh(Mtos(o,x));TE;
  194. #define _tcD(o,ty,x,y)if(x->t!=ty||y->t!=ty){TED(o);}
  195. #define tcD(o,ty)_tcD(o,ty,x,y)
  196. #define tcDV(o,tyx,tyy)if(x->t!=tyx||y->t!=tyy){TED(o);}
  197. #define tcM(o,ty)if(x->t!=ty){TEM(o);}
  198. D(plus){tcD('+',TD);R mvd(x->d+y->d);}
  199. D(minus){tcD('-',TD);R mvd(x->d-y->d);}
  200. D(star){tcD('*',TD);R mvd(x->d*y->d);}
  201.  
  202. V apD(DYAD f,V x,V y);
  203. D(reduce){tcDV('/',TV,TL);if(x->v.a!=2){sh(Dtos('/',x,y));IE;}if(ll(y)<1){sh(Dtos('/',x,y));e("length error");}if(ll(y)==1)R lat(y,0);V b;Z i;b=t(y->l);
  204. for(i=0;i<ll(y);i++){b=apD(x->v.d,b,lat(y,i));}R b;}
  205.  
  206. M(apply){tcM('@',TC);L _ln,_cl;_ln=ln;_cl=cl;r(x->s.s,N);ln=_ln;cl=_cl;R NULL;}
  207. M(negate){tcM('_',TD);R mvd(-x->d);}
  208.  
  209. V mvv(UC o){V m=mv();m->t=TV;m->v.o=o;
  210.             SW(o)
  211.             CS('+')m->v.a=2;m->v.d=Dplus;BK;
  212.             CS('-')m->v.a=2;m->v.d=Dminus;BK;
  213.             CS('*')m->v.a=2;m->v.d=Dstar;BK;
  214.             CS('_')m->v.a=1;m->v.m=Mnegate;BK;
  215.             EL sh(ucts(o));PE;}R m;} //make ref
  216.  
  217. V apD(DYAD f,V x,V y){V s;I i;
  218. if(x->t==TL&&y->t==TL){if(ll(x)!=ll(y))e("rank error");s=mvl(ma(MZ));for(i=0;i<ll(x);i++){u(s->l,apD(f,lat(x,i),lat(y,i)));}R s;}
  219. if(x->t==TL){s=mvl(ma(MZ));for(i=0;i<ll(x);i++){u(s->l,apD(f,lat(x,i),y));}R s;}
  220. if(y->t==TL){s=mvl(ma(MZ));for(i=0;i<ll(y);i++){u(s->l,apD(f,x,lat(y,i)));}R s;}
  221. R f(x,y);} //apply dyad
  222. V apM(MONAD f,V x){V s;I i;
  223. if(x->t==TL){s=mvl(ma(MZ));for(i=0;i<ll(x);i++){u(s->l,apM(f,lat(x,i)));}R s;}
  224. R f(x);} //apply monad
  225. #define mAD(o)if(l(la)<2){if(l(la)==1){sh(Mtos(c,t(la)));}else{sh(ucts(c));}IE;}y=t(la);x=t(la);u(la,D##o(x,y)); //make atomic dyad
  226. #define mD(o)if(l(la)<2){if(l(la)==1){sh(Mtos(c,t(la)));}else{sh(ucts(c));}IE;}y=t(la);x=t(la);u(la,apD(D##o,x,y)); //make dyad
  227. #define mM(o)if(l(la)<1){sh(ucts(c));IE;}x=t(la);u(la,apM(M##o,x)); //make monad
  228. #define PRELOG if(!Ma){Ma=ma(MZ);u(Ma,ma(MZ*2));}
  229. #define PROLOG PRELOG;ln=1;cl=0;
  230. #define ul(s)u8_strconv_from_locale(s)
  231. I r(US s,B q) {
  232.   PROLOG;L _ln,_cl;
  233.   A la=sk(Ma);E st=SN;UC c;V x,y;US nb;Z nr,red;L bl,cbl;B ru=N;
  234.   DO(i)if(ru)BK;cl++;c=s[i++];
  235.     if((isdigit(c)||c=='.')&&NOT(SR)&&NOT(SL)&&NOT(SC)){NO(SD)SI(SD);red=256;nr=0;nb=alu(red);NLS(nb);}
  236.                            nr++;if(nr>=red){red*=2;rl(nb,red);}u8_strncat(nb,&c,1);}
  237.     if(isalpha(c)&&NOT(SR)&&NOT(SL)&&NOT(SC)&&NOT(SD)){NO(SV)SI(SV);nb=alu(256);nr=0;NLS(nb);}
  238.                             if(nr>=255)ME;u8_strncat(nb,&c,1);}    
  239.     IS(SV)if(!isalpha(c)){SI(SN);if(c==':'){x=t(la);be(nb,x);ES x=fe(nb);if(!x){sh(nb);e("name error");}u(la,d(x));}if(c!=':'){cl--;i--;}}}
  240.     else IS(SC)if(cbl<0||c==0)BE;if(nr>=red){red*=2;rl(nb,red);}if(c=='{')cbl++;if(c=='}')cbl--;if(cbl==0){SI(SN);u(la,mcv(nb,u8_strlen(nb)));ES nr++;u8_strncat(nb,&c,1);}}
  241.     else IS(SL)if(bl<0||c==0)BE;if(nr>=red){red*=2;rl(nb,red);}if(c=='[')bl++;if(c==']')bl--;if(bl==0){SI(SN);u(Ma,ma(MZ));_ln=ln;_cl=cl;r(nb,N);ln=_ln;cl=_cl;u(la,mvl(t(Ma)));ES nr++;u8_strncat(nb,&c,1);}}
  242.     else IS(SR)if(c==0)BE;if(c=='\''){SI(SN);nb[nr+1]=0;us(la,nb);}else{nr++;if(nr>=red){red*=2;rl(nb,red);}u8_strncat(nb,&c,1);}}
  243.     else IS(SD)if(!isdigit(c)&&c!='.'){SI(SN);nr=0;ud(la,pd(u8_strconv_to_locale(nb)));FR(nb);cl--;i--;}
  244.     ES SW(c)
  245.        CS('\'')red=128;nb=alu(red);nr=0;SI(SR);BK;
  246.        CS('+')mD(plus);BK;
  247.        CS('-')mD(minus);BK;
  248.        CS('*')mD(star);BK;
  249.        CS('/')mAD(reduce);BK;
  250.        CS(':')if(!ispunct(s[i])){sh(ul(":"));PE;}u(la,mvv(s[i]));cl++;i++;BK;
  251.        CS('@')mM(apply);BK;
  252.        CS('_')mM(negate);BK;
  253.        CS('[')red=256;nr=0;bl=1;nb=alu(red);SI(SL);BK;
  254.        CS('{')red=256;nr=0;cbl=1;nb=alu(red);SI(SC);BK;
  255.        CS(' ')CS('\t')CS('\r')BK;
  256.        CS('\n')ln++;BK;
  257.        CS(0)IS(SR OR(SC)OR(SL))BE;}IS(SV)e("syntax error");}ru=Y;BK;
  258.        EL sh(ucts(c));SPE;BK;}}
  259.   }if(ir&&q&&l(la))printf("%s\n",tos(sk(la),Y));R 0;} //run
  260.  
  261. U il() {US in;printf("sara\t\\\\ to exit\n\n");ir=Y;WH(Y)putchar('\t');if(!setjmp(J)){in=rel();if(u8_strcmp(in,ul("\\\\"))==0)exit(0);r(in,Y);}if(Ma){A la=sk(Ma);while(l(la))frm(t(la));fa(la);fa(Ma);Ma=0;}}} //interactive loop
  262. I main(I ac,SS a){GC_INIT();PROLOG;eh();il();R 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement