Pull to refresh
-2
0
Владимир @Evir

User

Send message
Так это безумие! Это очень сильно ударит по производительности.
Почему? Посмотрите ещё раз пример, можете полистать список классов (см. тут; к сожалению, отдельную ссылку именно на список дать не могу – нет там якоря вроде).
Подробнее под спойлером
В C++ можно (можно читать как «нужно», ибо это может дать прирост производительности за счёт того, что компилятор будет лучше понимать код) помечать методы как константные:
QString name() const;
void setName(const QString& value);

В первом случае выходит, что получение имени из экземпляра класса не имеет побочных эффектов (на сам экземпляр), соотвественно, получение имени не вызывает копирование; а вот перед заменой имени Copy-onWrite сработает (если счётчик ссылок покажет, что есть более двух ссылок на объект):
Employee e1(1001, "Albrecht Durer");
Employee e2 = e1;
Employee e3 = e2;
qDebug() << "e1.name:" << e1.name;
// e1+e2+e3 по-прежнему указывают на один и тот же объект в памяти
e1.setName("Hans Holbein"); // перед изменением e1 создаётся копия объекта, и изменение совершается на копии
qDebug() << "e2.name:" << e2.name; // Albrecht Durer
qDebug() << "e3.name:" << e3.name; // Albrecht Durer
e2.setName("Other person"); // перед изменением e2 создаётся копия объекта, и изменение совершается на копии
// теперь e1/e2/e3 указывают на разные объекты
e3.setName("Third person"); // счётчик ссылок e3 равен 1, копирования не происходит

Причём компилятор не даст в const-методе изменять данные экземпляра, если нет специального ключевого слова на изменяемом свойстве (если не ошибаюсь, volatile).
Вау, спасибо. Вот только я колупаюсь на Monodevelop и Unity 2019.1; не знаю, есть ли у меня варианты такую свежатину пощупать, или нужно ещё минимум год-два ждать… Надо будет поузнавать.
Как я понял, байт-кодом в его случае является «частично пре-компилированный» Си-файл с обвязкой, позволяющей получить разные бинарные файлы в зависимости от ответов на вопросы при установке.
Подразумевается, что при установке код будет собран; если считать Си-файл байт-кодом, то получается такой своеобразный Ahead-of-Time.
Ничего из этого. Все объекты рассматриваются как значения, т.е.
поскольку программа знает, что память по ссылке используется в 2-х объектах, то массив мо ссылке просто копируется в новый, и теперь в a и b разные ссылки. И уже в новом массиве, последний элемент меняется на 7
Вот есть подобная функциональность: Implicit Sharing. Не без проблем, конечно. Можно создавать свои классы с таким же поведением (см. пример использования). И это только один из вариантов подобного поведения. Магия C++ позволяет писать классы-обёртки, где Copy-on-Write будет срабатывать при попытке вызвать любой non-const метод, и даже не нужно отдельно иметь .=/:= и a.call() / b:call(). Я так понимаю, что это в языке осталось?

Вообще, тот же C# мне не очень нравится именно из-за отсутствия модификатора const и нормальной работы со структурами и ссылками/указателями; если честно, мне даже кажется кощунством продвигаться в этом направлении ещё глубже. Сейчас играюсь с Unity, и каждый раз переживаю, что при любом вызове функции всякие там Vector3 будут копироваться вместо передачи по ссылке; интересно, как бы работал Ваш язык с кучей геометрических рассчётов.

Свой компилятор – это очень круто; я пытался реализовать парсер C#-кода в AST с разбором типа каждого выражения, чтобы потом править определённым образом код и пересохранять. Тоже хотел сделать что-то в каком-то смысле уникальное и новое (описывать историю, «квест», через код), но я почему-то сломался на обработке генериков. Поразбирав подробнее, как оно работает в C#, я решил, что мне оно не нужно настолько. Да и переоценка вменяемости того pet-проекта оный забраковала.

Честно, не думаю, что кроме опыта Вы получили что-то полезное, занимаясь своим проектом, но закончить такое детище – хорошее достижение. Вы молодец.
Отсутствие взносов в фонд страхования — может быть в РФ это как-то криво реализовано, но к примеру в Германии подобная ситуация практически нереальна — вкладчики получат своё, так или иначе.
Да вроде понятно же, как работает – документы оформляются в одном экземпляре для клиента, а деньги идут в карман кассиру. В итоге банк ни сном, ни духом, агентство страхования вкладов – тоже. Кассира потом поймают и посадят со временем, а клиент свои деньги, возможно, не увидит даже через суд. А уж если у банка успеют отобрать лицензию, и только потом клиент решит, что нужно бы свои деньги вернуть…
В теории – всё может быть. Вот пусть каждый решает, где (как ему кажется) больше шансов попасть на подобное, и какими путями минимизировать риски.
А то вполне в духе современных государств сразу стремиться запретить всё, что не поддаётся прямому контролю и слежке, мотивируя всё это борьбой с терроризмом, отмыванием денег, ну или потенциальным влиянием на неокрепшую детскую психику.
Да не то, чтобы доверяю… В общем, тут всё как с банками. Вроде как localbitcoins должна заботить их репутация (крах репутации будет крахом самого localbitcoins), поэтому в среднем они вроде как будут поступать правильно. По крайней мере, пока не дойдёт до диспута – работает код, и всё идёт как нужно. Чтобы не дошло до диспута – можно не гнаться за выгодой, получить на 1% меньше на обменах, но с надёжным (десятки тысяч сделок) контрагентом.
А в банке могут быть проблемы и со стороны «нечистоплотных» работников, и могут внезапно все деньги со счёта улететь из-за того, что где-то есть Ваш полный тёзка с кучей долгов, и ещё куча вариантов.
Вообще-то в данном случае он не может ничего не отправить; у него на бирже есть минимум та сумма, на которую Вы с ним договорились, и биржа её заморозила. Я согласен, что вряд ли диспут через биржу – приятный поворот событий; но (в теории, как минимум) получить с «оппонента» оговоренное в такой ситуации возможно.
А зачем Вам биржа, если есть такие страхи по поводу оных? Держите свои счета у себя, сами подписывайте свои транзакции, сами отправляйте-получайте. Даже токены (если речь идёт об Ethereum), вроде того же USDT, покупайте-продавайте сами. Пока не возникает необходимость ввода-вывода (т.е. вообще из/в другую крипту, или из/в наличные) – биржа не требуется. А когда требуется – можно гонять мелкими порциями и/или через разные биржи. Не держа все яйца в одной корзине.
Но нет, давайте лучше запретим всё, что не удобно и не нравится лично Вам? )
Вот только в итоге этих эмодзи такая куча, что на телефоне сложно найти даже просто обычный смайлик с нужной эмоцией. И это даже не учитывая, что смайлики/эмодзи – не то же самое, что выражения эмоций на лицах (которые, в общем-то, универсальны), и их можно воспринимать по-разному. Я имею в виду, что изображение «смущённого» другой человек может воспринять, например, как потеющего (мало ли, чего он там красный). А если учесть, что у собеседника может быть другая мобильная OS (или другая версия той же), с другой отрисовкой… А ещё десктопы же есть, и там, чаще всего, с этими самыми эмодзи зачастую вообще беда.
Таким образом, скоро любое приложение с вводом текста превратится в мини-версию фотошопа с редактором вида «выберите смайл, пол/возраст/цвет кожи каждого персонажа на нём, шапочку, разрез глаз, очки, настроение и ещё 101 параметр». Возможно, получившийся эмодзи в одну смс уже не поместится.
При этом в том же QIP 2005 было десятка два с половиной «колобков», и их хватало! Мне до сих пор хочется иногда отправить *WALL* или его аналог; только обычно ничего подобного нет.
image
Вы не поняли. У меня под Linux нет такой проблемы – пробел при двойном клике по слову не выделяется вместе со словом. Но я уже после своего комментария под Windows на той же версии попробовал – там как раз выделяется. Но виндой я сравнительно редко пользуюсь, так что мне не страшно. Вообще, чаще раздражает (в том числе и в Firefox вроде бывало) выделение текста по словам через Ctrl+Shift+{←,→}. Например, в MonoDevelop есть плюсы (нравится наличие двух видов горячих клавиш – выделять по целым словам, или «частями» по camelCase) и минусы (выделяет чисто по словам, без учёта знаков препинания – в конце строки «прыгает» не к "};", а сразу выделяет до конца слова где-нибудь на следующей строке, а то и через одну).
Но спасибо, что указали настройку – кому-нибудь может пригодиться, так что пусть на виду будет.
Мне понравилась фича, которую я заметил в отладочной консоли в QtCreator:
Скриншот выделения смешанного текста в отладочной консоли QtCreator
Небольшая стрелка, которая мигает вместе с курсором (даже без выделения текста) на строках со смешанным содержимым. На самом деле, эта штука присутствует и в редакторе кода, но почему-то там работает не очень адеватно.
Видимо, поведение Firefox всё же иногда зависит от чего-то ещё; по крайней мере, у меня под Linux нет проблемы с выделением пробела после слова в редакторе при двойном клике. Не то, чтобы я совсем никакой тонкой настройки не выполнял, включая about:config, но про редактирование поведения с автовыделением пробела первый раз слышу.
У меня только вроде начало в голове складываться… Я разглядел, что при записи так, как в этих примерах, всё сводится к польской нотации. Получается, что «парсить в голове» нужно именно в таком режиме, читая слева направа «со стеком». Осталось вроде только разобраться в ролях точки и доллара.
С наскока не вышло. Открыл онлайн компилятор хаскелля:
main = do
    putStrLn . show . add 10 . add5 $ sqr 3
    putStrLn . show $ add 10 . add5 $ sqr 3
    putStrLn . show $ add 10 $ add5 $ sqr 3
    putStrLn . show $ add 10 . add5 . sqr 3
    putStrLn . show $ add 10 ( add5 . sqr 3 )
Первые три строки выдают 24 каждая (3² = 9; + 5 = 14; + 10 = 24) и это расслябляет, складывается ощущение, что они взаимозаменяемы. То есть вроде особой разницы. А вот третья и четвёртая не собирается (т.е. работает только если их закомментировать), причём падает по несколько ошибок, независимо от того, оставляем только одну из них, или обе. Первая ошибка всегда показывает на третью строку: add5 = add 5
Вроде последний пример выглядит проще для новичка:
putStrLn . show $ add 10 ( add5 . sqr 3 )
В скобках точка приводит к композиции двух Int -> Int функций, затем им передаётся Int 3. Оно проходит sqr (= 9), затем add5 (= 14)…
Как я понял, доллар – это такая открывающаяся скобка «отсюда и в ту сторону». Смотрим от него справо: add 10 14 = 24
Справа от доллара у нас композиция «превратить в строку, затем вывести». То есть вроде не должно быть проблем, но не собирается.

[Пока дописывал] А нет, разобрался вроде. Почитал про приоритеты и ассоциативность, и оказалось, что вызов функции имеет более высокий приоритет, затем точка, математические и логические операторы, а доллар ­– самый последний. Тогда в последней строке получается, что:
( add5 . sqr 3 )

Означает, что мы первым делам вызываем sqr 3, после чего точка «ломается». Тогда или пишем add5 $ sqr 3, чтобы отработал sqr 3 с последующим попаданием результата в add5, или берём композицию в скобки, (add5. sqr) 3…
Как это нет AST? Когда компилятор хасскеля парсит код, он же разбирает и приводит его к какому-то подобию синтаксического дерева?
Мне просто кажется, что если я хочу понять часть сложного выражения на хасскеле – нужно подробно разобрать всю строку, каждый знак препинания и каждый идентификатор. Хоть с константами вроде проблем нет.
И если идёт код вроде того, что дал выше PsyHaSTe – можно взять любую часть кода или длинного выражения, и даже вручную (а лучше – с подсветкой парных скобок в IDE) понять, что там вызывается, с какими аргументами. Опять же, если взять json/xml/css документ, даже после минификации – можно из середины взять элемент, и разобраться со всем его содержимым, не разбирая документ (или строку в несколько десятков килобайт) целиком. Просто по парным закрывающим/открывающим тегам/скобкам. Может, это дело привычки, но хасскель в этом плане кажется сложнее.
Не претендую быть истиной в последней инстанции. )
Начну с того, что статью я читал вчера, ближе ко сну, а в комментарии полез уже сегодня. И сегодня мне это кажется чуть более понятным. Но всё же…
Думаю, меня в первую очередь смутило, что изначально точка представлялась как оператор объединения методов, а тут внезапно «10 . add5» – и всё, смысл ускользает (чтобы понять точнее, нужно уловить, что слева – вызов бинарного метода с одним аргументом – получаем каррирование вместо композиции). После чего дальше примеры выглядят ещё более жутко – вроде как общий смысл виден, но больше похоже на магию всё равно.
Читаем запись практически дословно
Читаем запись практически дословно
Для этого нужно понимать каждую функцию в строке (количество, плюс, возможно – тип аргументов). А в умеренном количестве скобок ничего страшного нет, плюс:
  • Можно добавить пару пробелов, выделяя часть строки логически (да, в хасскеле – тоже можно);
  • IDE может подсветичивать парные скобки, помогая уложить в голове выражение (при такой записи в хасскеле это невозможно);
  • В некоторых случаях ничего не мешает вместо одной строки написать две, но более понятно;
  • Можно отдельно разобрать один из аргументов метода, даже если это очень сложное выражение – а вот тут в хасскеле тоже проблема, ибо если взять середину длинного выражения – будет непросто понятно, где кончается данный аргумент. Представьте себе вместо аргумента «10» выражение длинной с исходное выражение...
  • А ещё это вопрос вкуса, привычек, и требований к оформлению к кода (при работе в команде) – но никто не мешает закрывающие скобки (о, ужас!) выносить на отдельную строку, чтобы было видно, сколько и откуда их «вылезло».

И раз уж изначально в статье отталкиваетесь от C#, то я добавлю, что в C# есть очень большая куча синтаксического сахара, вроде индексаторов, свойств, методов расширений – судя по Вашей ссылке, уверен, не мне Вам про это всё рассказывать. Когда в C++/Qt приходится писать (других вариантов, по сути, нет):
QJsonValue v = ...; // некоторое значение
if(v.isArray()) {
  for(QJsonValue v2 : v.asArray())
    doSomething(v2);
}

C# позволяет в подобных местах использовать свойства (v.isArray, v.asArray), избегая лишних скобок там, где они не нужны. Не хватает только возможности делать свойства расширений – при желании можно было бы писать так:
Console.WriteLine( Add(10, Add5(3 . Sqr)).AsString )

И немного offtopic по вашему коду
Я бы для упрощения использовал ту же комбинацию в стиле хасскелевой точки:
var ArgumentIdentifier = (id) => Argument(IdentifierName(id));
// Тогда получается не так страшно местами
something.AddArgumentListArguments(
  ArgumentIdentifier(web3Identifier),
  ArgumentIdentifier(abiIdentifier),
  ArgumentIdentifier(binIdentifier),
  ArgumentIdentifier(gasIdentifier),
  ...
);
Опять же, если есть такая возможность, то через те же методы расширения, я бы попробовал сделать:
SingletonList(
  AttributeList(
    SingletonSeparatedList(
      Attribute(
        IdentifierName("FunctionOutputAttribute")))))
// =>
AttributeIdentifier("FunctionOutputAttribute")
  .AsSingletonSeparatedList()
    .AsAttributeList()
      .AsAttributeList()
И нет больше пяти ")" подряд. Честно говоря, я не стал разбираться, что такое SingletonList, SingletonSeparatedList и т.д. Если это не статичные методы, тогда, скорее всего, в каждый .As*() метод нужно будет ещё параметром this передавать. Это может быть меньшей проблемой.

Nim
PS. Кстати, как-то пытался ради забаыв попробовать реализовать ECS на связке C++/Qt/Nim, и вот у последнего вроде мощная работа с AST из коробки, причём выглядело оно довольно удобно реализованным, как ни странно.
Бросил, когда не вышло сделать обёртку для generic-класса, типа «QSharedPointer[ClassName]»; ни на пакете из репозитория убунты, ни на последней на тот момент версии, скачанной и собранной отдельно.

Ну пишите скобки, если хотите, никто же не заставляет так писать.
Это работает до первой встречи с чужим кодом; если самому не понять, как это работает – то потом нельзя будет быть уверенным, что при возникновении проблем ответ на свой вопрос по хасскелю на том же stackoverflow удастся разобрать и понять :) Не всё же бездумно копипастить.
Для человека с хотя бы годом опыта работы в любом несистемном языке не будет никаких проблем с изучением хаскелля, мне казалось я достаточно по шагам описал возможный процесс.
Надеюсь, никто камнями не закидает, но… Вроде знаю много языков, разбираясь в них на уровне от «в общих чертах» и выше, но от хаскелля я немного в ужасе (хотя статью про монады и хасскель переваривал когда-то на Хабре). Читал Ваше введение, читал… Вроде по-отдельности всё понятно. Но вдруг main очередного примера складывается в одну длинную строчку с кучей знаков препинания… И смысл улетел, смысл кода не вижу.
Мне просто кажется немного невероятным, когда эта тема менее чем за час укладывается в голове настолько, что строка кода вроде:
main = putStrLn . show . add 10 . add5 $ sqr 3
Начинает без проблем в голове складываться в AST. Простите, но я с цитатой выше и с:
-- ура! нет скобочек
В таком случае не согласен.
Судя по всему, также важно, какие функции передаются через аргументы. То есть, красная функция не может вызвать синию, передавая красную функцию одним из аргументов.
Согласно протоколу, в обращении никогда не будет больше 21 млн BTC
Хммм, и правда, как-то не пришло в голову. Наверно, тогда всё же стоило бы поменять формулировку во втором абзаце, ибо «от существующего предложения» воспринимается не как «от максимального возможного количества», а от некоторой доступной сейчас суммы, активно вращающейся на биржах (предлагаемой кем-либо в данный момент времени, видимо, для обмена на кэш).
так что спасибо за замечание!
В данном случае не за что, ибо Вы оказались правы. Я слишком легко повёлся на стереотипы, простите.
Заголовок:
собрала 1% существующих биткоинов
Второй абзац:
около 1% существующего предложения
Заранее хочу извиниться… я понимаю, Ализарщина и всё такое, но всё же разница между «1% от существующих биткоинов» и «1% от существующего предложения» примерно такая же, как между «все деньги в мире» и «все деньги в кассах нескольких ближайших банков и магазинов».
А потом эта новость пойдёт дальше именно в таком виде, и это – кошмар.

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity