[09:15:44] <geniepro> http://maxim.livejournal.com/490018.html RUST. Энтерпрайз Эдишин
[09:55:58] <geniepro> https://www.youtube.com/watch?v=cdyrL9nDcVA
[14:19:39] <valexey> geniepro: а что такое EXE/OM и нафига оно нужно в реальной жизни?
[14:25:00] <geniepro> хз, какой-то язык вроде
[14:25:25] <valexey> реализованый на ерланге
[14:25:29] <valexey> с зависимыми типами
[14:25:31] <valexey> o_O
[14:25:31] <geniepro> http://maxim.livejournal.com/464767.html
[14:25:53] <geniepro> этот хохол Макс Сохацкий переписывает его с эрланга на раст
[14:26:45] <valexey> ты так говоришь хохол, будто это что-то плохое...
[14:27:04] <geniepro> ну как бы хохлы считают русских своими врагами, что не есть хорошо
[14:27:33] <geniepro> а этот Сохацкий такой чистый свидомит, прямо как в вакууме
[14:28:06] <valexey> ну, для самих хохлов наверно и не хорошо. равно как и для русских считать американцев своими врагами.
[14:29:13] <geniepro> valexey: с американцами ситуация другая -- постоянная риторика от официальных сшашных правительственных и военных лиц о том, что Россия == враг.
со стороны русских же нет такого об украинцах
[14:29:37] <valexey> да никому в US россия особо не упёрлась
[14:29:42] <valexey> её почти никто и не упоминает
[14:29:54] <valexey> то есть упоминают россию в сша сильно реже чем сша в россии
[14:29:59] <geniepro> valexey: если кто-то (президент США или хотя бы генерал Пентагона) называет тебя врагом, лучше ему поверить и считать его тоже врагом
[14:30:52] <geniepro> сколько раз в России на выборах кричали, что Обама вмешивается в российские выборы? что-то не помню такого
а про Путина и выборы в США такое постоянно
[14:31:52] <valexey> неоднократно кричали
[14:32:04] <valexey> только не Обама, а США как государство
[14:32:14] <valexey> и до кучи законов напринимали
[14:33:00] <geniepro> с этими законами Россия вечно тормозит. или смотрит, как они поработают десятки лет в других странах и лишь потом повторяют
[14:43:14] <valexey> знаешь, принятие почти любого закона (или обычая) можно оправдать тем, что это уже давно существует и действует у кого-то другого.
[14:43:29] <valexey> ну например вот: https://lenta.ru/photo/2016/10/31/my_granny_is_back#0
[14:43:37] <valexey> добрые христиане. кстати.
[14:44:01] <valexey> считаю нам тоже надо перенять сии милые обычаи. ну а чо? у них же есть. значит и нам бы неплохо было бы.
[14:50:31] <geniepro> если закон показал свою полезность для общества, пусть даже в другом обществе, то он заслуживает принятия
[14:55:02] <valexey> закон не работает в пустоте. приколхозить к велосипеду двигло от трактора конечно можно, только толку с этого не будет.
[14:56:57] <geniepro> при чём тут пустота?
[15:02:33] <valexey> закон - штука контестозависимая
[15:02:52] <valexey> *контекстозависимая
[15:14:15] <geniepro> valexey: ты анимешки ещё смотришь? помнишь "Code Geass: Lelouch of the Rebellion"? там ещё про битвы на больших человекоподобных роботах )))
[15:14:27] <valexey> yep
[15:14:52] <geniepro> недавно вышел сериал "Чёрный хром - Kuromukuro" -- рекомендую
[15:15:13] <geniepro> правда там нет таких всяких суперсил и мегабитв, но тоже вполне ничего
[15:15:27] <valexey> спасип. заценимс :-)
[15:16:05] <valexey> в камле ощущается то ли какая-то недоделанность, то ли просто местами архаичность
[15:16:35] <geniepro> http://www.world-art.ru/animation/animation.php?id=8619
[15:16:49] <geniepro> архаичность и видимо требования к совместимости
[15:17:02] <valexey> ну и недоделанность
[15:17:25] <valexey> ну, например берем REPL
[15:17:43] <valexey> говорим:
type neg = int;;
42;;
[15:17:56] <valexey> вот как думаешь, какого типа будет литерал 42?
[15:18:06] <geniepro> int
[15:18:13] <valexey> neg
[15:18:21] <geniepro> о_О с чего вдруг?
[15:18:30] <geniepro> или пример неполный?
[15:18:35] <valexey> а вот хз. видимо используется последний синоним типа
[15:18:42] <geniepro> может быть
[15:18:50] <geniepro> ацтой, говорю же )))
[15:18:57] <valexey> то есть type foo = bar;; тут создает синоним тупо
[15:19:17] <valexey> но это ещё не всё
[15:19:34] <geniepro> если тебе суперскорость нужна, плюс нечто относящееся к ML -- юзай ATS!!! правда он только под юниксы всякие, под вендой его нет
[15:19:37] <valexey> там очень рекомендуется создавать типы-записи так, чтобы имена их полей не пересекались :-)
[15:20:24] <geniepro> в хаскелле это обосновано тем, что у запесей полей по сути нет, есть функции доступа к содержимому записи
[15:20:48] <valexey> в хаскиле таки нужно явным образом конструктор указывать
[15:20:51] <geniepro> а функции эти попадают в голбальный scope модуля
[15:20:51] <valexey> такс, щща пример
[15:21:44] <valexey> берем и делаем два типа - записи:
 type heartbeat =
   { session_id: string;
     time: Time.t;
     status_message: string;
   }
 type logon =
   { session_id: string;
     time: Time.t;
     user: string;
     credentials: string;
   }
[15:22:03] <valexey> а теперь берем и пишем функции две. почти одинаковые :-)
[15:22:04] <geniepro> кто-нить скиньте инфе21 статью https://habrahabr.ru/post/182442/ что бы он знал, как надо не допускать провалы Ариан-5 ))
[15:22:12] <valexey> # let status_and_session t = (t.status_message, t.session_id);;
val status_and_session : heartbeat -> string * string = <fun>
# let session_and_status t = (t.session_id, t.status_message);;
Characters 44-58:
Error: The record type logon has no field status_message

[15:22:52] <valexey> чуешь в чем подвох? :-)
[15:23:23] <geniepro> структурная типизация там что ли?
[15:24:02] <valexey> не. типизация нормальная.
[15:24:09] <geniepro> но вообще это какой-то нехороший код вышел! у тебя же ООП есть -- юзай наследование ))
[15:24:10] <valexey> вывод типов тут просто косячит, как видишь
[15:24:20] <valexey> у каждой функции тут есть четкий конкретный тип аргумента
[15:24:43] <valexey> то есть в плюсах это был бы просто шаблон и он работал бы с обоими записями за милую душу
[15:24:45] <valexey> а тут - хрен
[15:25:04] <geniepro> в хаскелле думаю тоже работал бы, хотя хз, проверять надо
[15:25:26] <valexey> то есть это не обобщенная функция с одной стороны, но с другой стороны анотации типов не обязательны, поэтому выводильщик типов ориентируется по первому же встреченному полю.
[15:25:54] <valexey> во второй функции это поле - session, и он тогда берет самый свежий тип у которого есть такое поле. и всё.
[15:26:03] <geniepro> стоп, раз тут функции, скорее всего в хаскелле тоже не сработает
[15:26:15] <valexey> ы?
[15:26:31] <geniepro> ну короче, говорил же я тебе -- не зря люди плюются на окамль )
[15:27:00] <valexey> ну, в камле всё плюс-минус хорошо, но постоянное ощущение недопиленности какой-то.
[15:29:20] <valexey> в хаскеле, полагаю, тут была бы ошибка на этапе компиляции для обоих функций.
[15:29:24] <valexey> либо всё бы работало
[15:34:44] <geniepro> import Data.Time

data HeartBleed = HeartBleed
   { session_id     :: String
   , time           :: TimeOfDay
   , status_message :: String
   }

data Logon = Logon
   { session_id  :: String
   , time        :: TimeOfDay
   , user        :: String
   , credentials :: String
   }

Records.hs:12:7: error:
   Multiple declarations of ‘session_id’
   Declared at: Records.hs:6:7
                Records.hs:12:7

Records.hs:13:7: error:
   Multiple declarations of ‘time’
   Declared at: Records.hs:7:7
                Records.hs:13:7
[15:35:35] <geniepro> короче, в одном типе АлгТД могут быть поля с одинаковыми именами и типами у разных вариантов записи, но в разных типах нельзя одинаковые имена полей
[15:36:26] <geniepro> это одно из больших неудобств хаскелля, которое именно от того и происходит, что всё -- это функция, в том числе и поля записи -- тоже функции доступа к данным в записи
[15:37:22] <geniepro> в охаскелле эту проблему решили введением полноценных расширяемых записей, но увы, он оказался нинужным
[15:40:48] <valexey> самое смешное, что в REPL такой ошибки нет :-)
[15:41:42] <valexey> в ghci оно просто тихо и молча переопределяет
[15:42:03] <valexey> в итоге как бы два типа рекордов есть, но у некоторых рекордов поля уже не доступны
[15:42:38] <valexey> хм. выходит в хаскеле тоже не всё ладно. жуть какая.
[15:42:57] <valexey> то есть в камле то просто вывод типов косячит, но при этом если указать тип конкретный, то всё будет норм
[15:43:26] <valexey> let session_and_status (t:heartbeat) = (t.session_id, t.status_message);;
[15:43:30] <valexey> вот так
[15:44:43] <valexey> ну и ещё там советуют рекорды по модулям распихивать. вот тогда всё хорошо.
[15:44:59] <valexey> ибо модуль тебе дает неймспаце
[15:48:43] <geniepro> ну в хаскелле тоже желательно по модулям распихивать связанные сущности
[15:49:09] <geniepro> а так, приходится давать полям уникальные имена, даже если записи в разных модулях -- код понятнее
[15:49:54] <geniepro> получается как в древней сишечке мне приходится давать префиксы именам вариантов перечислений, так и в новомодном хаскелле тоже нужны префиксы именам полей записей (( фуууу
[15:51:53] <valexey> причем ПОЛЯМ - это ж капец. полей то на порядок больше чем типов
[15:51:59] <valexey> или даже на порядки
[15:52:18] <geniepro> import Data.Time

data HeartBleed = HeartBleed
   { hb_session_id     :: String
   , hb_time           :: TimeOfDay
   , hb_status_message :: String
   }

data Logon = Logon
   { logon_session_id  :: String
   , logon_time        :: TimeOfDay
   , logon_user        :: String
   , logon_credentials :: String
   }

status_and_session t = (hb_status_message t, hb_session_id t)

session_and_status t = (hb_session_id t, hb_status_message t)

Prelude> :load "Records.hs"
[1 of 1] Compiling Main             ( Records.hs, interpreted )
Ok, modules loaded: Main.
[15:52:26] <valexey> Любой оберонец смеётся над тобой!
[15:52:49] <geniepro> ну да, недоработка, а всё идеология чистой эфпешности
[15:53:11] <geniepro> нет идеала на свете ((
[15:53:16] <valexey> не тут дело не в фп, а в пространстве имён
[15:53:38] <valexey> создавал бы рекорд новое, локальное пространство имён, проблем бы не было.
[15:57:47] <valexey> в общем, в камле правило получается простое - либо обмазываешься модулями, либо тесно связанные с типом-записью функции нужно писать сразу после объявление этого самого типа. если не хочется анотации типа рисовать.
[15:58:15] <valexey> как-то так :-)
[15:58:50] <valexey> но ещё раз - это всё кривовато выглядит. ибо в истинном Обероне не нужно никому объяснять как пользоваться подобными типами.
[15:59:03] <valexey> да и в плюсах тоже :-)
[16:06:26] <valexey> а всё из за того, что на этих языках (камло, хаскель) слишком мало пишут
[16:06:35] <valexey> следовательно на них нет больших проектов
[16:07:00] <valexey> а также на них почти никогда не программируют неграмотные дебилы которые легко могут порушить любую систему
[16:34:03] <valexey> собственно к камлу тут у меня одна притенция - когда возникает неоднозначная ситуация, то надо выкатывать ошибку компиляции, а не выбирать один из вариантов по вкусу.
[18:21:35] <TRUE> valexey> Любой оберонец смеётся над тобой!
не смеётся, а просто смотрит с грустью в глазах
[18:24:24] <TRUE> valexey> а всё из за того, что на этих языках (камло, хаскель) слишком мало пишут
не обязательно. Возможно, они просто наткнулись на какую-то штуку, которую стороннему наблюдателю не видно.
[18:25:12] <TRUE> * при разработке наткнулись на какую-то штуку
[18:26:53] <TRUE> а разве в хаскеле запись - это не кортеж?
[19:16:19] <valexey> TRUE: какими экспериментами предлагаешь это проверить? в смысле запись это тупл или нет
[19:16:48] <TRUE> я спрашиваю
[19:16:51] <TRUE> я не знаю
[19:17:29] <valexey> ну, синтаксически оно отличается
[19:17:44] <valexey> семантически тоже - в тупле доступ по позиции, в рекорде доступ по имени поля
[19:18:48] <valexey> вроде и паттернматчинг иначе идет
[19:23:47] <TRUE> на уровне компилятора к полям записи тоже обращение по смещению. Они могли доделать немного кортеж (привязать к позициям имена) и всё.
[19:24:32] <valexey> ну, технически ты же понимаешь, что всё есть памяти кусок
[19:25:10] <TRUE> просто, тогда всё, что возможно для кортежа, станет возможным для записи
[19:25:59] <TRUE> если кортеж - это функция, то его элементы, наверно, - это её параметры.
[19:26:07] <valexey> ненене, вопрос не в том как оно в памяти сидит, а в том, насколько это всё ложится на высокоуровневую семантику языка
[19:28:50] <valexey> понятно что например через Obj-модуль в камле вполне можно ходить по полям записи и даже их менять.
[19:28:56] <valexey> просто по номеру поля
[19:29:08] <TRUE> я это к чему: если элементы записи - это содержимое какой-то функции, то эти элементы не могут быть глобальными, и тогда, наверно, не будет конфликтов, примеры которых вы тут приводили
[19:29:38] <valexey> я не очень понимаю что такое содержимое функции
[19:30:45] <TRUE> если кортеж - это лямбда, то значения кортежа - это содержимое лямбды
[19:37:37] <valexey> тупл - это тип, у которого есть специфический конструктор, который используется как для конструирования новых значений этого типа, так и для паттернматчинга
[19:57:18] <valexey> блин. тварь! говно! вот ведь!
[19:57:37] <valexey> Фигня какая-то с этими неймспейсами в камле
[19:58:48] <valexey> пример:
# type color = RED | BLUE| WHITE;;
type color = RED | BLUE | WHITE        

# RED;;
- : color = RED    

# type side = RED | WHITE;;
type side = RED | WHITE         

# RED;;
- : side = RED  
[19:59:13] <valexey> то есть понятно, да? Оно МОЛЧА переопределяет часть даже тупо enum'ов
[19:59:33] <valexey> таким образом, BLUE у нас тут все еще цвет, а вот RED это уже не цвет
[19:59:39] <valexey> СУРПРАЙЗ, МАЗАФАКА!
[20:02:20] <valexey> даже в сях будет ошибка
[20:06:33] <valexey> ошибка компиляции
[20:14:05] <valexey> ну, то есть к рантайм-ошибкам это не приведет конечно (по кр. мере я не вижу как оно может привести), но к проблемам на этапе компиляции - легко.
[20:25:24] <vlad2> Так наверное никто не делает. Так же как и #define true false
[20:27:29] <valexey> ну коллизия имен же может легко случиться
[20:27:44] <valexey> особенно в большом проекте
[20:27:47] <valexey> рано или поздно
[20:30:27] <valexey> особенно если учесть, что камловый "импорт" просто засовывает в твой неймспейс содержимое всего стороннего модуля
[20:30:40] <valexey> (поэтому частенько импортов никто не делает)
[21:38:46] <TRUE> а так написать можно?
#side;;
[21:39:23] <valexey> это ж тип
[21:39:37] <valexey> а не value
[21:39:46] <valexey> так что нет, низя
[21:40:40] <valexey> всё равно что в сях написать на строчке просто
int;
[21:40:41] <TRUE> ну мало ли. Может окажется, что side - это color
[21:40:53] <valexey> не, это реально разные типы
[21:41:38] <TRUE> но это так только в REPL, да? При компиляции оно ошибку выдаёт?
[21:41:45] <valexey> не выдаёт :-)
[21:41:54] <valexey> REPL и компилятор едины
[21:43:18] <TRUE> а есть конструкция на проверку типа? Или окамл по-максимуму ограждает программиста от прикасания к типам?
[21:44:06] <valexey> $ cat main.ml
type color = RED | WHITE | BLUE

type side = RED | WHITE

let () =
let a = RED in
let b = BLUE in
a = b

[21:44:19] <valexey> $ ocamlc main.ml
File "main.ml", line 8, characters 5-6:
Error: This expression has type color but an expression was expected of type
        side

[21:44:23] <valexey> как-то так
[21:45:12] <valexey> (если чо, то в выражении a = b оператор = -- это логический оператор, типо == в плюсах)
[21:45:26] <TRUE> я так и подумал
[21:45:50] <valexey> а то let-выражения с = могут смутить
[21:45:55] <valexey> но там и == есть :-)
[21:46:01] <TRUE> ты писал
[21:46:16] <TRUE> равно - это сравнение указателей, да?
[21:46:34] <valexey> == это сравнение указателей
[21:46:39] <valexey> то есть ссылок
[21:46:50] <valexey> то есть что эти переменные ссылаются на одну и ту же ячейку памяти
[21:46:57] <TRUE> а in - это что? Разделение элементов последовательности действий?
[21:47:24] <valexey> ну тут же нет как таковой последовательности действий, тут всё тело функции - это выражение
[21:47:57] <valexey> так что in - это что типо пусть a = RED для выражения a = b
[21:47:58] <TRUE> и in разделяет подвыражения?
[21:48:12] <valexey> математическая нотация
[21:48:59] <valexey> точнее, тут так: пусть a = RED в выражении b = BLUE в выражении a = b
[21:59:44] <valexey> Ещё камла:

let find a w =
 let rec search a w i =
   if i = (Array.length a) then
     None
   else if a.(i) = w then
     Some i
   else
     search a w (i+1)
 in
 search a w 0
[22:18:39] <valexey> Кстати, рекурсивные функции там нужно помечать специально
[22:18:51] <valexey> взаимнорекурсивные - тоже специальным образом и явно оформляются.
[22:19:38] <valexey> с одной стороны, это опять таки - архаика. с другой - может быть даже и удобно.
[23:16:56] <TRUE> Это не удобно, а информативно. А что такое Some?
[23:17:40] <valexey> Конструктор алгебраического типа optional
[23:21:27] <valexey> type 'a optional = Some of 'a | None;;
[23:47:43] <valexey> информативно - это удобно :-)
[23:47:51] <valexey> то есть часто удобно. в нашем деле.