
Toha
13.09.2018
11:57:10
Когда мне нужно передать какую то структуру в канал, я пишу chan <- myStructInstance

Pavel
13.09.2018
11:58:24
Там есть вообще immutable ?

Toha
13.09.2018
11:58:55
а я не знаю :)
https://github.com/nolka/gooffroadmaster/blob/master/mvc/controllers/track_converter.go#L97

Google

Toha
13.09.2018
11:59:52
вот пример как я на каналах делал отправку ответов ботом в террограм)

Karbin
13.09.2018
12:01:19
immutable тоже tls. может ограничение связано с этим?
в go есть tls? если нет, то логично что в каналах можно передавать переменные любых потоков

Pavel
13.09.2018
12:18:51

Karbin
13.09.2018
12:20:19
да

Dmitry
13.09.2018
12:20:25
оффтоп: Vue Element рулят! Я в полном восторге от них!

Karbin
13.09.2018
12:20:38
и не похоже на проблему. скорее так специально сделали

Toha
13.09.2018
12:22:42

Dmitry
13.09.2018
12:23:53
сейчас исходник кину. Краткая суть. Там шина Vuex, кастомный компонент и в нем уже используется Vue Element
В хроме нужно захостить все через плагин http сервера

Pavel
13.09.2018
12:25:01
и не похоже на проблему. скорее так специально сделали
Я смотрел исходники receiveOnly(T...)(T args) и там как раз похоже на проблему. Сначала создается Tuple!(T) t а потом присваиваются поля t = T.fields как-то так. Но поскольку T уже есть иммтуабельная структура то ничего нельзя ей присвоить.
Пусть даже они и TLS, ведь очень логично же копировать структуру в новую чтобы передавать между тредами, а старую структуру не менять. Я собственно этого и добивался.

Karbin
13.09.2018
12:28:19
tls то просто так их не скопировать между потоками

Google

Pavel
13.09.2018
12:28:48
Технически может и да, не знаю, но иммутабельность ровно для этого и придумана )

Karbin
13.09.2018
12:30:17
да, но immatable всё равно живёт в своём tls блоке
похоже баг. есть подобное с AA
https://issues.dlang.org/show_bug.cgi?id=13930
пиши в багзиллу. может поправят

Pavel
13.09.2018
12:41:10
Reported: 2015-01-04 02:44 UTC by Martin Nowak
Status: NEW
может поправят
БЕЗЫСХОДНОСТЬ
Более реалистично - я сяду и напишу свою реализацию receiveOnly )

Karbin
13.09.2018
12:42:41
ну или так

Pavel
13.09.2018
12:44:01
Но там все очень низкоуровнево, я не знаю как исхитриться и работать с иммутабельным как с мутабельным. Может можно всякие фокусы в compile time сделать, навроде сначала снять атрибут immutable, заполнить структуру, одеть атрибут обратно.
А кто-то знает как работает cast(immutable) ?Что вообще происходит внутри

Karbin
13.09.2018
12:47:57
надо в компилятор лезть

Oleg
13.09.2018
13:23:20
просто кастуешь и меняешь

Pavel
13.09.2018
13:24:00
Да походу проще всего скастовать после получения и не париться

Oleg
13.09.2018
13:36:24
так надёжней)

Pavel
13.09.2018
13:43:49
Ну структура по-любому скопируется
Но передавать указатель на immutable shared структуру тоже надежно, не надо беспокоиться что кто-то может поменять.

Oleg
13.09.2018
14:57:27

Karbin
13.09.2018
15:08:52
на офф. форуме тоже писали что для передачи immutable shared не нужен

Oleg
13.09.2018
15:09:50
кстати, с днём программиста всех)

Google

Karbin
13.09.2018
15:10:18
с днём программиста

Ackeard
13.09.2018
15:56:28
https://sun1-14.userapi.com/c635106/v635106857/5657b/OrfxGEMJRzk.jpg

Karbin
13.09.2018
16:13:29
это точно

Ievgenii
13.09.2018
16:28:58
Нет идеала, везде будут исключения и какие-то компромиссы. Не нужно все делить на чёрное и белое, всегда было, есть и будет серое. Так что будет код, который компромиссный, и это не всегда костыли, а просто необходимость на тот момент.
Лично мне Ди нравится тем, что эти компромиссы ярко выражены и их не скрывают, а честно пытаются исправлять и избавляться от от них. Да, из-за этого страдает обратная совместимость, но одни кричат, что это плохо, другие же кричат, что неконсистеннтно, потому, что устарело или "не верно".
Разработчики Ди не боятся улучшать и развивать язык и компилятор! И, имхо, это круто! Если не нравится, никто не мешает зафиксировать версию компилятора и это указать в ридми. Так что хватит ныть и сопли по лицу размазывать, а берите яйца в кулак и вперёд писать проекты!


Pavel
13.09.2018
16:37:39
В ди столько компромиссов что писать проекты просто нереально
Тратишь все время на борьбу с компромиссами
И фиксировать версию компилятора тоже не вариант т.к. тогда компромиссов будет еще больше чем в новых версиях

Igor
13.09.2018
16:40:05
Я думаю что если приходится прикладывать много борьбы значит логика языка не совпадает с логикой выбранного решения. У меня такое бывает часто, я просто переписываю тогда большими кусками

Ievgenii
13.09.2018
16:41:20
Желательно несколько

Pavel
13.09.2018
16:41:52
А мне предлагают костыли обычно )

Ievgenii
13.09.2018
16:42:11
Давай сейчас
Пример

Pavel
13.09.2018
16:42:20
Я сегодня только вот кидал

Ievgenii
13.09.2018
16:42:31
Про неизменяемую структуру?

Pavel
13.09.2018
16:42:36
Причем когда я не пишу - это не значит что у меня все гладко разрабатывается, это значит что я пишу на C# :D

Ievgenii
13.09.2018
16:43:03
Да.
Ну так зачем тебе не изменяемая структура?

Pavel
13.09.2018
16:43:42
Блин, ну чтобы ее не изменяли :)

Google

Ievgenii
13.09.2018
16:43:48
Я вот, на пример, на С# не могу сделать так:
Class class {}
Может и можно, честно говоря не знаю наверняка, но думаю не могу
Тут вопрос: зачем?
Тебе тоже не мешает объявить неизменяемой именно переменную, а не сам тип
Но это лирика

Pavel
13.09.2018
16:45:09
Тут вопрос: зачем?
Ответ в моем случае очевиден, все значют что такое иммтуабельность и зачем она нужна. И почему именно из-за нее набрал популярность функциональный подход в программировании.

Ievgenii
13.09.2018
16:45:22
Возможно это недочёт документации или реализации.

Pavel
13.09.2018
16:47:22
Чтобы всегда в любом месте программы знать что эта структура иммутабельна и не париться из-за этого

Admin
ERROR: S client not available

Pavel
13.09.2018
16:47:53
В этом же и состоит увеличение эффективности разработки. Мне нужно держать в голове меньше особенностей и я могу сконцентрироваться на бизнес логике.
Это же абсолютно очевидная штука - обмен иммутабельными сообщениями. Не знаю как это можно ставить под вопрос :)

Igor
13.09.2018
16:48:45
А можешь в run.dkang.io написать полный пример который не работает?

Pavel
13.09.2018
16:49:39
https://run.dlang.io/is/9o3ebQ вот такое вот супердно )
Буду помечать такие сообщения тегом #dsuxx

Ievgenii
13.09.2018
16:50:35
Честно, не понимаю необходимости такого подхода
Это же блокирующее общение между потоками
В чем тогда смысл это делать в отдельном потоке?

Pavel
13.09.2018
16:51:07
В каком месте оно блокирующее?

Ievgenii
13.09.2018
16:51:20
Чисто для тогобы отделить от общих данных?

Google

Pavel
13.09.2018
16:51:29
структура кладется в очередь треда, ничего не блокируется.

Ievgenii
13.09.2018
16:51:36
Пока не получишь ответ, поток не работает дальше
Я о потоке, который принимает

Pavel
13.09.2018
16:52:28

Ievgenii
13.09.2018
16:52:46

Pavel
13.09.2018
16:52:50
А блокируется Task, ну она и должна ждать пока ей придет сообщение.

Ievgenii
13.09.2018
16:53:04

Pavel
13.09.2018
16:53:13
Task это не тред

Ievgenii
13.09.2018
16:53:17
Просто это пул тредов, наверное

Pavel
13.09.2018
16:53:31
Это враппер на Fiber
Много Task могут выполняться в одном треде и ничего не блокировать, в этом и есть суть vibe-core

Ievgenii
13.09.2018
16:54:13
https://dlang.org/phobos/std_parallelism.html#.Task
Это?

Pavel
13.09.2018
16:54:54

Ievgenii
13.09.2018
16:55:11
И тогда явно там используется не нативная функция ресив

Igor
13.09.2018
16:55:49
Не за нотиуом, посмотрю позже

Pavel
13.09.2018
16:56:15
Ну Людвиг где то писал что встроенные функции std.concurrency.receiveOnly нормально работают с его тасками
Раньше он делал какие то костыли, а потом переписал так что все из коробки работает

Ievgenii
13.09.2018
16:56:44
Хм...
Мало мне в это верится, но ладно
https://dlang.org/library/std/concurrency/receive.html
Receive a message from another thread, or block if no messages of the specified types are available.
А ресивОнли, мне кажется, всего обёртка над простым ресивом