
Dmitry
15.09.2016
13:26:25
не компилится

Oleg
15.09.2016
13:26:58

Dmitry
15.09.2016
13:27:33
так, а надо так т.к. это ключевое слово или как понять что именно так вывается?

Google

Oleg
15.09.2016
13:27:39
поворот сейчас для меня в этом был
import std.stdio;
string attr = "ok";
void foo()
{
@attr int k;
writeln( __traits(getAttributes,k) );
}
void main()
{
foo();
attr = "42";
foo();
}
выводит
ok
42
тоесть UDA могут менять значения в runtime
я не знаю как это понять
и __traits и getAttributes — ключевые слова, но второе, кажется, контекстное
да, контесто-зависимый синтаксис

Dmitry
15.09.2016
13:29:56
контекстное — определено втнутри __traits ?

Oleg
15.09.2016
13:30:03
ну типа да...
вне __traits ты можешь использовать getAttributes как хочешь (название метода, поля и тд)

Anatoly
15.09.2016
13:31:41
да, UDA не только компилтайм

Dmitry
15.09.2016
13:31:52
Вообще ничего не выводит:
void main()
{
foo();
}
string MyAtr;
void foo()
{
@MyAtr int name;
writeln(__traits(getAttributes, name));
}

Anatoly
15.09.2016
13:32:48
а что должно вывести?

Dmitry
15.09.2016
13:33:04
а походу надо:
string MyAtr = "some value";

Google

Dmitry
15.09.2016
13:34:25
так, а чтобы на этапе компиляции проверить значение переменной нужно static if использовать?

Oleg
15.09.2016
13:35:21
а в основном это не переменные))
а константы

Dmitry
15.09.2016
13:37:18
я как-то уже спрашивал. Но так до конца и не получил ответ. Можно ли проверять значение строки во время компиляции и если строка "Вася" то для нее вызывать
writeln простой а если "Маша" то его аналог cwriteln().color(Green).
или как-то так?

Oleg
15.09.2016
13:37:58
конечно можно, но не той строки, которую ты получишь во время runtime

Dmitry
15.09.2016
13:45:50
так. правильно ли я понимаю, что вот допустим я создаю два атрибута:
string good = "good";
string bad = "bar";
и могу их теперь на функции и переменные вешать. И потом делать проверку если атрибут good то ...

Oleg
15.09.2016
13:47:43
ну да

Dmitry
15.09.2016
13:49:10
м... э... щас задачу сам себе придумываю. Обойти все методы в классе и вызывать только те которые как good объявлены. Норм?

Oleg
15.09.2016
13:50:00
при этом ты можешь сделать не good и bad имена переменных, а другие
и поочерёдно присваивать им значения good и bad

Dmitry
15.09.2016
13:50:29
только вот у Али написано что есть такой атрибут как hasUDA (или как его назвать то? Метод?) а в доках я его не вижу
Вот у него как:
import std.traits;
// ...
static assert(hasUDA!(Person.name, Encrypted));

Oleg
15.09.2016
13:51:08
новая тема, когда я ту статью писал, не было такого

Dmitry
15.09.2016
13:51:08
https://dlang.org/spec/traits.html

Oleg
15.09.2016
13:53:55
https://dlang.org/phobos/std_traits.html#.hasUDA

Dmitry
15.09.2016
13:54:21
в спецификации забыли про него?
по ссылке выше

Oleg
15.09.2016
13:54:34
это phobos

Google

Oleg
15.09.2016
13:54:42
это не язык
всмысле это стандрартная библиотека и в спеке языка не описывается она

Dmitry
15.09.2016
13:55:10
я постоянно путаю где заканчивается язык и начинается Фобос

Oleg
15.09.2016
13:55:28
грани в некоторых местах размыты

Dmitry
15.09.2016
13:56:08
а ты вот сходу понял что это ? или просто логическая цепочка какая?
я посмотрел и не понял

Grigirii
15.09.2016
13:57:47
на тему полезности UDA можно посмотреть в сторону сериализаторов http://vibed.org/api/vibe.data.serialization/optional и автогенераторов http://vibed.org/api/vibe.web.rest/registerRestInterface
чтобы понять лучше всего попробовать придумать самому, как решить эту задачу, собрать все грабли и только потом будет понятно зачем всё это придумано. пока ручками замучаешься сериализаторы писать это выглядит излишне сложным

Dmitry
15.09.2016
14:03:38
почему false то получается?
и в чем отличие __traits от std.traits ?

Anatoly
15.09.2016
14:04:38
фигасе вопрос)

Grigirii
15.09.2016
14:04:53
первое - язык, второе стандартная библиотека использующая язык

Oleg
15.09.2016
14:05:25
нужно проверять не значение а переменную, судя по документации
hasUDA!(foo, good)

Dmitry
15.09.2016
14:05:49
тоесть либа просто __traits вызывает где-то внутри?
а...

Oleg
15.09.2016
14:06:05

Grigirii
15.09.2016
14:06:05
в основном да, либо делает это другими способами

Oleg
15.09.2016
14:06:25

Google

Dmitry
15.09.2016
14:06:49
Хотя погоди, почеу не значение а переменную? В доке же написано:
static assert(hasUDA!(a, "alpha"));
т.е. явно значение проверяется

Oleg
15.09.2016
14:07:53
явно проверяется наличие строкового атрибута
он задаётся в скобках

Dmitry
15.09.2016
14:08:04
Олег, да с writeln(hasUDA!(foo, good)); работает

Oleg
15.09.2016
14:08:12
@("alpha") int k

Dmitry
15.09.2016
14:08:15
аа...
все понял

Oleg
15.09.2016
14:08:34
проверяется наличие, но не значение

Admin
ERROR: S client not available

Oleg
15.09.2016
14:08:52
потом можно __traits получить значение
вот тут, кстати, не совсем понятно зачем в std.traits занесено
template isAbstractFunction(T...)
if (T.length == 1)
{
enum bool isAbstractFunction = __traits(isAbstractFunction, T[0]);
}

Dmitry
15.09.2016
14:10:07
а смысл в чем использвования чисто языковой фишки __traits вместо судя по всему более удобной библиотечной обертки над ним?

Oleg
15.09.2016
14:10:33
ну если по функциональности одно и тоже, то нет смысла

Grigirii
15.09.2016
14:11:02
смысла нет, просто в дизайне языка надо разносить ядро и библиотеку. Всё же в язык не запихаешь, а без базовой поддержки языка и библиотеку не напишешь

Oleg
15.09.2016
14:11:07
а вот получить значение атрибута, как я понял, только через __traits(getAttributes,...);

Grigirii
15.09.2016
14:11:33
template getUDAs(alias symbol, alias attribute)

Oleg
15.09.2016
14:12:03

Grigirii
15.09.2016
14:12:39
в своём коде лучше пользоваться std.traits. в __traits есть смысл лезть очень редко

Dmitry
15.09.2016
14:14:51
Я вот щас на getUDAs смотрю. Они первым параметром символ передают, а вторым — набор атрибутов как понял.

Google

Dmitry
15.09.2016
14:15:01
import std.stdio;
import std.exception;
import std.typecons;
import std.traits;
void main()
{
writeln(getUDAs!(foo, good)); // мне нужно вывести имя атрибута повешенного на функцию
}
string good = "good";
string bad = "bar";
@good void foo()
{
}
@bad void bar()
{
}

Grigirii
15.09.2016
14:17:57
__traits(getFunctionAttributes,
а в библиотеке его похоже нет
https://dlang.org/spec/traits.html#getFunctionAttributes
блин, это не те атрибуты, потому и нет
getAttributes, вот trait, который нужен

Dmitry
15.09.2016
14:19:57
погоди, а в моем случае то как быть? Мне нужно вывести имя атрибута который на функцию повешен

Grigirii
15.09.2016
14:20:47
writeln(__traits(getAttributes, foo));

Dmitry
15.09.2016
14:21:03
а getUDAs разве не то?

Grigirii
15.09.2016
14:21:16
это будет список символов. значения по этим символам можно вытаскивать по getUDAs

Dmitry
15.09.2016
14:21:54
так: "of the given type from the given symbol."
типа когда повешан какой-то известный массив\структура атрибутов а не одиночные?

Grigirii
15.09.2016
14:27:34
да. getAttributes вытащит вообще все навешанные атрибуты

Dmitry
15.09.2016
17:25:26
Если write обявлена как шаблонная функция:
void write(S...)(S args)
это же шаблонная так?
то получается ей и аргументы можно через восклицательный знак передавать или нет?
типа write!"some text"
оно ругается: Error: template instance std.stdio.write!"some text" does not match template declaration write(T...)(T args) if (!is(T[0] : File))
О, вот так скомпилилось:
write!string("some text");
T - тип получается и следующие скобки args типа T так?

Grigirii
15.09.2016
17:30:14
да

Dmitry
15.09.2016
17:30:46
И если компилятор может тип сам определить, то восклицательный знак и указание типа можно пропустить
так а если у меня вайб падает на сервере в непонятные моменты, то кроме как логгирование втыкать везде и всюду других способов найти багу нет? Просто я даже не знаю какой момент логгировать в начале

Oleg
15.09.2016
17:48:48
имеет смысл в том коде, который крутится постоянно

Dmitry
15.09.2016
17:49:53
короче начать с main?