Skip to content

Instantly share code, notes, and snippets.

@piotrklibert
Created June 2, 2017 09:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save piotrklibert/4d32c8cc6fcf20643a257a26bd17bcde to your computer and use it in GitHub Desktop.
Save piotrklibert/4d32c8cc6fcf20643a257a26bd17bcde to your computer and use it in GitHub Desktop.
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