- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
function* foo() {
let i = 1;
yield ++i;
yield ++i;
}
function main() {
for (const o of foo()) {
print(o);
}
print("done.");
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
function* foo() {
let i = 1;
yield ++i;
yield ++i;
}
function main() {
for (const o of foo()) {
print(o);
}
print("done.");
}
вот... решил самую крутую проблему в итераторах... а ты (С/C++) так можешь?
ASD_77 28.08.2021 13:18 # 0
ASD_77 28.08.2021 13:18 # 0
ASD_77 28.08.2021 13:21 # 0
ASD_77 28.08.2021 13:21 # 0
Kozel 28.08.2021 16:23 # 0
В моём воспалённом воображении генератор - это функция, возвращающая объект, содержащий:
- данные, нужные итератору (некое подобие замыкания, только содержит в первую очередь локальные переменные)
- адрес якобы-функции, которую надо вызвать для продолжения (и этот адрес равен nullptr, когда генератор закончен)
- собственно результат итерации.
Я что-то не учёл? Или распространённые кодогенераторы так не умеют?
bormand 28.08.2021 17:50 # 0
1) stackless. Здесь нам нужен контекст, в котором лежат "локалки" и какой-то маркер продолжения (число как в примерах Пи, указатель на "продолжение" как ты предложил и т.п.).
2) stackful. Здесь мы по-хардкору аллоцируем маленький стек и переключаемся на него и обратно. Пример есть в boost::coroutine.
guest6 28.08.2021 17:52 # 0
bormand 28.08.2021 17:54 # 0
guest6 28.08.2021 17:55 # 0
Кстати очень заебись выглядит. Можно делать вид, что ты на каждый чих запускаешь отдельный процесс, и течешь
bormand 28.08.2021 17:57 # +1
Именно поэтому Снаут за эрланг.
guest6 28.08.2021 17:58 # 0
каждая корутина может общаться с другими через посылки сообщений, получаются как-бы акторы
Там кстати есть еще structural concurrency, можно управлять деревом корутин
И есть еще flows, это как React{Java,JS}, можно делать почти что функциональщину (всякие холодные генераторы ленивые итд)
Desktop 28.08.2021 18:02 # +1
– какой obj c )))
guest6 28.08.2021 18:05 # 0
Desktop 28.08.2021 18:08 # +3
– это форум про вазэктомию?
3.14159265 28.08.2021 13:25 # +2
> а ты (С/C++) так можешь?
В «C» никаких проблем нет. Именно поэтому я за «C».
Ещё в прошлом треде показали:
https://ideone.com/jrswJB
ASD_77 28.08.2021 13:34 # 0
3.14159265 28.08.2021 13:41 # +4
По второму кругу? Серьёзно?
Всё уже было в прошлом треде.
IIIyqpymuHckuu_nemyx 28.08.2021 16:26 # 0
ASD_77 28.08.2021 16:55 # 0
а то охото позырять как там препроцессор поживает :)
bormand 28.08.2021 17:00 # +1
ASD_77 28.08.2021 17:16 # 0
j123123 28.08.2021 17:23 # +1
ASD_77 28.08.2021 17:48 # 0
j123123 28.08.2021 17:51 # 0
bormand 28.08.2021 17:51 # 0
З.Ы. Или на один меньше? Не суть.
bormand 28.08.2021 18:08 # +1
ASD_77 28.08.2021 18:19 # 0
bormand 28.08.2021 18:22 # 0
Ну для stackless корутин всегда нужна какая-то поддержка со стороны конпелятора. Хотя бы вот такой рудиментарный goto в середину функции.
А в LLVM IR разве нельзя впрыгнуть в произвольный блок (ну ок, разбив его в этой точке на джва и обмазав локалки phi'шками)?
ASD_77 28.08.2021 18:29 # 0
bormand 28.08.2021 19:11 # 0
Ну я же могу воткнуть phi'шку в начале блока и показать, что локалка приходит либо из предыдущего блока либо прилетает из блока с началом свича?
ASD_77 28.08.2021 20:03 # 0
bormand 28.08.2021 20:11 # 0
ASD_77 28.08.2021 20:25 # 0
ASD_77 28.08.2021 20:04 # 0
j123123 28.08.2021 20:14 # 0
ASD_77 28.08.2021 20:24 # 0
bormand 28.08.2021 20:44 # 0
ASD_77 28.08.2021 20:47 # 0
j123123 28.08.2021 21:02 # +1
Может тебе с такими говноограничениями лучше с "PHP" конкурировать, а не с сишкой и крестоговном?
ASD_77 28.08.2021 21:23 # 0
3.14159265 28.08.2021 21:53 # 0
Да. Сначала в Йаже. Потом в йажаСцрипте.
guest6 28.08.2021 22:43 # 0
Это же любимое развлечение скриптушков
Руби и перл вообще редкордсмены
ABryCTOBCKuu_nemyx 28.08.2021 22:44 # 0
guest6 28.08.2021 22:49 # +1
Не рекомендуется юзать локальные переменные без `my`, обращаться к ключам без кавычек итд
В руби рубикоп отключает много всяких фишек, ну и например рекомендует фрозен литералы (а не мутабельные)
3.14159265 28.08.2021 21:56 # +1
И опять мы приходим к тому о чём я уже говорил:
> Этой конструкции сильно помогает другая ключевая особенность Сишки (которая лалками считается говном).
> Возможность switch поставить case где угодно и прыгнуть вовнутрь цикла или ifа.
> А в анскильных сиподобных языках, даже при использовании препроцессора, такое бы просто не сконпелировалось.
https://govnokod.ru/27615#comment663353
ABryCTOBCKuu_nemyx 28.08.2021 22:31 # +1
Неструктурным был «Бейсик» до «Кубейсика» и «Фортран». Это уже потом в новомодном «Фортране-77» лалки добавили блочные операторы со словом «END», а раньше для всего были метки.
В классическом «Бейсике» (до того, как лалки из «Микрософта» добавили SUB и FUNCTION) можно было оптимизировать хвостовую рекурсию, несколько GOSUB'ов могли иметь общий RETURN. Код напоминал «Ассемблер».
Так может быть, есть смысл возродить «Бейсик» и «Фортран» (те самые неструктурные, с метками, ещё не испорченные лалками)?
bormand 28.08.2021 22:36 # 0
Да в общем-то ты и в няшной можешь не юзать структурные конструкции и ебашить всё через if и goto.
guest6 28.08.2021 22:38 # +2
3.14159265 28.08.2021 23:12 # 0
Кнут обоссыт твоего Дейкстру.
https://pic.plover.com/knuth-GOTO.pdf
Desktop 28.08.2021 23:14 # +2
от такого прямо хочется найти на помойке растянутый свитер с оленями, взять старую жёлтую клавиатуру и мышь с колёсиком и накатывать на hdd mandrake linux
ABryCTOBCKuu_nemyx 28.08.2021 23:22 # +1
Новодел! Нужно трёх- или вообще двухкнопочную!
Desktop 28.08.2021 23:22 # +3
шарик имелся в виду
ABryCTOBCKuu_nemyx 28.08.2021 23:00 # +1
В принципе, в «gcc» есть «computed goto». Можно навелосипедить стек для адресов возврата...
bormand 28.08.2021 23:02 # 0
Ты хочешь прям как в бейсике всё одним блоком внутри main'а? Ну да, computed goto и стек.
3.14159265 28.08.2021 23:22 # 0
Desktop 28.08.2021 23:23 # 0
descriptive
– это о чём?
ABryCTOBCKuu_nemyx 28.08.2021 23:30 # +2
bormand 28.08.2021 23:31 # 0
Какой багор )))
Хуже чем в дизасме.
Desktop 28.08.2021 23:38 # +2
Essentially the label declaration is much like an EXTERNAL declaration in Assembler (or C). I guess, since goto already breaks the whole idea of structured programming, Wirth didn't care to provide a nice solution, but simply hacked his way to satisfy a few exceptions, which he may have hoped to go away :)
ABryCTOBCKuu_nemyx 28.08.2021 23:41 # 0
j123123 28.08.2021 23:42 # +3
3.14159265 28.08.2021 23:46 # 0
Меня ещё дико бесило, что метки надо объявлять.
И если поменял имя/номер, то надо менять объявление.
Desktop 28.08.2021 23:51 # 0
Unlike often assumed, the label declaration within a procedure declaration is only needed for labels that are supposed to be accessed from outside a procedure as the goto definition explains
Desktop 28.08.2021 23:49 # +2
насколько я понимаю, это было сделано для упрощения парсера
с цифры могла начинаться только метка. то есть, встретил цифру в начале лексемы, значит, это метка
3.14159265 22.07.2022 16:54 # +1
Фак. Уже об этом сказано.
У цифровых меток есть ещё один неоспоримый плюс: возможность запилить в язык computed goto, со всеми вытекающими плюшками и баграми.
CBuHOCO6AKA 22.07.2022 17:17 # +1
С цифровыми метками можно сделать аорифметическое computed goto. С символьными computed goto тоже сделать можно, но придётся мутить со строками (больше памяти для хранения, нетривиальный инкремент).
В случае символьных меток можно запилить взятие адреса метки: label1 в правой части или @label1, чтобы было видно, что это взятие адреса. Взятие адреса цифровой метки будет выглядеть не так красиво (просто число в правой части будет неверно интерпретировано, придётся писать @1, а это тоже выглядит странно).
3.14159265 22.07.2022 17:43 # 0
Всё верно. Но можно пойти и обратным путём.
Добавить в цифровые метки поддержку символьных алиасов.
То есть не брать адрес у метки, а наоборот разыменовывать переменную/алиас.
Особый смак что появляется возможность создания динамических плавающих меток. Но конечно возможны коллизии.
CBuHOCO6AKA 22.07.2022 17:47 # +1
Напомнило шуточный ЯП с оператором COMEFROM вместо GOTO:
https://en.m.wikipedia.org/wiki/COMEFROM
3.14159265 22.07.2022 18:05 # 0
> Переменная метка — это жесть ваще.
Я привычно взял самый упоротый/гибкий вариант.
Можно ограничить эти алиасы compile-time константами вроде #define LABEL 20
guest6 22.07.2022 18:06 # 0
guest6 22.07.2022 17:48 # 0
3.14159265 22.07.2022 17:55 # 0
> goto i
Тут можно поучиться у брата Computed goto: Сишного switchа. Сделав default-метку как хендлер непонятных ситуаций.
Но если таковой нет, то оператор goto не срабатывает и мы просто выполняем следующую за ним строку.
Что тоже можно воспринимать как этот самый default:
guest6 22.07.2022 18:01 # 0
3.14159265 22.07.2022 18:14 # 0
ASLR и pic всё обосрут.
Тут несколько воренатов:
1. Считать такой goto UB.
2. Идти как ни в чём ни бывало дальше (так ведёт себя сишный свитч когда не находит матча).
3. Сегфолт / другое распидорашивание как у таблицы виртуальных методов
3.14159265 22.07.2022 16:38 # +1
> Просто оставил временный хак для тяжёлых случаев.
Не. Мне кажется тут более веская причина чем «не нравилось goto».
LL(1) грамматика.
Парсер грамматики в этом месте не знает что будет дальше?
С цифровыми лейбами такой проблемы нет, т.к. переменная не может начинаться с цифры, а присваивание цифровой константы 2:=3 безсмысленно.
CBuHOCO6AKA 22.07.2022 17:18 # 0
bormand 28.08.2021 23:27 # 0
Desktop 28.08.2021 23:15 # 0
3.14159265 28.08.2021 23:04 # 0
Подтверждаю.
No, the future isn't all that bad.
If you ignore the fact that it's "structured", even 'C' programming can be appreciated by the Real Programmer: after all, there's no type checking, variable names are seven (ten? eight?) characters long.
Аnd the added bonus of the Pointer data type is thrown in — like having the best parts of Fortran and assembly language in one place. (Not to mention some of the more creative uses for #define.)
3.14159265 28.08.2021 23:03 # +1
По-моему уже несколько раз обсуждали, что это были очень годные языки.
С передовой для своего времени динамической типизацией и отличным перформансом.
Ещё разбирали что не во всех диалектах встречалось вычислимое GOTO.
ABryCTOBCKuu_nemyx 28.08.2021 23:20 # 0
Статической. Тип нужно было указывать либо суффиксом ($ для строк в «Бейсике»; % для целых в реализациях «Бейсика», где целые и плавающие различались), либо он определялся первой буквой идентификатора (в «Фортране» с букв I, J, K, L, M, N начинались целые; в новых «Бейсиках» для назначения типа первой букве были операторы DEFINT, DEFSTR и т. п.), либо вообще явно для каждой переменной (DIM ... AS ... в «Бейсике»).
Были реализации «Бейсика» со словом REDIM, где тип можно было поменять (старая переменная уничтожалась).
3.14159265 28.08.2021 23:25 # +1
По-моему AS — новодел. У меня в интерпретаторе никакого AS не было (впервые я увидел его в QB)
А была система суффиксов.
DIM использовали для объявления массивов (многомерных).
Отсюда и название: DIMENSION.
> Статической.
Затем пользователя заставляют смешать целых и плавающих питухов.
bormand 28.08.2021 23:29 # +1
ABryCTOBCKuu_nemyx 28.08.2021 23:33 # +1
ABryCTOBCKuu_nemyx 28.08.2021 23:32 # 0
3.14159265 28.08.2021 23:37 # 0
> DEFINT, DEFSTR
Этого точно не было.
Зато была странная конструкция c умножением
DIM A(10)
DIM B$(2)*30
ABryCTOBCKuu_nemyx 28.08.2021 23:38 # +1
>> DEFINT, DEFSTR
> Этого точно не было.
Похоже, что DEFINT, DEFSTR «Кубейсик» утащил у «Фортрана».
3.14159265 28.08.2021 23:44 # 0
Офигеть. Уже не помню такого.
А в MS-диалектах такое было?
ABryCTOBCKuu_nemyx 28.08.2021 23:50 # 0
3.14159265 29.08.2021 00:04 # +1
В «Фортране» были 2х, 4х и 8ми байтные Integerы.
INTEGER*2
INTEGER*4
INTEGER*8
Синтаксиально похоже.
ABryCTOBCKuu_nemyx 29.08.2021 00:18 # 0
Вполне ожидаемо, языки похожие.
3.14159265 28.08.2021 23:49 # 0
Да.
А в QB/VB его смысл немного поменяли: оно использовалось для изменения размеров массивов, как аналог realloc.
Только если не написать With Preserve (вроде бы), то получишь массив с нулями.
ABryCTOBCKuu_nemyx 28.08.2021 23:53 # +1
3.14159265 28.08.2021 23:55 # 0
Удобная фигня (если с индексом не проёбывать).
Её потом йажасцриптеры своровали.
Но это точно было не в MS диалектах.
3.14159265 29.08.2021 01:11 # 0
Это дико удобно для сбора всякой статистики.
Конечно не так идеально, как ассоциативные массивы awk.
Но тем не менее не надо думать про память и пердолиться с постоянными Redim.
awk я до сих пор используя для ранжирования грепов из http-логов по кодам ошибок, времени ответа, и прочему.
guest6 29.08.2021 01:18 # 0
в перле тоже так можно, но это считается так себе практикой
см autovivification
3.14159265 29.08.2021 01:24 # 0
Первой ссылкой статья на вики.
Мразь поражённая синдромом цыпл утёнка с упоением пишет о пёрле, руби, йаже, рнр, путухе, с#.
И ни слова об origin языках (awk, BASIC) где это было задолго до появления той анскильной параши.
guest6 29.08.2021 01:27 # +1
Вообще Perl никогда не скрывал своей глубокой связи с `awk`: очень много чего он оттуда взял
ABryCTOBCKuu_nemyx 28.08.2021 23:47 # +1
Во-первых, в функцию скалярного аргумента можно было передать массив, тогда функция применялась к каждому элементу массива и возвращался массив результатов.
Во-вторых, неявные циклы были в операциях ввода-вывода.
3.14159265 28.08.2021 21:52 # +1
> а при использовании локальных переменных это почти не реально
Сишка. Возможности безграничны.
bormand 28.08.2021 16:22 # 0
Какой указатель )))
ASD_77 28.08.2021 16:56 # 0
prefix-not 29.08.2021 00:24 # 0
г генератор без *
guest6 29.08.2021 01:27 # 0
guest6 29.08.2021 01:40 # 0
bormand 29.08.2021 04:35 # 0
> zero knowledge in coding
Устроиться на курьера или упаковщика...