@scala_ru

Страница 922 из 1499
Wystan
05.09.2017
16:51:09
ну хип же не задашь отдельно; я написал sbt compile "gatling:test" -J-Xmx2G -J-Xss2M

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

Nick
05.09.2017
16:52:21
Xss стек и задает

прост ты не дописал параметры, я тебе про эт и написал

Google
Nick
05.09.2017
16:53:11
вообще это бывает довольно часто, так что не парься и прост Xss оставь

ох, doobie уже M6

круто

Mikhail
05.09.2017
17:39:17
кто-нибудь пробовал выводить импилиситы в макросах? c.inferImplicitValue ? интересует вывод имплисита внутри тела метода (defdef). Проблема в том, что для метода и для всех поддеревьев один позишин выдает, а мне нужен позишин изнутри именно, чтобы вывод с учетом параметров метода произошел(

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

конечно если кейс классы на 50 полей, то сложновато будет
Можно кстати макро-аннотацию сделать, которая сама будет для входящего кейс класса перебирать енкодеры по полям и выдавать на каком поле спотыкается)

Nikolay
05.09.2017
19:16:44
да, была такая идея

а если структуры данных сильно вложенные, это получится сделать теми средствами, что мета предоставляет сейчас?

Aleksey
05.09.2017
19:20:28
Котоны, есть техника для написания асинхронного кода в синхронном, императивном стиле, помогите вспомнить название. Суть в том, что внутри некого блока любой вызов бросает исключение и уходит выполяться в тредпул. По выполнению блок начинает выполняться заново, но вызов вместо исключения вернет вычисленное значение. Я видел такое на Ocaml много лет назад, вчера что-то вспомнилось и захотелось найти реализацию для Scala.

Mikhail
05.09.2017
19:23:12
а если структуры данных сильно вложенные, это получится сделать теми средствами, что мета предоставляет сейчас?
нет. мета вобще не в тему. она только для трансформации аст и генерации кода. макросом же ты можешь прям проверять вывод имплиситов и все остальное связанное с типами

Котоны, есть техника для написания асинхронного кода в синхронном, императивном стиле, помогите вспомнить название. Суть в том, что внутри некого блока любой вызов бросает исключение и уходит выполяться в тредпул. По выполнению блок начинает выполняться заново, но вызов вместо исключения вернет вычисленное значение. Я видел такое на Ocaml много лет назад, вчера что-то вспомнилось и захотелось найти реализацию для Scala.
эм. для этого придется довольно серьезно аст дерево трансормировать и обладать знаниями о внутрянке, что там кидается исключение и я думаю, что на исключениях это будет крайне затруднительно. самое ближайшее - это то как делают в жиэс с асинком. в скале видел какую-то либу которая на такой же манер аст меняет. поищи на гитхабе scala async

Nick
05.09.2017
19:28:01
Это явно не про await async

Google
Nick
05.09.2017
19:28:08
И корутинки

Я вообще о таком впервые слышу

Mikhail
05.09.2017
19:29:52
Это явно не про await async
эвейт асинк - не ждет выполнение, а меняет аст дерево таким образом, как будто ты сам руками писал код for { result <- future result2 <- future2 } yield xunya-munya это не совсем то, о чем Фомкин говорит, но смысл тот же

Mikhail
05.09.2017
19:33:39
@fomkin ты же семантику эвейт-асинк жиэсную имел ввиду? Потому что единственная альтернатива на жвм, без трансформации аст в Future[], мне видится - while (not ready){ lock.wait } , что естественно никак не годится для масштабных действий)

Aleksey
05.09.2017
19:38:32
@fomkin ты же семантику эвейт-асинк жиэсную имел ввиду? Потому что единственная альтернатива на жвм, без трансформации аст в Future[], мне видится - while (not ready){ lock.wait } , что естественно никак не годится для масштабных действий)
Да, синтасически похоже на асинк-эвейт, но реалиция не через флэлмапы, а через сброс стэка. Доходим до эффекта (читай любого вызова), сбрасываем кол-стэк через исключение, асинхронно дожидаемся выполнения, перезапускаем блок.

Daniel
05.09.2017
19:39:15
как ты стек вернешь потом?

Aleksey
05.09.2017
19:39:53
как ты стек вернешь потом?
заново наберу. результаты вызовов мемоизируются в контексте блока.

Nick
05.09.2017
19:39:53
А он нужен?

В общем асинк эвеит так и делает

Mikhail
05.09.2017
19:40:18
Да, синтасически похоже на асинк-эвейт, но реалиция не через флэлмапы, а через сброс стэка. Доходим до эффекта (читай любого вызова), сбрасываем кол-стэк через исключение, асинхронно дожидаемся выполнения, перезапускаем блок.
это понятно, но что-то я сомневаюсь, что на жвм можно это даже на уровне байткода зафигачить и даже если можно - будет крайне тяжко и возможно не без последствий

Daniel
05.09.2017
19:40:41
конечно нужен, тебе же нужно вернуться в прошлый контекст

Mikhail
05.09.2017
19:40:56
заново наберу. результаты вызовов мемоизируются в контексте блока.
зачем им мемоизация, когда проще весь стек и позицию исполнения сохранить)

Mikhail
05.09.2017
19:41:13
Nick
05.09.2017
19:41:42
Там нет возвращения в него , эт прост сахар вроде как, по факту все в другом потоке будет

Mikhail
05.09.2017
19:41:48
В общем асинк эвеит так и делает
асинк эвейт не так делает. он меняет результат на футурку - не путай

Aleksey
05.09.2017
19:42:07
в общем мне просто название хочется вспомнить.

Nick
05.09.2017
19:42:19
http://docs.paralleluniverse.co/quasar/

Google
Mikhail
05.09.2017
19:44:29
в общем мне просто название хочется вспомнить.
в гугле какой-то lwt вылезает, но это наверное не то) я в окамле ни в зуб ногой) http://ocsigen.org/lwt/3.1.0/manual/

Nick
05.09.2017
19:44:31
Mikhail
05.09.2017
19:45:36
Где эт противоречит сказанному мной кстати)
чтобы ответить на этот вопрос, стоит уточнить на что ты ответил "В общем асинк эвеит так и делает", а то вдруг не на то, что подумал)

hohserg
05.09.2017
19:46:46
Всем ку

Mikhail
05.09.2017
19:48:38
http://docs.paralleluniverse.co/quasar/
надо смотреть как именно они там и что делают. в скале кстате помню была фича такая - continuations называлась, забавная была ерунда)

Aleksey
05.09.2017
19:48:51
Nick
05.09.2017
19:49:49
Хз чем кончилось

Всем ку
Сразу скажу, что ты делаешь дичь.

Исходя из инфы в скайпе

Mikhail
05.09.2017
19:51:13
Хз чем кончилось
если ты про континуации, то врятли чем-то хорошим может закончиться). логику континуаций чуть сложнее хелоуворда становится невыносимо читать)

Aleksey
05.09.2017
19:51:43
в гугле какой-то lwt вылезает, но это наверное не то) я в окамле ни в зуб ногой) http://ocsigen.org/lwt/3.1.0/manual/
Да, что-то такое всплывает в памяти. Посмотрю, может быть это и есть оно

Mikhail
05.09.2017
19:52:30
Все там ок было
на уровне компилятора - да. но на уровне человека - мозг наизнанку может вывернуть

reset { shift { k: (Int=>Int) => k(k(k(7))) } + 1 } * 2 // result 20 интуитивненько же)

def foo() = { 1 + shift(k => k(k(k(7)))) } def bar() = { foo() * 2 } def baz() = { reset(bar()) } baz() // result 70 вот это вобще огонь прям)

Nikolay
05.09.2017
19:55:52
Сразу скажу, что ты делаешь дичь.
сейчас тоже дичь происходит)

Mikhail
05.09.2017
19:57:24
hohserg ващет можно) def test[T: ClassTag]:T = implicitly[ClassTag[T]].runtimeClass.newInstance

Google
Nikolay
05.09.2017
19:58:15
а что там было?

hohserg
05.09.2017
19:58:35
Мне требуется сериализовывать разные сложные объеты, их типы примерно такие: HashMap[String, Map[Int,Int]]. Значений у меня несколько, у каждого свой тип, но все их мне нужно сериализовать и сохранить/загрузить на/с диска. Я написал функцию, которая принимает значение для сохранения и путь. —--Лирическое отступление--- Еще я столкнулся с затиранием типов, но не сразу понял. Например, до изменения кода у меня было HashMap[String, Set[Int]], но после рефакторинга я сделал обертку для Set[Int] и получилось HashMap[String, ItemDamageSet], когда мапа загрузилась с диска - она хранила Set[Int] и при чтении не возникало исключения, но оно возникло когда программа пыталась обработать Set[Int] как ItemDamageSet. Поэтому я попробовал юзать ClassTag и TypeTag(пока не тестировал, т.к. мне нужно new T(), а это не дает делать) —------ Функция загрузки выглядит так: https://pastebin.com/41HcY2Vj

Заранее спасибо за помощь

Igor
05.09.2017
19:59:25
дикий бот)

Daniel
05.09.2017
20:00:59
надо исключения впилить, ишью вроде даж есть

Mikhail
05.09.2017
20:01:03
Мне требуется сериализовывать разные сложные объеты, их типы примерно такие: HashMap[String, Map[Int,Int]]. Значений у меня несколько, у каждого свой тип, но все их мне нужно сериализовать и сохранить/загрузить на/с диска. Я написал функцию, которая принимает значение для сохранения и путь. —--Лирическое отступление--- Еще я столкнулся с затиранием типов, но не сразу понял. Например, до изменения кода у меня было HashMap[String, Set[Int]], но после рефакторинга я сделал обертку для Set[Int] и получилось HashMap[String, ItemDamageSet], когда мапа загрузилась с диска - она хранила Set[Int] и при чтении не возникало исключения, но оно возникло когда программа пыталась обработать Set[Int] как ItemDamageSet. Поэтому я попробовал юзать ClassTag и TypeTag(пока не тестировал, т.к. мне нужно new T(), а это не дает делать) —------ Функция загрузки выглядит так: https://pastebin.com/41HcY2Vj
самое простое и дикое - Serializable - оно вроде и типы все восстановит как надо. Но это прям вобще дичь) Сериализуй в жисонку и пихай туда сюда. Если нет понимания платформы, то жисон хотя бы позволит читабельные данные сохранить и что-то с ними сделать, преобразовать - если напортачишь

hohserg
05.09.2017
20:05:29
"самое простое и дикое - Serializable - оно вроде и типы все восстановит как надо." А можно подробнее? ItemDamageSetнаследует Serializable, если че. Дело то в том, что на стадии выполнения нет отличия между A[B] и A[C], а это мне нужно во время загрузки с диска. Пока данные используются тестовые - их не жалко и их не много, чтобы воостановить в нужном виде. С json хорошая идея вообще.

Mikhail
05.09.2017
20:07:51
"самое простое и дикое - Serializable - оно вроде и типы все восстановит как надо." А можно подробнее? ItemDamageSetнаследует Serializable, если че. Дело то в том, что на стадии выполнения нет отличия между A[B] и A[C], а это мне нужно во время загрузки с диска. Пока данные используются тестовые - их не жалко и их не много, чтобы воостановить в нужном виде. С json хорошая идея вообще.
нет отличия между A[B] и A[C] - это не совсем так. данные внутри контейнеров все равно со всеми необходимыми метками. т.е. оно просто тебе потом восстановит в A[Object] ( если это не массив-примитивов был), но в памяти то, что было B так и восстановится как B

hohserg
05.09.2017
20:10:07
Да, но в A[B] можно засунуть C в рантайме и это останется незамеченным до поры-до времени

Mikhail
05.09.2017
20:10:49
Да, но в A[B] можно засунуть C в рантайме и это останется незамеченным до поры-до времени
умеючи можно и без сериализации такое сделать в рантайме, да еще и обратно достать как ни в чем ни бывало и работать дальше будет

hohserg
05.09.2017
20:15:54
Ну так у меня эти A и C не лежат на одной цепочке наследования и возникает ClassCastException, но не на стадии загрузки, а когда пытается юзать загруженные данные. Ну да ладно, это не основная проблема и решается крепкой памятью. А основная проблема в том, что у мне нужна универсальная функция, принимающая пут до файла и возвращающая загруженную из файла структуру... Сейчас до меня дошло, что у меня все значения - это HashMap, и, кажется, затирание типов туту будет на руку: всместо new T() делать new HashMap[Any,Any]()

Еще вопрос: можно писать что-то вроде def a[T: ClassTag](...)={...} Где подробнее почитать о таком синтаксисе?

Mikhail
05.09.2017
20:24:46
Nick
05.09.2017
20:25:28
а в чем проблем сохранить HashMap просто как массив из пар ключ значение?

можно тупо строкой

hohserg
05.09.2017
20:25:38
Ну да, сахар. А свои типы как нужно оформлять, чтобы юзать как ClassTag?

Nick, не понял.

Mikhail
05.09.2017
20:26:33
Ну да, сахар. А свои типы как нужно оформлять, чтобы юзать как ClassTag?
как контейнер параметризованный одним типом trait|class My[T(или любая другая буква)]

Nick
05.09.2017
20:26:45
или проблема с десериализации?

hohserg
05.09.2017
20:26:45
В скайпе ответили, что это context bounds - про сахар

Google
hohserg
05.09.2017
20:26:51
десериализаций

Nick
05.09.2017
20:27:16
возьми protobuf

Mikhail
05.09.2017
20:27:56
hohserg
05.09.2017
20:28:58
Nick, он типы сохраняет полностью? Если я запишу A[B] в файл, а потом попытаюсь прочитать A[C] - он выдаст исключение при чтении?

hohserg
05.09.2017
20:29:46
Хорошо ,попробую его

Nick
05.09.2017
20:30:36
можешь по тупому сделать match по классу и сохранять Int и потом из него восстанавливать

а вообще тебе Михаил правильно сказал про json

можно взять circe с автоматической деривацией

он все сам сделает

Mikhail
05.09.2017
20:31:33
как контейнер параметризованный одним типом trait|class My[T(или любая другая буква)]
кстати говоря система типов в скале позволяет делать трюки типа trait My[T1, T2] type MySingle[T] = My[SomeConcreteType, T] def test[T: MySingle]

Mikhail
05.09.2017
20:33:00
начитался котов ?
не, вобще их не открывал. мне в суперквантах так пришлось сделать

Nick
05.09.2017
20:33:14
ну в котах так любят делать, везде

Nick
05.09.2017
20:33:37
MySingle эт просто уточненный тип

Страница 922 из 1499