Size: a a a

2021 June 01

f

for(int c; (c = getc... in ru.nim.talks
основная идея в том что requiresinit невозможно остановить после того как оно попало в код - все пользователи твоего кода будут обязаны плясать вокруг инициализации, mapIt И все шаблоны которым нужно получить тип выражения), collect перестают работать
источник

f

for(int c; (c = getc... in ru.nim.talks
Мне кажется тут сам тип стал requiresinit, не конкретное поле
источник

f

for(int c; (c = getc... in ru.nim.talks
Хотя это вообще бред какой-то если честно. Тогда можно сделать push своего макроса который делает это для полей, но это костыли на костылях
источник

f

for(int c; (c = getc... in ru.nim.talks
Нет, вообще игнорируется

{.push requiresinit.}

type A = object

var a: A
источник

f

for(int c; (c = getc... in ru.nim.talks
Судя по всему это нельзя сделать -

import std/macros
macro reqi(a: untyped): untyped = echo a.treeRepr()

{.push reqi.}

type
 A = object
   f: string

var a: A



/usercode/in.nim(3, 7) Hint: 'reqi' is declared but not used [XDeclaredButNotUsed] (т.е. ни разу не использовано, и ничего не печатало при работе), при попытке приписать свою прагму на поле дает ошибку /usercode/in.nim(4, 8) Error: invalid pragma: reqi
источник

G

Gabben in ru.nim.talks
push только на процедуры вешает
источник

G

Gabben in ru.nim.talks
что с одной стороны раздражает, а с другой прагмы у типов почти ничего не могут
источник

g

gavr in ru.nim.talks
ну кроме реквайр инит
источник

f

for(int c; (c = getc... in ru.nim.talks
если опустить спорность утверждения что "ничего не могут" (все сравнительно), то остаются еще кастомные прагмы которые на объекты как раз вешают все кому не лень
источник

G

Gabben in ru.nim.talks
думаешь сделать какой нибудь {.derive(Serialize).}, впихнуть его перед type нельзя, остается только к типу, но из такой прагмы ты не можешь вернуть например список новых функций
источник

f

for(int c; (c = getc... in ru.nim.talks
Я в конечном итоге это решил через template аннотации и

proc loadXml*[T: not enum](reader: var HXmlParser, obj: var T, tag: string) =
 mixin loadXml
 genXmlLoader(T, obj, reader, tag)


Где genXmlLoader получает все через тип обхекта (typedesc)
источник

f

for(int c; (c = getc... in ru.nim.talks
На самом объекте не пишутся derive, но какие-то поля можно поментить через .Attr. и  так далее
источник

f

for(int c; (c = getc... in ru.nim.talks
И потом в реализации genXmlLoader уже такая логика


  for field in iterateFields(impl):
   if not(field.isExported) or
      field.isMarkedWith("Skip", "IO") or
      field.name in ignored:
     discard
источник

f

for(int c; (c = getc... in ru.nim.talks
но на объекте не видно что он реализует Serialize, и это плохо
источник

G

Gabben in ru.nim.talks
получается, что реализацией необходимых процедур должна озаботиться сама функция, а не её вызывающий?
источник

f

for(int c; (c = getc... in ru.nim.talks
Не совсем понял, но кажется да. Пользователь не делает ничего - просто вызывает сериализатор на своем типе и оно работает. Если нужны какие-то дополнительные рычаги управления то тогда можно использовать .Attr. и так далее
источник

f

for(int c; (c = getc... in ru.nim.talks
Я хочу в последствии требовать в явном виде писать XmlLoader в прагме для типа и выдавать ошибку если этого нет, просто потомучто я не очень люблю совершенно неявный кодоген
источник

G

Gabben in ru.nim.talks
В таком варианте концепты выглядят бесполезно
Можешь кинуть ссылку про .Attr., впервые вижу?
источник

f

for(int c; (c = getc... in ru.nim.talks
Это мой аттрибут для сериализации,
источник

G

Gabben in ru.nim.talks
а, ну я в своем десерте также через них регулирую
и сначала тоже заставлял вешать на тип {.des, ser.}, потом решил перейти на концепты, а они не работают, и уже месяц ничего не делаю
источник