Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

сестра таланта

Наткнулся на этот исторический документ, интерпретатор игрушечного фрагмента языка J, написанный в 89-м году создателем родственного языка K.

Если вы не знаете J/APL (как и я; давно хочу изучить, да все как-то...), то предлагаю вам задачу, которую я поставил перед собой из чистого любопытства мазохизма упрямства: прочитайте и поймите эту программу (включая понимание того, как устроен язык, который она интерпретирует) только с листа, не перенося ее в компьютер, не запуская, не переписывая исходники более понятным образом итп.




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)));}



Я потратил на это немало времени сегодня вечером, но, кажется, добился.

Но черт побери. Черт побери! (подавляет в себе сложные эмоции и уходит, качая головой)
Tags: программирование
Subscribe

  • продать душу подороже

    если предположить, что кто-то вообще в наше время подписал сделку с дьяволом, что есть вообще такая штука, то можно покумекать и догадаться, кто это…

  • новый бэтмен

    Я видел нового "Бэтмена" и я одобряю этот мем. Очень длинный фильм, происходящий целиком в полутьме или почти полной темноте, полный бессмысленной…

  • не смотри вверх

    Всю прошлую неделю в ленте у меня все обсуждали фильм "Не смотри вверх" (Don't Look Up), а я думал промолчать, но все-таки скажу: я не смог его…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 48 comments

  • продать душу подороже

    если предположить, что кто-то вообще в наше время подписал сделку с дьяволом, что есть вообще такая штука, то можно покумекать и догадаться, кто это…

  • новый бэтмен

    Я видел нового "Бэтмена" и я одобряю этот мем. Очень длинный фильм, происходящий целиком в полутьме или почти полной темноте, полный бессмысленной…

  • не смотри вверх

    Всю прошлую неделю в ленте у меня все обсуждали фильм "Не смотри вверх" (Don't Look Up), а я думал промолчать, но все-таки скажу: я не смог его…