@scala_ru

Страница 1433 из 1499
Oleg
25.04.2018
07:33:19
просто Tree

Andrey
25.04.2018
07:34:01
просто Tree
Возвращать Tree?

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
или я не правильно понял?

похоже да. невнимательно прочитал вопрос

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
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
class A[T] { def foo(x: String) = macro fooImpl[T] }
T здесь - это не тип возвращаемого значения, а тип, с объявлениями которого работаем в макро

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

Andrey
25.04.2018
07:39:38
def foo(x: String): Container = macro fooImpl
Так. А с контейнером этим потом как дальше жить?

Хотя кажется до меня начинает доходить

Oleg
25.04.2018
07:39:50
короче, если хочешь вычислять типы в компайл-тайме, тебе нужно сложить их в качестве контейнера

и не смотря на то, что тип твой объявлен как Container

компилятор в случае вайтбокса в конкретном слуае вычислит тип как Container{type Result = Option[String]}

шейплесс построен на эксплуатации такого подхода, если хочешь ,можешь туда глянуть

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

но если у тебя не настоящие компайл-тайм вычисления

а просто если-то

то проще сделать имплиситами

Oleg
25.04.2018
07:43:12
с Aux и всей это фигнёй

так, а если без .result - можно как-то?
нет, обязательно нужна обёртка, которую ты можешь уточнить в whitebox

Поэтому например, у шейплеса есть Witness

Google
Oleg
25.04.2018
07:43:56
Просто обёртка, в которую складывается довычисленный тип

так, а если без .result - можно как-то?
можешь сделать макро-материализацию

ааа нет, не можешь

вообще в большинстве случаев то, что ты хочешь сделать с константами своим макросом можно заменить на Witness.Lt

и дальше оперировать только типами

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 не сработает?

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

да в fiddle, я привожу, что такой матчинг работает

Alex
25.04.2018
08:05:31
ну это все неприкольно, мне кажется, нормальные ребята так не матчят
Так матчи так, шоб это работало и читалось, а не было рокет сайенсом ?

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
а тебя устраивает то, что это все только к компайл тайм литералам относится?
Да. Я хотел это прикрутить к Dynamic, там на этапе компиляции всё известно должно быть

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

Mikhail
25.04.2018
08:28:31
В общем, странного хотел :)
да уж. очень странного. проще имплисит опс javaOptional.toOption )

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 , когда с наличием ява класса ты и так в курсе какие поля там есть, а каких нет)

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

Mikhail
25.04.2018
08:33:51
бойлерплейт спилить. Когда у тебя 5 вложенных мессаджей и ты пытаешься использовать java обертку - вот эти все has-get очень утомляют
зачем самому использовать hasFieldName() ? это какая-то динамическая мапа? если нет, то зачем этот метод тебе вобще вызывать?

Mikhail
25.04.2018
08:35:11
Так. Ты работал с протобафом раньше? :)
нет, но ты можешь ткнуть в какой-нибудь тутор с ява кодом где показана эта боль с hasFieldName() )

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
@fellrond я не могу понять, какую проблему ты решаешь?
Академический интерес, говорю же :)

на самом деле вернет дефолтное значение
Ну, да. Для optional Message это будет null :)

Mikhail
25.04.2018
08:50:50
Ну, да. Для optional Message это будет null :)
а что в нем плохого? Option(null) и вперед)

Andrey
25.04.2018
08:51:48
а что в нем плохого? Option(null) и вперед)
Option(msg.getFoo()).flatMap(f => Option(f.getBar)).flatMap(b => Option(b.getZzz()).flatMap…

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

M
25.04.2018
08:52:53
нету там нулов в протобафе

открой нагенеренный класс

для опшена там None

дефолт

Andrey
25.04.2018
08:53:59
открой нагенеренный класс
Кстати да, с какой-то версии не null. DefaultInstance

Ещё хуже :)

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
Хочу DynamicMessage(msg).foo.bar.zzz возвращающий Option[zzz.type]
вот. наконец то дошли до реальной боли) однако, давай продолжим. DynamicMessage(msg).foo - должен вернуть Option[Foo] или DynamicMessage[Foo] ?

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