
Oleg
25.04.2018
07:33:19
просто Tree

Andrey
25.04.2018
07:34:01

Oleg
25.04.2018
07:34:12
ну нет

Google

Oleg
25.04.2018
07:35:06
возвращать какой-то типа
trait Container{
type Result
def result: Result
}и в макросах подставлять туда
type Result = String или type Result = Option[String]
соответственно возвращать можно Tree
или Expr[Container]

Aleksey
25.04.2018
07:35:35
или я не правильно понял?
похоже да. невнимательно прочитал вопрос

Andrey
25.04.2018
07:36:39

Oleg
25.04.2018
07:37:11
WeakTypeTag - это type member c
поэтому либо явно имплисит параметром, либо bundle

Andrey
25.04.2018
07:37:47
class A[T] { def foo(x: String) = macro fooImpl[T] }
вот такое хочу

Aleksey
25.04.2018
07:37:54

Google

Oleg
25.04.2018
07:38:11

Alexey
25.04.2018
07:38:23
А во второй скалке случаем не собираются сделать ограничеи, что для имлситов должны быть указаны типы эксплиситно?

Oleg
25.04.2018
07:38:31
def foo(x: String): Container = macro fooImpl

Andrey
25.04.2018
07:38:52

Oleg
25.04.2018
07:39:13
да мы поняли

Andrey
25.04.2018
07:39:38
Хотя кажется до меня начинает доходить

Oleg
25.04.2018
07:39:50
короче, если хочешь вычислять типы в компайл-тайме, тебе нужно сложить их в качестве контейнера
и не смотря на то, что тип твой объявлен как Container
компилятор в случае вайтбокса в конкретном слуае вычислит тип как
Container{type Result = Option[String]}
шейплесс построен на эксплуатации такого подхода, если хочешь ,можешь туда глянуть

Andrey
25.04.2018
07:41:41

Oleg
25.04.2018
07:42:13
т.е. если ты вызовешь
foo("2").result компилятор сможет догнать, что это Option[String] а не какая-то стёртая фигня
но если у тебя не настоящие компайл-тайм вычисления
а просто если-то
то проще сделать имплиситами

Andrey
25.04.2018
07:43:08

Oleg
25.04.2018
07:43:12
с Aux и всей это фигнёй
Поэтому например, у шейплеса есть Witness

Google

Oleg
25.04.2018
07:43:56
Просто обёртка, в которую складывается довычисленный тип
ааа нет, не можешь
вообще в большинстве случаев то, что ты хочешь сделать с константами своим макросом можно заменить на Witness.Lt
и дальше оперировать только типами

Andrey
25.04.2018
07:50:32

Eldar
25.04.2018
08:01:40
Ребят, здравствуйте. Помогите с Type Erasure. Суть проблемы: хочется уйти от создания 100500 case class'ov, для моего трейта в котором, есть поле: Any, и от этого трейта еще наследование идет.
Набросал пример: https://scalafiddle.io/sf/QPC44f6/0
Читал тут, https://medium.com/@sinisalouc/overcoming-type-erasure-in-scala-8f2422070d20
Мне вообще нормально подходит ClassTag, но что-то не получилось с ним нормально матчинг сделать.
Ах да. Суть. Сделать матчинг по типу
case x:AwesomeCaseClass[Int] =>
case x:AwesomeCaseClass[String] =>

Alex
25.04.2018
08:03:28
Что-то вроде asInstanceOf не сработает?

Alexey
25.04.2018
08:04:05
Ребят, здравствуйте. Помогите с Type Erasure. Суть проблемы: хочется уйти от создания 100500 case class'ov, для моего трейта в котором, есть поле: Any, и от этого трейта еще наследование идет.
Набросал пример: https://scalafiddle.io/sf/QPC44f6/0
Читал тут, https://medium.com/@sinisalouc/overcoming-type-erasure-in-scala-8f2422070d20
Мне вообще нормально подходит ClassTag, но что-то не получилось с ним нормально матчинг сделать.
Ах да. Суть. Сделать матчинг по типу
case x:AwesomeCaseClass[Int] =>
case x:AwesomeCaseClass[String] =>
Ты же можешь матчить тип твоего value
shit match {
case x@AwesomeCaseClass(_, _, _: Int) =>
case x@AwesomeCaseClass(_, _, _: String) =>
}

Eldar
25.04.2018
08:04:51
ну это все неприкольно, мне кажется, нормальные ребята так не матчят
да в fiddle, я привожу, что такой матчинг работает

Alex
25.04.2018
08:05:31

Alexey
25.04.2018
08:06:42
Но кажется оно тебе не надо


Eldar
25.04.2018
08:14:00
Any только для того, чтобы можно было обощить, и использовать конструкции типа val someField: List[HasValue[_]] ну если грубо..
а так типы то известны, просто делать на каждый тип свой кейс класс, как-то не комфильфо)
в общем, у меня проблемы..
есть две дочерних класса, отличаются одним полем
и вот для одного делать 10 кейс-классов из-за типов value, для второго еще 10 итого 20 классов втф(((((((((( хочется, чтобы был 1 абстрактный или трейт и всего 2 дочерних, уже нормальных кейсовых

Pavel
25.04.2018
08:19:02
(((((((((((((((((

Mikhail
25.04.2018
08:20:20

Andrey
25.04.2018
08:20:55

Google

Mikhail
25.04.2018
08:25:12
Да. Я хотел это прикрутить к Dynamic, там на этапе компиляции всё известно должно быть
а что за фичу такую делаешь? на основе чего макрос решать будет? другой модели или что? ну т.е. мне просто профит захода именно с этой стороны не очень понятен. если есть готовая модель по которой этот литерал проверяется, так почему бы сразу не сгенерировать нужный бойлерплейт под ограниченное кол-во литералов и обойтись без динамик? если модель внешняя и дергается во время исполнения макроса - тоже профит сомнительный, опять же проще генерацией кода до компиляции обойтись. просвети пожалуйста, интересно)

Andrey
25.04.2018
08:27:06
В общем, странного хотел :)

Mikhail
25.04.2018
08:28:31

Andrey
25.04.2018
08:28:47

Mikhail
25.04.2018
08:29:15

Andrey
25.04.2018
08:29:20
if (message.hasFieldName()) Some(message.getFieldName()) else None
хочу - DynamicMessage(message).field_name
(условно)

Admin
ERROR: S client not available

Mikhail
25.04.2018
08:32:04
хочу - DynamicMessage(message).field_name
и все же не понимаю профита в динамике. если ты знаешь тип месаджа и ратуешь за типобезопасность. то ведь правильнее как раз message.getFieldName() - зачем для несуществующих полей выдавать None , когда с наличием ява класса ты и так в курсе какие поля там есть, а каких нет)
просто рили интересно, может я чего-то упускаю и тут зарыт клад гиперудобства, поэтому хотелось бы прояснить)

Andrey
25.04.2018
08:32:53

Mikhail
25.04.2018
08:33:51

Andrey
25.04.2018
08:34:22

Mikhail
25.04.2018
08:35:11

Andrey
25.04.2018
08:36:50
protoc из файлика типа
message BarFoo {
optional string foo_bar = 1;
}
сгенерит что-то типа на Java
class BarFoo {
boolean hasFooBar() { ??? }
String getFooBar() { ??? }
}
Попытка обратиться к getFooBar если hasFooBar == false обернется эксепшеном

Vladislav
25.04.2018
08:42:06

Nick
25.04.2018
08:45:29
@fellrond я не могу понять, какую проблему ты решаешь?

Google

Vadim
25.04.2018
08:46:02
@fellrond посмотри вот это https://github.com/limansky/beanpuree - если не подойдет, как минимум там примеры макрсов для геттер/сеттер чепухи есть

Andrey
25.04.2018
08:46:37

Mikhail
25.04.2018
08:50:50

Andrey
25.04.2018
08:51:48
Хочу DynamicMessage(msg).foo.bar.zzz возвращающий Option[zzz.type]

M
25.04.2018
08:52:53
нету там нулов в протобафе
открой нагенеренный класс
для опшена там None
дефолт

Andrey
25.04.2018
08:53:59
Ещё хуже :)

M
25.04.2018
08:54:16
lastSent: scala.Option[com.google.protobuf.timestamp.Timestamp] = None,

Andrey
25.04.2018
08:54:32

M
25.04.2018
08:54:36
fuf
ага

Andrey
25.04.2018
08:54:40
ну дык
я про protoc-java

M
25.04.2018
08:55:08
а
тогда есть
:D

Mikhail
25.04.2018
08:55:40