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

  • об этнической/расовой вине

    "Десятилетиями русские в Эстонии жили, получая деньги благодаря той самой этничности, что была и у людей, которые расстреливали и ссылали эстонцев.…

  • большая лодка застряла

    Мне неожиданно понравилась чудаческая запись "Мне нравится, что большая лодка застряла", сами знаете о чём. Вот частичный перевод с вольностями:…

  • вопрос о медицине (израильское)

    Друзья, этот вопрос для израильтян, он про израильскую медицину. Спрашиваю не для себя, для близко знакомого хорошего человека, буду очень благодарен…

  • 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

  • об этнической/расовой вине

    "Десятилетиями русские в Эстонии жили, получая деньги благодаря той самой этничности, что была и у людей, которые расстреливали и ссылали эстонцев.…

  • большая лодка застряла

    Мне неожиданно понравилась чудаческая запись "Мне нравится, что большая лодка застряла", сами знаете о чём. Вот частичный перевод с вольностями:…

  • вопрос о медицине (израильское)

    Друзья, этот вопрос для израильтян, он про израильскую медицину. Спрашиваю не для себя, для близко знакомого хорошего человека, буду очень благодарен…