?

Log in

No account? Create an account
сестра таланта - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

сестра таланта [мар. 20, 2013|01:31 am]
Anatoly Vorobey
[Tags|]

Наткнулся на этот исторический документ, интерпретатор игрушечного фрагмента языка 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)));}



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

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

Comments:
[User Picture]From: gdt
2013-03-19 11:45 pm
мне кажется, тут будут уместны две цитаты из Козьмы Пруткова.
первая: "Усердие всё превозмогает!"
вторая: "Бывает, что усердие превозмогает и рассудок."
(Ответить) (Thread)
[User Picture]From: ygam
2013-03-19 11:56 pm
Говорит, что божество
Воплощается в трех лицах.
Но все трое, если нужно,
Воедино могут слиться;

Что постигнуть это чудо
И поверить не на шутку
Может только тот, кто бросит
Вызов здравому рассудку;
(Ответить) (Parent) (Thread)
[User Picture]From: ushastyi
2013-03-20 12:06 am
Класс! Но неужели в 89м так экономили символы?... Что-то не помню такого.

Стоить заметить, что программы на J часто выглядят куда менее понятными. Особенно для непосвященных. Тем более, что их всегда можно "свернуть" в одну строчку оператором компиляции. Классика жанра -- программа, реализующая сиплекс-метод:


[-(({~"1<:@{:)-(i.@#@[=<:@{.@]))*/(({~<:@{.)%({~<@<:))>

(отсюда)
(Ответить) (Thread)
[User Picture]From: avva
2013-03-20 06:43 am
Не, нормальные люди не экономили :)
(Ответить) (Parent) (Thread)
[User Picture]From: webface
2013-03-20 01:06 am
только с листа

Разрешается делать заметки карандашом или нужно все понять, смотря на экран? Если второй вариант, то сразу сдаюсь :)
(Ответить) (Thread)
[User Picture]From: kirenenko
2013-03-20 01:41 am
Язык R, близкий родственник J, упорно становится основным языком так называемых учьоных. Там «черт побери» постоянное, особенно с учётом того, что учьоные - не программеры.
(Ответить) (Thread)
[User Picture]From: kit1980ukr
2013-03-20 02:02 am
Почему вы считаете, что R - родственник J, к тому же близкий?
(Ответить) (Parent) (Thread)
[User Picture]From: kirenenko
2013-03-20 02:49 am
Я удивлен, что вы удивлены. Не только я так считаю. J и R (и S) - "векторные"/"матричные" языки, имеющие общий исток (APL) и очень близкий синтаксис. R однако не часто воспринимается и обсуждается как язык программирования. Чаще - как библиотека прикладной статистики.

(Ответить) (Parent) (Thread)
[User Picture]From: kit1980ukr
2013-03-20 03:25 am
Векторные языки - согласен.

Общий исток APL - вряд ли для S (R). Люди разные, места разные, время создания примерно одно и тоже...

Насчет "очень близкий синтаксис"... Вот, например, одна и та же по смыслу программа на R и J (http://progopedia.ru/example/fibonacci/)

R:
fib <- function(n) {
  if (n < 2)
    n
  else
    fib(n - 1) + fib(n - 2)
}
print.table(lapply(1:16, fib))

J:
load 'printf'

fibr=: 1:`(-&2 + &fibr -&1) @.(2&<)"0
fstr=: '...' ,~ ,~^:4 '%d, '
fstr printf fibr 1+i.16

(Ответить) (Parent) (Thread)
[User Picture]From: migmit
2013-03-20 01:20 pm
Не знаю R, но программа на нём выглядит совершенно понятной.
(Ответить) (Parent) (Thread)
[User Picture]From: kirenenko
2013-03-20 03:11 pm
да, я соглашусь на счет синтаксиса, он в R чуть более читаемый, как вы продемонстрировали.

Однако, даже к вашему примеру есть куча вопросов. Векторный язык, а функцию к вектору не применяете? Как так? Вместо этого какой-то lapply, который потом требует какой-то print.table.
То есть, то что "программа на нём выглядит совершенно понятной", как написал migmit - это обманчиво.

fib = function(n){ifelse(n < 2, 1, fib(n-1)+fib(n-2))}
paste(1:16, fib(1:16-1), sep=": ")


(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-03-23 11:31 am
более простого кода по моему не существует (никаких тупых циклов по крайней мере нет). просто форматировать надо соответственно.

fib <- function(n){          # объявить функцию
   ifelse(n < 2, 
          1, 
          fib(n-1)+fib(n-2)) # применить рекурсивно
}

paste(1:16,         # склеить вектор 1-16 
      fib(1:16-1),  # с результатами функции
      sep=": ")     # разделитель :_
(Ответить) (Parent) (Thread)
[User Picture]From: kirenenko
2013-04-04 01:02 am
Я вас тут ждал, но не дождался.
Во-первых, искренне, спасибо за ваши посты в R-community и за хороший код.

Во-вторых, спасибо за комментирование/форматирование моего кода. Ах, если б R код, который пишут учьоные, был так оформлен. (Кстатте, "1:16-1" тоже заслуживает комментария)

Но. Не-спасибо за не-комментирование кода kit1980ukr, который даже простой пример написал кое-как.
И отдельное не-спасибо за замену = на <- в моем коде.
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-04-04 06:31 am
Я вас тут ждал, но не дождался.

Вы конечно не поверите, но некие флюиды витали :)

Кстатте, "1:16-1" тоже заслуживает комментария

Да, логика алгоритма "размазана" между двумя операторами. Я видел это, но это уже не комментарий кода. Это "шапка" описание, или чунк (как там было? :) "всякого ....?).

PS в конце концов именно так написав автор кода делает код более понятным :) R это вполне себе язык, на котором именно описывают что было сделано с данными (а не "портянки кода" пишут ()хотя если хочет человек, то портянку кода он на чем угодно напишет :))

"Ах, если б R код, который пишут учьоные, был так оформлен.

1)"учьоных" старательно приучают пользовать for() ("они же начинающие") 2) и не редактировать свой код в emacs (там это практически автоматически получается именно в таком виде)

И отдельное не-спасибо за замену = на <- в моем коде.

за исключением когда оператор присваивания не пишут в стандартной для R форме :)

Кроме того a<-b , a->b ; и для того что бы красиво (компактно) оформить код (именно использовав APL-стиля операторы) очень даже может пригодится.

Edited at 2013-04-04 06:41 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: raindog_2
2013-03-20 11:41 pm
Я бы фибоначчи вот так написал, нерекурсивно:
fib =: 3 : '{. (}.,+/)^:y i.2'
Смысл (для тех кто не читает J) - взять пару чисел, и заменить их на пару из хвоста и суммы чисел. Проделать это N раз, начиная с (0 1), и в конце взять голову пары.
(Ответить) (Parent) (Thread)
[User Picture]From: potan
2013-03-24 07:19 pm
Приемы программирования очень похожи. Только синтаксис более читабельный.
(Ответить) (Parent) (Thread)
[User Picture]From: azzo27
2013-03-20 02:49 am

A вы знаете язык лучше R справляющийся с задачами анали

A вы знаете язык лучше R справляющийся с задачами анализа и визуализации данных?
(Ответить) (Parent) (Thread)
[User Picture]From: kirenenko
2013-03-20 03:16 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

Во-первых, strawman. Я не сказал, что R плохо с чем-то справляется.
И что значит "лучше справляющийся"? Ну, допустим, я скажу Питон, или не дай б-г Джава лучше справляются. Что вы возразите - что там нет rnorm и ggplot2? И при чем здесь язык?
(Ответить) (Parent) (Thread)
[User Picture]From: lyuden
2013-03-20 09:48 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

Объясните мне пожалуйста как человеку которому приходится портировать эти ваши R программы на Python. Что в R есть такое чего нет в Matlab или Mathematica.

Потому что обычно все что я вижу, гораздо легче и понятнее выражается там (и мне и насколько я понимаю аналитикам), а фишек которые дейтсвительно нужны от мейнстримных языков программирования (типа возможности обработки больших объемов данных) в R все равно нет.
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-03-23 11:45 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

какой то вброс :)

а при чем тут ваши трудности в портировании на питон к матлабу и математике? матлаб и математика на питон легче портируются? :)

что касается больших данных --- все для их обработки в R есть, уже даже в роликах ютюба для ленивых выкладывают.


Edited at 2013-03-23 11:48 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: lyuden
2013-03-23 12:02 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Нет не вброс я действительно плохо знаю R и хотел поинтересоваться у знающего человека, думал что датасет даже в несколько десятков гигабайт это уже не к R, потому что она все держит в памяти, да и про распределенные вычисления для R я не слышал, но впрочем я и не искал.

> же даже в роликах ютюба для ленивых выкладывают.

> матлаб и математика на питон легче портируются? :)

Да, аналитики не считают себя программистами и пишут, то что надо сделать, а не то как по их мнению это надо сделать.
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-03-23 12:22 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Нет не вброс я действительно плохо знаю R и хотел поинтересоваться у знающего человека, думал что датасет даже в несколько десятков гигабайт это уже не к R, потому что она все держит в памяти, да и про распределенные вычисления для R я не слышал, но впрочем я и не искал.

> же даже в роликах ютюба для ленивых выкладывают.

> матлаб и математика на питон легче портируются? :)

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

---------------

Думаю что некая "ненависть" к R действительно обоснована. Язык действительно высоуровневый настолько что позволяет писать крайне компактные и легко развиваемые программы человеку для которого программирование является всего лишь инструментом, а не основной специальностью. Таким образом R сокращает рынок написания программного обеспечения "для ученых". Все сводится фактически к релизам прототипов написанных на нем. Естественно с использованием чего либо индустриального из языков программирования.

Что касается размещения объектов в памяти. Одинаковый массив занимает в памяти ровно столько же сколько и в матлабе и в математике. Да и динамически подгружать данные с диска возможно, и распределено хранить - обрабатывать сверхбольшие объемы возможно. Помимо свободных реализаций для сверх больших данных есть несколько проприетарных реализаций для R.


Оба этих изложенных момента упираются в квалификацию пользователя. Увы компания что ученому надо лишь "уметь тыкать мышкой" в офисных продуктах микрософт и различных родственных этим продуктам "ориджинах" сделала свое черное дело.... всем этим "ельфам" теперь нужны "морлоки" для отправления "естественных обязанностей". надеюсь они эльфов съедят в конце концов :)

Edited at 2013-03-23 12:31 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: lyuden
2013-03-23 01:10 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

> Рынок написания программного обеспечения "для ученых" Все сводится фактически к релизам прототипов написанных на нем.

А можно узнать в каких это областях ? Потому что например в кв. химии и других вещах на кластерах и CUDA х до сих пор рулит С, и Fortran изредка с питоновскими API.

У биологов вроде тот же python и изредка, в последнее время, прости господи, Ruby. NLP - это Java и Python точнее NLTK.

Computer vision - С++ и матлаб почему то.

Зоопарк у "ученых" еще тот, и лично у меня лозунги типа "высокоуровневый язык для ученых" доверия не вызывают с тех пор как я прочитал про историю создания Фортрана. И с R то столкнулся впервые когда "ушел из науки", и "R сокращает рынок", это как то вообще громкое заявление.
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-03-23 02:14 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Например помню за деньги программку которая по сути смесь экспонент разлагает в каких то там флюоресценциях. Есть этот рынок, не сомневайтесь.

Электофизиологи какой то то хренью пользуются записывая свои сигналы... я бы сказал там даже секта целая :)

Биоинформатика явно "деградирует" :) раньше помню был perl во все поля :) так что руби вполне логичен.

В отличии от фортрана в основе появления R лежит свежепройденный курс по сицип от Засмана и Абельсона. Обычно люди кидаются свою систему типов писать, а тут взяли и клонировали S. Получилась "еще одна схема" которая по "заветам Столмана" служит высокоуровневым клеем для кода на си и фортране. Сейчас сишный код можно прямо мешать прямо в репле с R кодом.

Например R дает среду в которой сразу пишешь статью (литературное программирование), код практически декларативно описывает что надо делать и рисовать, синтаксис языка носителя нигде не загромождает смысл программы.

Если просто посмотреть, то все происходит в репле. Это делает незаметными расходы на вычисления (в 90% случаев). Возможность, не зарабатывать грыжу пиша полноценные программы, а просто модифицировать минимальными усилиями созданные объекты данных и кода.

За последний год R реализовал функционала больше чем SAS за все время существования :) R включен как составная часть во все крупные проприетарные системы анализа данных.

PS Машинное зрение это OpenCV + pcl + ROS, и писать там можно хоть на лиспе :)
(Ответить) (Parent) (Thread)
[User Picture]From: lyuden
2013-03-23 04:21 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Я верю, что он есть, хех, мне за это заплатили :) просто он скорее называется ПО для анализа данных, а не ПО для ученых, это все таки не совсем одно и то же, ну это я буквоедством занимаюсь.

> R лежит свежепройденный курс по сицип от Засмана и Абельсона.

SICP я конечно смотрел и читал, но видимо я мало общался с R, да и то что я видел напоминало PHP style,
да и ... тоже сильно подкосило
неподготовленную к такой жести психику.
Код который я портировал чаще всего писался в спешке и т.д. Надо будет посмотреть повнимательнее. Спасибо.





Edited at 2013-03-23 16:25 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-03-23 04:40 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

да, наличие рудиментарного for() (хотя усиленно в последних версиях оптимизируют даже код с его участием) в R очень провоцирует новичков "писать программы на фортране". :( уверен что loop из общелиспа очень органично смотрелся бы в R даже чисто внешне (стиль кода вполне Rовский). ну и любители циклы наворачивать получили бы вожделенное :)

хотя итераторы написали давно, и в принципе должно хватать и так возможностей писать именно циклы.

(Ответить) (Parent) (Thread)
[User Picture]From: potan
2013-03-24 07:29 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Я у биологов в основном R встречал. Питон попадался реже, примерно как Perl.
(Ответить) (Parent) (Thread)
[User Picture]From: lyuden
2013-03-24 07:35 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Ага. Спасибо. Значит я все таки пристрастен.
(Ответить) (Parent) (Thread)
[User Picture]From: kirenenko
2013-04-04 01:15 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

крайне компактные === нечитаемые

легко развиваемые === одноразовые

Вы знаете, зачем вообще портируют Р код на Питон и проч? Для ПРИЛОЖЕНИЙ.

для ученых Р - рай. Использовал пакетик по специальности - хорошо (трибализм). Код нечитаемый - хорошо (элитизм).
Заявим, что все воспроизводимо, т.к. маркдаун/книтор/проч.дерьмо (карго культ).

Плюс пишут этот код далеко не всегда эти ученые.
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-04-04 07:01 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

в R код компактный за счет крайне продуманной системы высокоуровневых операторов и полноценных функций + всеостальноечтоприсущесхеме

никакой "нечитаемости" в нем нет.

большинство "пакетиков" посвящено именно заведению еще одного фрагмента "пазла". и этот фрагмент очень хорошо и удобно вписывается в уже имеющуюся систему и удачно её дополняет.

"легко развиваемые" и "нечитаемые" явно противоположные понятия. все рассуждения притянутые из программинга в случае R "мимо кассы". Язык используется в режиме интерактивной обработки данных. "программа" на нем обрабатывает в 99% процентах случаев конкретную выборку данных (и да, она не обязана быть корректной на другой выборке :) )

что касается "дерьма". побольше бы такого "дерьма" которое повышает производительность труда (конкретно написание статей и презентаций) на _два_ порядка.

PS ...а ученые и диссертации свои не всегда сами пишут :)

Edited at 2013-04-04 07:06 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: kirenenko
2013-04-04 08:21 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

. все рассуждения притянутые из программинга в случае R "мимо кассы". Язык используется в режиме интерактивной обработки данных

Золотые слова. Я выше это уже написал. Р - замечательный калькулятор, экономит кучу времени как учьоным, так и учёным. И нормальным людям тоже. Но это ужасный язык программирования, который поощряет нечитаемый одноразовый код. Нечитаемый. Одноразовый. 😝
(Ответить) (Parent) (Thread)
[User Picture]From: p2004r
2013-04-04 09:36 am

Re: A вы знаете язык лучше R справляющийся с задачами ана

1) R помимо использования в режиме "просто модифицировать минимальными усилиями созданные объекты данных и кода" вполне можно использовать для написания портянок кода в котором предусмотрено абсолютно всё.

Только надо помнить что: писать придется "как на схеме", с использованием объектной системы "как в лиспе", осознанно выбрав стиль кодирования в котором будет решена задача. При чем сам язык не накладывает _никаких_ ограничений.

Оба режима одинаково важны и нужны. Умение вовремя "переключиться" от одного подхода к другому и составляет "опытность" пользователя R.

2) Не читаемый и одноразовый код люди пишут на любом языке программирования :)

Код R вставленный (в 90% случаев 1-2 строчками) в текст статьи заменяет целые предложения (а то и страницы :) ) невразумительных объяснений "что авторы имели в виду". Если это "нечитаемость", то я за неё. :)
(Ответить) (Parent) (Thread)
[User Picture]From: lyuden
2013-03-23 12:10 pm

Re: A вы знаете язык лучше R справляющийся с задачами ана

Погуглил. Заманчиво. Т.е. не совсем понятно чем я тогда занимаюсь, но это не к вам :)
(Ответить) (Parent) (Thread)
[User Picture]From: razetdinov
2013-03-20 02:08 am
Без пива не разберешься.
(Ответить) (Thread)
[User Picture]From: strangeraven
2013-03-20 06:25 am
понять помучившись, конечно, можно, но зачем?

гораздо проще ее отформатировать по человечески, удалить макросы, переименовать переменные и так разобраться
(Ответить) (Thread)
[User Picture]From: _winnie
2013-03-20 10:55 am
Зачем удалять макросы? :)

#define P printf
#define R return

P - наПечатать (Print)
R - веРнуть (Return)
(Ответить) (Parent) (Thread)
From: onanymous.myopenid.com
2013-03-20 06:57 am
Roger Hui – это пять.
(Ответить) (Thread)
[User Picture]From: ledernierheros
2013-03-20 10:08 am
А это точно интерпретатор J? Я всегда думал, что это интерпретатор A+. По ссылке сказано "an interpreter fragment", что не проясняет ситуацию

Да, у Артура, голова работает явно по-другому. Но что-то притягательное в этом есть. Когда начинал писать на q (развитие k), всегда использовал длинные имена функций, которые всё объясняют. А потом стал всё больше писать однострочники - которые все перед глазами и в объяснениях не нуждаются.
Что меня в q/k поражает гораздо больше - это контекстозависимоть. $ - может быть как cast, так и if/else, так и case. Если второе и трерье ещё как-то связаны, то почему тот же самый символ используется для первого - для меня - полная загадка.
(Ответить) (Thread)
[User Picture]From: zigel
2013-03-20 12:41 pm
Пока так:
t - тип 0 или 1 (box?)
r - размерность,
d - размеры r-мерного прямоугольника
p - данные.

tr -- количество "элементарных" элементов
ga - конструктор
iota - создание 1-мерного массива [0, 1, ... n]
plus - сложение массивов одинаковой размерности и размеров
from - доступ к произвольному n-1 мерному ряду/элементу
box - запаковать в один элемент специального типа
cat -- конкатенировать и запаковать в линейный массив
size - количество рядов (первый размер)
rsh - тоже какое-то склеивание
sha - размеры

парсинг и выполнение лень было читать.



Edited at 2013-03-20 12:42 (UTC)
(Ответить) (Thread)
[User Picture]From: avva
2013-03-20 12:49 pm
все верно, да
t - обозначает, что это на самом деле запакованный указатель на другой элемент
rsh - ключевая штука, потому что единственное, что позволяет увеличить размерность
в парсинге оригинально сделана поддержка той запаковки, что указана в t, но в целом ничего очень сложного нет

(Ответить) (Parent) (Thread)
[User Picture]From: zigel
2013-03-20 01:02 pm
rsh - точно, не заметил. A z=ga(w->t,r,a->p).
Создает массив с размерами из данных второго параметра (и размерностью = ширина второго параметра), и укладывате/обрезает данные первого параметра.
(Ответить) (Parent) (Thread)
[User Picture]From: soloviewoff
2013-03-23 07:00 pm
rsh - reshape, частая штука из "массивных" языков.

Язык, увы, не Тюринг-полный, так что не получится устроить конкурса на самую интересную программу на этом миниязыке.

Спасибо за публикацию. С удовольствием прочитал код. Совсем с листа не хватило терпения - в паре мест вставил переводы строки, догадки проверял запуском.
(Ответить) (Parent) (Thread)
[User Picture]From: lj_val
2013-03-20 04:41 pm
Обфускация - OK
(Ответить) (Thread)
[User Picture]From: avva
2013-03-20 04:42 pm
это не обфускация
(Ответить) (Parent) (Thread)
[User Picture]From: gineer
2013-03-20 06:58 pm
по именам понятно, что это реализации примитивов языка... и да, в таком виде оно неудобоваримо, как и всякий обфускейтед, или тупо бинарник без дизасама(а иногда и с ним). :)
(Ответить) (Thread)
[User Picture]From: moon_aka_sun
2013-03-20 07:57 pm
Да, великие люди, все трое. Что тут можно ещё сказать.
(Ответить) (Thread)
[User Picture]From: raindog_2
2013-03-20 11:46 pm

J - волшебный язык

Уже несколько лет по-детски радуюсь языку J. Он, конечно, write-only language, но я его и применяю в случаях, когда нужно что-то быстро посчитать, и скорее всего это больше не понадобится. Но каждый раз - как чудо - одна строка, которая делает то, что на обычном языке заняло бы страницы, и делает быстро.
(Ответить) (Thread)
[User Picture]From: kodt_rsdn
2013-03-23 10:22 pm

Re: J - волшебный язык

Шеф рассказывал, что в советской древности у них в ЦНИИ Крылова была французская ЭВМ со встроенным APL. Так вот, библиотека программ к ней представляла журнал, где на развороте с одной стороны была пара-тройка строчек из "взбесившегося линотипа" и описание к ним, а с другой стороны - фото красотки.
С такого ммммм, оляля, языка программирования - просто недетская радость.
(Ответить) (Parent) (Thread)
[User Picture]From: spamsink
2013-03-24 06:17 am

Re: J - волшебный язык

В советской древности APL был и на БЭСМ-6 (естественно, с подгонкой символов APL под ГОСТ 10859). Как сейчас помню, программа, вычисляющая и рисующая графики биоритмов, используемая для развлечения публики на днях открытых дверей, состояла из 4 или 5 строк.
(Ответить) (Parent) (Thread)