- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
function main() {
for (const q of [1, 12]) {
print(q);
}
for (const l of "HW") {
print(l);
}
print("done.");
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
function main() {
for (const q of [1, 12]) {
print(q);
}
for (const l of "HW") {
print(l);
}
print("done.");
}
продолжаем говнокодить компилятор для TypeScript (типа новый сабсет для native-ого кода)
ASD_77 02.06.2021 12:12 # 0
ASD_77 02.06.2021 12:14 # 0
ASD_77 02.06.2021 12:15 # 0
Soul_re@ver 02.06.2021 12:17 # +3
vistefan 02.06.2021 12:21 # +3
guest6 02.06.2021 12:39 # +2
CHayT 02.06.2021 12:42 # +1
ASD_77 02.06.2021 12:42 # 0
CHayT 02.06.2021 12:43 # 0
guest6 02.06.2021 12:44 # 0
JloJle4Ka 02.06.2021 12:47 # 0
bootcamp_dropout 02.06.2021 12:40 # +3
ASD_77 02.06.2021 13:08 # 0
bormand 02.06.2021 13:18 # 0
ASD_77 02.06.2021 13:20 # 0
bormand 02.06.2021 13:22 # 0
MAKAKA 02.06.2021 14:14 # 0
как же они его хранят? Выбирают "удачный размер" (допустим, 8 байт, чтоб указитель влез) и если влазит в него, то прямо и хранят, а так в куче?
А sizeof у него какой? Как у "удачного размера"?
bormand 02.06.2021 14:21 # 0
MAKAKA 02.06.2021 14:38 # 0
Звучит ведь как какой-то пхпизм прост
bormand 02.06.2021 14:43 # 0
Обычно variant'а с конкретными типами хватает ну или интерфейса. Желания хранить в одной коллекции всё что угодно как-то не возникало...
ASD_77 02.06.2021 14:52 # 0
MAKAKA 02.06.2021 14:54 # 0
Так этож нужно по ссыкле тогда: не бесплатная абстракция!)
Soul_re@ver 02.06.2021 15:46 # 0
MAKAKA 02.06.2021 15:49 # 0
Soul_re@ver 02.06.2021 15:54 # 0
Если не проверил тип и скастовал в неправильный — получи эксепшеном в щи.
MAKAKA 02.06.2021 15:58 # 0
но мне всё равно немного неождианного видеть такую высокоуровневую херню в крестах
bormand 02.06.2021 16:04 # 0
Лол. Ну в крестах по большей части всё типобезопасно. Динамик каст тоже исключениями кидается если ты его прижал к стенке и заставил кастовать ссылки, а не указатели.
MAKAKA 02.06.2021 16:06 # 0
bormand 02.06.2021 16:08 # 0
MAKAKA 02.06.2021 16:14 # 0
а научи меня получить тип "*a" в рантаймме?
RTTI же значит "рантайм тайп"
bormand 02.06.2021 16:16 # 0
Т.е. RTTI есть у всего, но в рантайме оно резольвится только у классов с виртуальной таблицей.
З.Ы. Именно поэтому any берёт typeid до каста в void* и хранит его отдельным полем.
MAKAKA 02.06.2021 16:19 # 0
Иными словами информация о типе в рантайме есть только у виртукальных классов, верно?
А теперь -- внимание -- переведем на английский выделенную жирным фразу
bormand 02.06.2021 16:23 # 0
Просто для всех типов, где нет виртуальных таблиц, значение typeid очевидно для конпелятора и ему не надо лезть в таблицу. А то что ты там какой-то хуйни reinterpret cast'ом накастовал -- это твои личные проблемы.
MAKAKA 02.06.2021 16:29 # 0
А например в питоне, джаве и сишарпе есть всегда
Soul_re@ver 02.06.2021 16:32 # 0
type_info существует для всех типов. Обычно ненужные type_info выкидываются линкером, но для полиморфных классов к которым когда-то применяли typeid их приходится хранить (потому что хрен знает, какой конкретно динамический тип там будет.)
MAKAKA 02.06.2021 16:35 # 0
Это же какой-то пиздец)
Ладно, если я буду думать, что как-бы RTTI есть у всего, но потом линкер его просто выкинул, то это будет правильно?
bormand 02.06.2021 16:36 # 0
Nope. Если ты взял typeid(int), то теперь в рантайме у тебя существует type_info, описывающее int.
MAKAKA 02.06.2021 16:39 # 0
Или для инта я могу только статически на самом деле ее получить, ведь инт не виртуален?
bormand 02.06.2021 16:39 # 0
Да глобалка обычная, вроде. Для простых типов typeid() просто раскрывается в ссылку на неё, для более сложных он лезет в таблицу виртуальных методов и достаёт ссылку оттуда (нулевой слот вроде). Вот и вся магия.
MAKAKA 02.06.2021 16:41 # 0
bormand 02.06.2021 16:43 # 0
MAKAKA 02.06.2021 16:49 # 0
bormand 02.06.2021 16:53 # 0
MAKAKA 02.06.2021 16:55 # 0
Просто это может быть не обязательно.
Ну типа
if (someRandom()) {
typeid(foo).name() // может, и нет смысла его инлайнить
}
bormand 02.06.2021 16:59 # 0
bormand 02.06.2021 16:33 # 0
RTTI -- это и есть механика, состоящая из typeid() и type_info. И структура type_info есть абсолютно у каждого типа (но ты не платишь за те типы, для которых ты её не берёшь).
За счёт этого ты и можешь проверить, что из std::any достаётся именно тот тип, который туда положили. Или можешь сделать какую-нибудь хешмапу из typeid в обработчик для нужного типа.
MAKAKA 02.06.2021 16:37 # 0
То есть если класс не полиморфный, то у меня нет физической возможности потрогать этуструктуру в рантайме, и компилятор её выкидывает как-бы в рамках такой оптимизации?
bormand 02.06.2021 16:38 # 0
Как-то так. Ты же её не получаешь документированными способами, а значит и потрогать не можешь.
guest6 02.06.2021 16:43 # 0
guest6 02.06.2021 16:43 # 0
Soul_re@ver 02.06.2021 16:27 # 0
> RTTI
В С++ это упоминается только в качестве кода для главы в которой описывается type_info и товарищи: support.rtti
bormand 02.06.2021 14:59 # +1
std::map<std::string, std::any> globalSettings.
MAKAKA 02.06.2021 15:01 # 0
Хотя конечно если я хочу хранить там int, то переголова небольшая
bormand 02.06.2021 15:04 # 0
Ну и не надо самому городить касты.
MAKAKA 02.06.2021 15:08 # 0
bormand 02.06.2021 15:13 # +1
MAKAKA 02.06.2021 15:20 # +2
bormand 02.06.2021 16:11 # 0
MAKAKA 02.06.2021 16:18 # 0
bormand 02.06.2021 16:20 # 0
Обычно всё-таки нужно какие-то свои объекты и функции скрипту дать. Иначе скучно ведь.
MAKAKA 02.06.2021 16:22 # 0
vistefan 03.06.2021 00:34 # 0
bormand 03.06.2021 02:07 # 0
А интеграция с няшной и песочница у луа самая простая из всей популярной скриптушни, наверное.
MAKAKA 03.06.2021 02:27 # 0
Можно например сделать такую таблицу, при обращении к окторой всегда возвращается число 32.
И это позволяет юзать таблицы как универсальный такой интерфейс: функция ожидает нечто, в чем есть поле "foo", а поле может быть настоящим или програмным..
MAKAKA 03.06.2021 02:25 # 0
Основая структура проста тем, что она одна: нескалярный тип только таблица.
Она может быть массивом, ассоц массивом, объектом или неймспейсом.
Она имеет декларативный синтаксис, что позволяет описывать декларативно хош массив, хош ассоц массив.
Собссно Lua это наследник языка Sol, как раз для описания конигфруаций и используемого.
TOPT 03.06.2021 03:11 # 0
MAKAKA 03.06.2021 03:18 # 0
TOPT 03.06.2021 03:29 # 0
bormand 03.06.2021 03:31 # 0
TOPT 03.06.2021 03:33 # +1
MAKAKA 03.06.2021 03:43 # 0
Собссно, её и читал спиздив в Интернете
TOPT 03.06.2021 03:51 # +1
vistefan 04.06.2021 08:41 # +1
gologub 03.06.2021 05:49 # +2
bormand 03.06.2021 13:51 # 0
Desktop 03.06.2021 13:54 # +2
bormand 03.06.2021 13:56 # 0
guest6 03.06.2021 13:59 # 0
vistefan 02.06.2021 22:55 # 0
guest6 02.06.2021 22:58 # 0
vistefan 03.06.2021 01:16 # 0
bormand 02.06.2021 14:22 # +5
PolinaAksenova 02.06.2021 14:27 # +5
Desktop 03.06.2021 16:47 # +3
из класса лямбдочку взяли мы домой
сколько на лямбдочке проперти цветных!
розовых уинтов, даблов золотых
CHayT 02.06.2021 12:43 # +5
ASD_77 02.06.2021 13:07 # +1
MAKAKA 02.06.2021 14:17 # +2
С другой -- там есть слово "javascript" (ну тайпскрипт, не важно), а значит он автоматически становится современным, актуальным, популярным, и ассоциируется с успешными стартапами в кремниевой долине
Desktop 03.06.2021 13:58 # 0
MAKAKA 03.06.2021 15:45 # 0
Desktop 03.06.2021 16:45 # 0
- угу, прямо миф морозная свежесть