green_fr: (Default)
[personal profile] green_fr
Курс программирования на УБЗ. Глава 5. Часть 1. A Programming Language или Уроки Практической Магии.

Удивительно, но я не только не знал до сих пор APL, но и услышал о нём, мне кажется, впервые. Хотя, как можно было не выучить язык, на котором программа выглядит следующим образом:

(((1,A)/B)⌊1+⍴Y)[(⍴Y)↓(+\1,A←(1↓A)≠¯1↓A←A[B])[⍋B←⍋A←Y,X]]

Удивительно ещё и из-за того, что (судя по первой части описания) язык очень похож на MatLab, с которым я работаю каждый день. MatLab сильно проигрывает в моих глазах зацикленностью на символах латинского алфавита, за счёт чего получается некая многословность. А функциональность пока что совпадающая.

1. «⍳x» — это, очевидно, «1 : x». Даже «⍳0» эквивалентно «1 : 0» в том смысле, что оба возвращают «ничто». От себя замечу, что в Матлабе не бывает просто «ничего», оно всегда размерное. Данное ничего имеет размерность 1×0, оно так и называется «1×0 empty double row vector». Для удобства пользователя есть отдельная функция empty, позволяющая создать пустоты разного размера, например, double.empty(0, 0, 1, 2) создаёт пустую матрицу 0×0×1×2.
2. «⍴» - это MatLab’овский repmat. Отличие от APL в том, что приходится явно указывать, сколько раз плодить исходную матрицу в каждом из измерений — поскольку просто «пустоты» не бывает.
3. Минимум и максимум, конечно же, пишутся min и max. Небольшое отличие от примера из первой главы APL в том, что они снова ищут минимумы и максимумы вдоль одного из измерений (по умолчанию первого, но, к сожалению, есть нюансы). То есть, min возвращает матрицу той же размерности, что исходная, за исключением размерности, по которой проходил поиск, где размерность будет равняться 1. Т.о. min(0 : 1) вернёт ничего размерности 1×0.
4. Но нельзя же работать без самого большого и самого маленького чисел, для них в MatLab есть специальные литеры: Inf и -Inf. А в добавок ещё и eps — это тоже «самое маленькое число», но в другом смысле: это самое близкое к нулю число, которое ещё отличается от нуля (на моей машине это 2,22e-16).
5. Унитарный вариант «⍴» — это буквальный аналог MatLab’овского size. Хотя нет, аналог не полный — из каких-то своих соображений size никогда не возвращает скаляр. Даже для скаляра он возвращает вектор из двух элементов — действительно, скаляр эквивалентен матрице 1×1. Но он же эквивалентен и матрице 1×1×1×1×1×1. Очевидно, на двух измерениях остановились в силу каких-то исторических причин (в языке полно рудиментов, когда первые два измерения трактуются отлично от следующих).

Конечно, редкая программа на MatLab помещается в одну строчку (у нас кода на 4MB), но это не мешает мне любить свою работу. Но клавиатура как в статье УБЗ мне не помешала бы :-)

Date: 2017-07-10 01:06 pm (UTC)
From: [identity profile] catpad.livejournal.com
Ух ты, а университет-то приносит плоды! Я почему-то думал, что это довольно известный язык.
Погоди, то ли ещё будет во второй части!

Date: 2017-07-10 01:58 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Ты не поверишь, меня буквально вот на этих выходных за шашлыками друг попросил напомнить, как там называлась вон та игра, на листике в клеточку, где надо было по правилам закрашивать. Чтобы примерно представлять, это был не какой-нибудь там художник-фотограф, а парень нашего возраста, который первые свои деньги заработал пайкой и продажей синклеров на радиорынке. Ну и с тех пор много программ написал. А вот про "жизнь" не слышал. Мир безумно разнообразен :-)

Date: 2017-07-10 02:23 pm (UTC)
From: [identity profile] catpad.livejournal.com
Да, удивительно.
Именно поэтому так полезен УБЗ. Вроде пишешь всем известные вещи - ан нет, это иллюзия.

А это ты там в мессенджере написал, что хочешь в оффлайне делать лекции ? (Я там запутался уже, он не показывает, кто пишет, кошмар какой-то).
Это было бы очень круто! И можно прямую трансляцию в ФБ вести.
(Ну и маечки подготовим само собой :)

Date: 2017-07-10 02:52 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Смотри. У нас есть вот эти вот "семейные лагеря". Сейчас в августе будет [livejournal.com profile] mathcamp_at, я хочу там просто поговорить об УБЗ, послушать, что скажут другие умные люди. А в сентябре будет [livejournal.com profile] herbst_2015_gua, и если мы хорошо поговорим в августе, то в сентябре можно будет попытаться провернуть что-то такое вот эдакое. Так что, маечки пока не печатай, но идею я запомню!

Date: 2017-07-10 10:20 pm (UTC)
From: [identity profile] catpad.livejournal.com
Это здорово!
Ты попробуй других умных людей привлечь в профессора тоже.
Маечки печатать пока не буду, но к сентябрю буду готовиться :)

Date: 2017-07-10 01:13 pm (UTC)
From: [identity profile] wildest-honey.livejournal.com
бррр:)

мои коллеги любят говорить про прекрасные языки white space и brainfuck:)

Date: 2017-07-10 01:53 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Эти-то как раз я знал, но настоящая-то красота - вон она какая! Эпиграф там стоит очень в тему :-)

Date: 2017-07-10 01:19 pm (UTC)
From: [identity profile] muh2.livejournal.com
Проблема в незацикленности на буквах латинского алфавита в том, что в выделенной формуле «⍳x» не встречается. А по-видимому должно. Лучше уж многословность.

А то вот еще Перл, говорят, немногословный язык в котором любая комбинация символов имеет смысл. Да и в С со звездочками и скобками можно далеко заплутать.

Date: 2017-07-10 01:55 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Я первую фразу совсем не понял :-) Ты о том, что ⍳x нет в монстре, а потом я о нём говорю? Это я просто надёргал из лекции, там всё вполне нормально перетекает друг в друга, а у меня целостность повествования здесь отсутствует.

Date: 2017-07-10 01:56 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Вот perl мне как раз этим и не нравился. Сложно сформулировать, что именно здесь мне кажется красивым - не сжатость, а скорее какая-то типографская красота, набор симпатичных букв. Ну и сам язык хорош - но об этом пост, я поэтому и работаю на MatLab, что он тоже красивый.

Date: 2017-07-10 01:20 pm (UTC)
From: [identity profile] chaource.livejournal.com
Вы, навѣрно, еще не видѣли языка Ursala.

Вотъ рѣшенiе задачи 8 ферзей:

queens =
%np+~command.options.&h.keyword.&iNC; -+
~&iNC+ file$[contents: --<''>+ %nLP*=; * '<'%='[ '+ ','%=', '+ '>'%=' ]']+ ~&rSSs+ nleq-<&l*rFlhthPXPSPS,
~&i&& ~&lNrNCXX; ~&rr->rl %tLnLtXLLWXMk+ ^/~&l ~&lrrhrSiF4E?/~&rrlPlCrtPX ~&r; ^|/~& ^|T\~& -+
-<&l^|*DlrTS/~& ~&iiDlSzyCK9hlPNNXXtCS,
^jrX/~& ~&rZK20lrpblPOlrEkPK13lhPK2; ~&i&& nleq$-&lh+-,
^/~&NNXS+iota -<&l+ ~&plll2llr2lrPrNCCCCNXS*=irSxPSp+ ^H/block iota; *iiK0 ^/~& sum+-

Вотъ рѣшенiе головоломокъ "судоку":

sudoku =
~command.files; <.file$[contents: --<''>]>+ *= ~contents.&F; * -+
~&rSL+ (psort (nleq+)* <~&blrl,~&blrr>)+ ~&arg^& -+
~&al?\~&ar ~&aa^&~&afahPRPfafatPJPRY+ ~&farlthlriNCSPDPDrlCS2DlrTS2J,
^|J/~& ~&rt!=+ ^= ~&s+ ~&H(
-+.|=&lrr;,|=&lrl;,|=≪+-,
~&rgg&& ~&irtPFXlrjrXPS; ~&lrK2tkZ2g&& ~&llrSL2rDrlPrrPljXSPTSL)+-,
//~&p ^|DlrDSLlrlPXrrPDSL(~&,num*+ rep2 block3)*= num block27 ~&iiK0 iota9,
* `0?=\~&iNC ! ~&t digits+-


Тамъ тоже есть "iota", однако, превращать ее въ особый символъ совершенно не требуется. Язык и такъ достаточно кратокъ.

Date: 2017-07-10 02:03 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Я чуть выше попытался сформулировать, почему мне APL понравился. Не за краткость или вот такую откровенную brainfuck'нутость. А за красивые буковки :-) Ну и структура интересная.
Краткость ради краткости мне наоборот не нравится. Когда я писал на perl, я там нарочно переобозначал все эти доллары-точки на длинные, но читаемые названия, и ни в коем случае не использовал анонимные переменные типа "результат последней операции". Это как раз мне кажется уродством. Равно как и ваш вот ужас - не возникает даже желания искать там какую-то структуру. Типичный Base64 :-)))

Date: 2017-07-10 03:01 pm (UTC)
a_p: (Default)
From: [personal profile] a_p
Из современных языков тебе может понравится Хаскель, там можно хоть функцию, хоть что повесить на любой юникодный символ, шобы красиво!
А епсилон, кстати, обычно не "ближайшее к нулю, но не ноль", это минимальное такое, что 1.0+eps > 1.0.

Date: 2017-07-10 03:42 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Точно, ты прав! Это мы его используем, чтобы отличать от шум около нуля от данных. Но конечно же, к нулю можно приближаться, пока степень не кончится.

Date: 2017-07-10 03:44 pm (UTC)
From: [identity profile] green-fr.livejournal.com
А свои переменные / функции можно юникодом называть и в джаве. Это много где можно, мне кажется. Тут фишка в том, что изначально язык с кракозябрами. То есть реально ты сначала должен выучить его алфавит, чтобы иметь возможность прочитать в голос программу, например.

Date: 2017-07-10 03:49 pm (UTC)
a_p: (Default)
From: [personal profile] a_p
Не только переменные-функции, операторы (включая инфиксные) и прочее тоже можно, например _|_ записать как ⊥. Про АПЛ я читал, им надо было в своё время закорефаниться с производителем клавиатур, и все бы теперь на нём писали!

Date: 2017-07-10 10:18 pm (UTC)
From: [identity profile] catpad.livejournal.com
Тут нужно уточнить, что в Джаве, Свифте и много где ещё юникодом можно называть именно что свои переменные. А в APL keywords языка изначально кракозябрами (теперь уж они все есть в юникоде). Такого точно нигде нет.

Кстати, чтобы облегчить дело, на смену APL придумали язык J, который делал примерно то же самое, но все функции были уже написаны обычными словами. Ну и что ж - сгинул язык J, никто не стал им пользоваться!

Date: 2017-07-11 02:38 pm (UTC)
From: [identity profile] gianthare.livejournal.com

Да, J это ужас-ужас, гораздо хуже читается, чем APL

Date: 2017-07-11 10:21 pm (UTC)
From: [identity profile] catpad.livejournal.com
Вот ведь интересная штука получается. J сделали, чтобы людям облегчить жизнь, не мучиться с кракозябрами. А никто его не полюбил.
Получается, что весь фокус APL как раз в них-то и состоял!

Date: 2017-07-11 02:39 pm (UTC)
From: [identity profile] gianthare.livejournal.com

Если бы словами - там сплошные цепочки знаков пунктуации

Profile

green_fr: (Default)
green_fr

June 2025

S M T W T F S
123 4 567
89 1011 12 1314
15 16 17 18 192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 20th, 2025 12:01 am
Powered by Dreamwidth Studios