Skip to content

Instantly share code, notes, and snippets.

Created October 30, 2014 18:41
Show Gist options
  • Save anonymous/f72e5c4a432492abce59 to your computer and use it in GitHub Desktop.
Save anonymous/f72e5c4a432492abce59 to your computer and use it in GitHub Desktop.
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)));
}
@Art-B
Copy link

Art-B commented Nov 19, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment