ну так и можно в примерах приводить нечто реалистичное, а не натянутое.
Зачем? Что-то реалистичное требует заметно больше кода, да ещё и специфичного. Кто станет читать эти примеры, если они будут размером с "Войну и Мир"?
чуть чаще чем никогда.
теории программирования утверждают что циклы и рекурсия между собой гомоморфны, так что можно утверждать, что рекурсия используется крайне часто. Опять же примеры с сериализацией будут требовать заметно больше бойлерплейта и продвинутой лексики языка в случае с растом, какой новичок будет это читать, когда у него там по два десятка констрейнтов навешано? Плюс, это паттерн "Посетитель", что вроде как вне темы статьи.
только у него есть одна проблема: в реальной жизни, в реальных приложениях такие требования встречаются чуть чаще, нежели никогда
Так выбор сортировок это всего лишь пример применения паттерна "Стратегия". Сам паттерн используется довольно обширно, хоть и не в чистом виде. А факториалы и фиббоначи обычно показывают как работать с рекурсией в языке, так что не очень понимаю ваше негодование.
Больше меня смущает, что их называют паттернами поведения, а не программирования. Чай не про людей речь.
как в общем и string_view. оно фактически просто указывает на кусок оригинальной строки и её размер без копирования всей строки. Так что просто отсчитываете сколько вам символов нужно и конструируете.
std::string str = "1234567890";
auto ptr = str.data(); // для удобства
// | указатель на начало строки
// V v желаемый размер
std::string_view view1{ptr , 3 }; // "123" из str;
// V сдвинуть на 5 символов относительно начала
std::string_view view1{ptr+5, 3 }; // "678" из str;
auto it = str.begin(); // начиная с С++20 можно через итераторы
std::string_view view1{it+5, 3 }; // "678" из str;
Работать можно почти также как с обычной строкой - стравнение с другими строками, итерация по символам в цикле, брать подстроки(точнее подвьюхи) через substring, искать всякое через find/rfind/_first_of/_last_of. Также в контейнерах хранить - map/set/vector.
Пока жива ваша строка с исходным кодом string_view будут оставаться валидными. Взамен получаете меньше копирований, аллокаций и реаллокаций (а они в вашем коде вероятны, т.к. вы не резервируете память), что добавляет бонуса к пропускной способности вашего компилятора и помогает с выводом сообщений об ошибках.
По большому счёту токены вообще можно делать вида
struct Token {
TokenKind kind; // тип токена
size_t begin; // оффсет от начала кода программы
size_t len; // длина токена
};
А когда понадобится просто брать подстроку из исходной строки, но тут есть нюансы с постоянным прокидыванием оригинальной строки в функции, которые эти токены потом обрабатывать будут.
это вы его определённо не пытались использовать. мало того что зависимость сама по себе достаточно жирная, так ещё и довольно комплексная. Одних обвязок с таргетами будет как весь имеющийся код.
while (!(now == ' ' || now == '\r' || now == '\n' || now == '\t'))
странно, что вы использовали isdigit, но не isspace.
memcpy(data, "{a = 11004; b = 10087; while(0 < b) {c = a - (a / b * b); a = b; b = c;} print(a);}", 85);
Вот этот мув совершенно не понял. То есть везде по коду используется std::string, но в этом месте вы решили ручками покопировать память. Зачем? Сделали ли бы string из сырой строки.
std::string program = R"({
a = 11004;
b = 10087;
while (0<b) {
c = a - (a/b*b);
a = b;
b = c;
}
print(a);
})";
std::string str = ""; // В эту строку будет записываться текущий токен
Вот эта штука будет делать ваш компилятор очень тормозным, ибо токенов в программе не мало и на каждый будет выделяться память под строку, которую следом же выкидываете. Лучше перейти на string_view и считать оффсеты от текущей глобальной позиции лексера. Что-то вроде
class Lexer {
sszize_t current_offset; // текущая позиция
ssize+t current_line; // текущая строка
std::string program; // исходник
public:
Lexer(std::string prog): program(std::move(prog)
{ /* etc */ }
Token getNextToken() {
auto token = Token::Nop;
auto offset = current_offset;
while (!isspace(prog[offset++])) {
// то что у вас там парсилось
...
}
current_offset += offset;
return token;
}
};
int main() {
string prog = "{a=1+1; print(a)}";
Lexer lex(prog);
while (auto token = lex.getNextToken(); token != Token::Eof) {
// обрабатываем токен
}
return 0;
}
Заодно, когда дойдёте до обработки ошибок будет проще писать в какой строке/столбце ошибка.
Вот это неправда. Чтобы ссылаться кареткой на предыдущие коммиты, то нужно последовательно ставить их, то бишь HEAD^^ будет ссылаться на то что подразмевалось. Для того чтобы работать с номерами необходимо использовать тильду HEAD~2
Несколько странно, каэш, говорить на русском и жаловаться, что люди сокращают несокращаемое и склоняют несклоняемое.
апи
если посчитать сколько раз глотка будет изгибаться на каждой кратке в эйпийай, то в среднем понятно почему оно всё же апи(шечка), а не вот эта ваша аббревиатура.
бага
rule 64 существует и в русском языке. deal with it.
девелОпмент
каюсь, грешен. помню коллега знатно с этого подорвался в голос. я не знаю откуда у меня желание расставлять ударения на дальний слог. у меня и кобАльт долгое время был.
жаба (2) — Java, но тоже душит
ну тут сам оракл велел.
жабаскрипт
должно быть жабраскрипт. и с жабой меньше путаницы и отражает суть этой безрукой чешуястой инфраструктуры.
кресты
кстати ни разу не сталкивался с кем-либо. кто их так называл. обычно всё же плюсовик(-затейник).
ксс
они конечно каскадные, но цаскадные стили греют мне душу.
пека
лучше писи и компа
уметь в...
кто-то не умеет в иронию и языки. в среднем странные конструкции подобного рода почему-то персонально ощущаются крайне органичными. где-то рядом "запилить" и "выпилить".
«Сишечка» — это что, C, SSH, c‑shell?
SSH это Саша. А кто-то вообще ведёт разговоры о сишелах? Ню и жш я б ещё понял, баш там куда ни шло. но сишелл? Мне кажется с большей вероятностью кто-нибудь будет говорить про тзинч-шелл. Но в среднем не очень понимаю такю любовь к Си, чтобы называть её настолько ласкательно.
«Правильно приготовленный X»
Внезапно, многие вещи это вполне себе рецеты приготовления. В каком-нибудь Ansible это даже официально зовётся рецептом. Оттуда перекочевало в прочие CI/CD как неофициальное название этих ихних ямлов.
Мыло
Это что-то странное. Это слово примерно возраста интернета/фидо. Неужели зумеры?
Шваггер вместо сваггер
Пока кто-то учить ту би ор нот ту би, кто-то боролся с длинными монословами из дойче шпрехе.
Адоб. Потому что Эдоуби.
Ещё скажите что Nike не Найк звали.
Произношение слова Queue
Оно слишком мемное, чтобы произносить его нормально. Остальных записывайте в лагерь лягушатников с багетами.
У вас в статье есть три эвристики, которые можно использовать в алгоритмах поиска - Дийкстре, A* и прочие. В зависимости от ограничений на плоском поле и выбранной эвристики - то есть алгоритму по которой отдаётся приоритет точке в алгоритме поиска пути - находимый путь может отличаться количеством поворотов между точками при одинаковой метрике в заданном пространстве - то есть способу измерять расстояния между точками в заданном векторном пространстве.
"От балды" означает, что этот путь вы нарисовали ручками, а не как результат работы какого-либо алгоритма, но с разными эвристиками, о чём я подумал изначально.
Зачем? Что-то реалистичное требует заметно больше кода, да ещё и специфичного. Кто станет читать эти примеры, если они будут размером с "Войну и Мир"?
теории программирования утверждают что циклы и рекурсия между собой гомоморфны, так что можно утверждать, что рекурсия используется крайне часто. Опять же примеры с сериализацией будут требовать заметно больше бойлерплейта и продвинутой лексики языка в случае с растом, какой новичок будет это читать, когда у него там по два десятка констрейнтов навешано? Плюс, это паттерн "Посетитель", что вроде как вне темы статьи.
Вместо этого каждая иконка на десктопе будет подгружаться по url как картинка.
У меня винда регулярно при выходе из дрёмы пытается проверить апдейты и накатить их.
Так выбор сортировок это всего лишь пример применения паттерна "Стратегия". Сам паттерн используется довольно обширно, хоть и не в чистом виде. А факториалы и фиббоначи обычно показывают как работать с рекурсией в языке, так что не очень понимаю ваше негодование.
Больше меня смущает, что их называют паттернами поведения, а не программирования. Чай не про людей речь.
как в общем и string_view. оно фактически просто указывает на кусок оригинальной строки и её размер без копирования всей строки. Так что просто отсчитываете сколько вам символов нужно и конструируете.
Работать можно почти также как с обычной строкой - стравнение с другими строками, итерация по символам в цикле, брать подстроки(точнее подвьюхи) через
substring
, искать всякое черезfind
/rfind
/_first_of
/_last_of
. Также в контейнерах хранить - map/set/vector.Пока жива ваша строка с исходным кодом
string_view
будут оставаться валидными. Взамен получаете меньше копирований, аллокаций и реаллокаций (а они в вашем коде вероятны, т.к. вы не резервируете память), что добавляет бонуса к пропускной способности вашего компилятора и помогает с выводом сообщений об ошибках.По большому счёту токены вообще можно делать вида
А когда понадобится просто брать подстроку из исходной строки, но тут есть нюансы с постоянным прокидыванием оригинальной строки в функции, которые эти токены потом обрабатывать будут.
это вы его определённо не пытались использовать. мало того что зависимость сама по себе достаточно жирная, так ещё и довольно комплексная. Одних обвязок с таргетами будет как весь имеющийся код.
В смысле если забивать оперативку, то как джава?
странно, что вы использовали isdigit, но не isspace.
Вот этот мув совершенно не понял. То есть везде по коду используется std::string, но в этом месте вы решили ручками покопировать память. Зачем? Сделали ли бы string из сырой строки.
Вот эта штука будет делать ваш компилятор очень тормозным, ибо токенов в программе не мало и на каждый будет выделяться память под строку, которую следом же выкидываете. Лучше перейти на string_view и считать оффсеты от текущей глобальной позиции лексера. Что-то вроде
Заодно, когда дойдёте до обработки ошибок будет проще писать в какой строке/столбце ошибка.
Проверните все то же самое на VBScript, там вроде даже циклы нормальные есть. Или действительно как нормальные админы - через PS
Вот это неправда. Чтобы ссылаться кареткой на предыдущие коммиты, то нужно последовательно ставить их, то бишь
HEAD^^
будет ссылаться на то что подразмевалось. Для того чтобы работать с номерами необходимо использовать тильдуHEAD~2
Я так понимаю у них продукты/версии в честь городов-героев называются или что-то в этом роде.
Спрашивайте, в комментариях расскажут.
Вот где GATов недостаёт малость.
Как они до сих пор совместную репу какую-нибудь не заспавнили.
Это уже всякие студенты-медики-биологи, там половина латыни в таких terraformidae
Причем тут саман? Они же горами продукты обзывали. Аналогично у яблла тоже горы, но другие.
да, видимо промахнулся. "Если оно существует, то существует женская версия".
учитывая, что они в плюсах до сих пор без RAII живут и new вызывают разница не так уж велика.
кутья и кутя звучат сильно по разному, тут ближе вот это.
Несколько странно, каэш, говорить на русском и жаловаться, что люди сокращают несокращаемое и склоняют несклоняемое.
если посчитать сколько раз глотка будет изгибаться на каждой кратке в эйпийай, то в среднем понятно почему оно всё же апи(шечка), а не вот эта ваша аббревиатура.
rule 64 существует и в русском языке. deal with it.
каюсь, грешен. помню коллега знатно с этого подорвался в голос. я не знаю откуда у меня желание расставлять ударения на дальний слог. у меня и кобАльт долгое время был.
ну тут сам оракл велел.
должно быть жабраскрипт. и с жабой меньше путаницы и отражает суть этой безрукой чешуястой инфраструктуры.
кстати ни разу не сталкивался с кем-либо. кто их так называл. обычно всё же плюсовик(-затейник).
они конечно каскадные, но цаскадные стили греют мне душу.
лучше писи и компа
кто-то не умеет в иронию и языки. в среднем странные конструкции подобного рода почему-то персонально ощущаются крайне органичными. где-то рядом "запилить" и "выпилить".
SSH это Саша. А кто-то вообще ведёт разговоры о сишелах? Ню и жш я б ещё понял, баш там куда ни шло. но сишелл? Мне кажется с большей вероятностью кто-нибудь будет говорить про тзинч-шелл. Но в среднем не очень понимаю такю любовь к Си, чтобы называть её настолько ласкательно.
Внезапно, многие вещи это вполне себе рецеты приготовления. В каком-нибудь Ansible это даже официально зовётся рецептом. Оттуда перекочевало в прочие CI/CD как неофициальное название этих ихних ямлов.
Это что-то странное. Это слово примерно возраста интернета/фидо. Неужели зумеры?
Пока кто-то учить ту би ор нот ту би, кто-то боролся с длинными монословами из дойче шпрехе.
Ещё скажите что Nike не Найк звали.
Оно слишком мемное, чтобы произносить его нормально. Остальных записывайте в лагерь лягушатников с багетами.
У вас в статье есть три эвристики, которые можно использовать в алгоритмах поиска - Дийкстре, A* и прочие. В зависимости от ограничений на плоском поле и выбранной эвристики - то есть алгоритму по которой отдаётся приоритет точке в алгоритме поиска пути - находимый путь может отличаться количеством поворотов между точками при одинаковой метрике в заданном пространстве - то есть способу измерять расстояния между точками в заданном векторном пространстве.
"От балды" означает, что этот путь вы нарисовали ручками, а не как результат работы какого-либо алгоритма, но с разными эвристиками, о чём я подумал изначально.