Arthur Whitney's interpreter, decompressed
typedef char C; | |
typedef long I; | |
typedef struct a { | |
I t,r,d[3],p[2]; | |
}* A; | |
#define P printf | |
#define R return | |
#define V1(f) A f(w)A w; | |
#define V2(f) A f(a,w)A a,w; | |
#define DO(n,x) {I i=0,_n=(n);for(;i<_n;++i){x;}} | |
I *ma(n) { | |
R(I*)malloc(n*4); | |
} | |
mv(d,s,n) I *d,*s; { | |
DO(n,d[i]=s[i]); | |
} | |
tr(r,d) I *d; { | |
I z=1; | |
DO(r,z=z*d[i]); | |
R z; | |
} | |
A ga(t,r,d) I *d; { | |
A z=(A)ma(5+tr(r,d)); | |
z->t=t,z->r=r,mv(z->d,d,r); | |
R z; | |
} | |
V1(iota) { | |
I n=*w->p; | |
A z=ga(0,1,&n); | |
DO(n,z->p[i]=i); | |
R z; | |
} | |
V2(plus) { | |
I r=w->r,*d=w->d,n=tr(r,d); | |
A z=ga(0,r,d); | |
DO(n,z->p[i]=a->p[i]+w->p[i]); | |
R z; | |
} | |
V2(from) { | |
I r=w->r-1,*d=w->d+1,n=tr(r,d); | |
A z=ga(w->t,r,d); | |
mv(z->p,w->p+(n**a->p),n); | |
R z; | |
} | |
V1(box) { | |
A z=ga(1,0,0); | |
*z->p=(I)w; | |
R z; | |
} | |
V2(cat) { | |
I an=tr(a->r,a->d),wn=tr(w->r,w->d),n=an+wn; | |
A z=ga(w->t,1,&n); | |
mv(z->p,a->p,an); | |
mv(z->p+an,w->p,wn); | |
R z; | |
} | |
V2(find) { | |
} | |
V2(rsh) { | |
I r=a->r?*a->d:1,n=tr(r,a->p),wn=tr(w->r,w->d); | |
A z=ga(w->t,r,a->p); | |
mv(z->p,w->p,wn=n>wn?wn:n); | |
if(n-=wn) | |
mv(z->p+wn,z->p,n); | |
R z; | |
} | |
V1(sha) { | |
A z=ga(0,1,&w->r); | |
mv(z->p,w->d,w->r); | |
R z; | |
} | |
V1(id) { | |
R w; | |
} | |
V1(size) { | |
A z=ga(0,0,0); | |
*z->p=w->r ? *w->d : 1; | |
R z; | |
} | |
pi(i) { | |
P("%d ",i); | |
} | |
nl() { | |
P("\n"); | |
} | |
pr(w) A w; { | |
I r=w->r,*d=w->d,n=tr(r,d); | |
DO(r,pi(d[i])); | |
nl(); | |
if(w->t) | |
DO(n,P("< ");pr(w->p[i])) | |
else | |
DO(n,pi(w->p[i]));nl(); | |
} | |
C vt[]="+{~<#,"; | |
A(*vd[])()={0,plus,from,find,0,rsh,cat}, | |
(*vm[])()={0,id,size,iota,box,sha,0}; | |
I st[26]; | |
qp(a) { R a >= 'a' && a<='z'; } | |
qv(a) { R a<'a'; } | |
A ex(e) I *e; { | |
I a=*e; | |
if(qp(a)) { | |
if(e[1]=='=') | |
R st[a-'a']=ex(e+2); | |
a=st[ a-'a']; | |
} | |
R qv(a) ? (*vm[a])(ex(e+1)) : e[1] ? (*vd[e[1]])(a,ex(e+2)) : (A)a; | |
} | |
noun(c) { | |
A z; | |
if(c<'0'||c>'9') | |
R 0; | |
z=ga(0,0,0); | |
*z->p=c-'0'; | |
R z; | |
} | |
verb(c) { | |
I i=0; | |
for(;vt[i];) | |
if(vt[i++]==c) | |
R i; | |
R 0; | |
} | |
I *wd(s) C *s; { | |
I a,n=strlen(s),*e=ma(n+1); | |
C c; | |
DO(n,e[i]=(a=noun(c=s[i]))?a:(a=verb(c))?a:c); | |
e[n]=0; | |
R e; | |
} | |
main() { | |
C s[99]; | |
while(gets(s)) | |
pr(ex(wd(s))); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Link to the original: http://www.jsoftware.com/jwiki/Essays/Incunabulum with commentary at https://news.ycombinator.com/item?id=8534989