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 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 19 2021
22 232425262728
2930     

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 23rd, 2025 09:28 am
Powered by Dreamwidth Studios