- 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++) так можешь?
В моём воспалённом воображении генератор - это функция, возвращающая объект, содержащий:
- данные, нужные итератору (некое подобие замыкания, только содержит в первую очередь локальные переменные)
- адрес якобы-функции, которую надо вызвать для продолжения (и этот адрес равен nullptr, когда генератор закончен)
- собственно результат итерации.
Я что-то не учёл? Или распространённые кодогенераторы так не умеют?
1) stackless. Здесь нам нужен контекст, в котором лежат "локалки" и какой-то маркер продолжения (число как в примерах Пи, указатель на "продолжение" как ты предложил и т.п.).
2) stackful. Здесь мы по-хардкору аллоцируем маленький стек и переключаемся на него и обратно. Пример есть в boost::coroutine.
Кстати очень заебись выглядит. Можно делать вид, что ты на каждый чих запускаешь отдельный процесс, и течешь
Именно поэтому Снаут за эрланг.
каждая корутина может общаться с другими через посылки сообщений, получаются как-бы акторы
Там кстати есть еще structural concurrency, можно управлять деревом корутин
И есть еще flows, это как React{Java,JS}, можно делать почти что функциональщину (всякие холодные генераторы ленивые итд)
– какой obj c )))
– это форум про вазэктомию?
> а ты (С/C++) так можешь?
В «C» никаких проблем нет. Именно поэтому я за «C».
Ещё в прошлом треде показали:
https://ideone.com/jrswJB
По второму кругу? Серьёзно?
Всё уже было в прошлом треде.
а то охото позырять как там препроцессор поживает :)
З.Ы. Или на один меньше? Не суть.
Ну для stackless корутин всегда нужна какая-то поддержка со стороны конпелятора. Хотя бы вот такой рудиментарный goto в середину функции.
А в LLVM IR разве нельзя впрыгнуть в произвольный блок (ну ок, разбив его в этой точке на джва и обмазав локалки phi'шками)?
Ну я же могу воткнуть phi'шку в начале блока и показать, что локалка приходит либо из предыдущего блока либо прилетает из блока с началом свича?
Может тебе с такими говноограничениями лучше с "PHP" конкурировать, а не с сишкой и крестоговном?
Да. Сначала в Йаже. Потом в йажаСцрипте.
Это же любимое развлечение скриптушков
Руби и перл вообще редкордсмены
Не рекомендуется юзать локальные переменные без `my`, обращаться к ключам без кавычек итд
В руби рубикоп отключает много всяких фишек, ну и например рекомендует фрозен литералы (а не мутабельные)
И опять мы приходим к тому о чём я уже говорил:
> Этой конструкции сильно помогает другая ключевая особенность Сишки (которая лалками считается говном).
> Возможность switch поставить case где угодно и прыгнуть вовнутрь цикла или ifа.
> А в анскильных сиподобных языках, даже при использовании препроцессора, такое бы просто не сконпелировалось.
https://govnokod.ru/27615#comment663353
Неструктурным был «Бейсик» до «Кубейсика» и «Фортран». Это уже потом в новомодном «Фортране-77» лалки добавили блочные операторы со словом «END», а раньше для всего были метки.
В классическом «Бейсике» (до того, как лалки из «Микрософта» добавили SUB и FUNCTION) можно было оптимизировать хвостовую рекурсию, несколько GOSUB'ов могли иметь общий RETURN. Код напоминал «Ассемблер».
Так может быть, есть смысл возродить «Бейсик» и «Фортран» (те самые неструктурные, с метками, ещё не испорченные лалками)?
Да в общем-то ты и в няшной можешь не юзать структурные конструкции и ебашить всё через if и goto.
Кнут обоссыт твоего Дейкстру.
https://pic.plover.com/knuth-GOTO.pdf
от такого прямо хочется найти на помойке растянутый свитер с оленями, взять старую жёлтую клавиатуру и мышь с колёсиком и накатывать на hdd mandrake linux
Новодел! Нужно трёх- или вообще двухкнопочную!
шарик имелся в виду
В принципе, в «gcc» есть «computed goto». Можно навелосипедить стек для адресов возврата...
Ты хочешь прям как в бейсике всё одним блоком внутри main'а? Ну да, computed goto и стек.
descriptive
– это о чём?
Какой багор )))
Хуже чем в дизасме.
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 :)
Меня ещё дико бесило, что метки надо объявлять.
И если поменял имя/номер, то надо менять объявление.
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
насколько я понимаю, это было сделано для упрощения парсера
с цифры могла начинаться только метка. то есть, встретил цифру в начале лексемы, значит, это метка
Фак. Уже об этом сказано.
У цифровых меток есть ещё один неоспоримый плюс: возможность запилить в язык computed goto, со всеми вытекающими плюшками и баграми.
С цифровыми метками можно сделать аорифметическое computed goto. С символьными computed goto тоже сделать можно, но придётся мутить со строками (больше памяти для хранения, нетривиальный инкремент).
В случае символьных меток можно запилить взятие адреса метки: label1 в правой части или @label1, чтобы было видно, что это взятие адреса. Взятие адреса цифровой метки будет выглядеть не так красиво (просто число в правой части будет неверно интерпретировано, придётся писать @1, а это тоже выглядит странно).
Всё верно. Но можно пойти и обратным путём.
Добавить в цифровые метки поддержку символьных алиасов.
То есть не брать адрес у метки, а наоборот разыменовывать переменную/алиас.
Особый смак что появляется возможность создания динамических плавающих меток. Но конечно возможны коллизии.
Напомнило шуточный ЯП с оператором COMEFROM вместо GOTO:
https://en.m.wikipedia.org/wiki/COMEFROM
> Переменная метка — это жесть ваще.
Я привычно взял самый упоротый/гибкий вариант.
Можно ограничить эти алиасы compile-time константами вроде #define LABEL 20
> goto i
Тут можно поучиться у брата Computed goto: Сишного switchа. Сделав default-метку как хендлер непонятных ситуаций.
Но если таковой нет, то оператор goto не срабатывает и мы просто выполняем следующую за ним строку.
Что тоже можно воспринимать как этот самый default:
ASLR и pic всё обосрут.
Тут несколько воренатов:
1. Считать такой goto UB.
2. Идти как ни в чём ни бывало дальше (так ведёт себя сишный свитч когда не находит матча).
3. Сегфолт / другое распидорашивание как у таблицы виртуальных методов
> Просто оставил временный хак для тяжёлых случаев.
Не. Мне кажется тут более веская причина чем «не нравилось goto».
LL(1) грамматика.
Парсер грамматики в этом месте не знает что будет дальше?
С цифровыми лейбами такой проблемы нет, т.к. переменная не может начинаться с цифры, а присваивание цифровой константы 2:=3 безсмысленно.
Подтверждаю.
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.)
По-моему уже несколько раз обсуждали, что это были очень годные языки.
С передовой для своего времени динамической типизацией и отличным перформансом.
Ещё разбирали что не во всех диалектах встречалось вычислимое GOTO.
Статической. Тип нужно было указывать либо суффиксом ($ для строк в «Бейсике»; % для целых в реализациях «Бейсика», где целые и плавающие различались), либо он определялся первой буквой идентификатора (в «Фортране» с букв I, J, K, L, M, N начинались целые; в новых «Бейсиках» для назначения типа первой букве были операторы DEFINT, DEFSTR и т. п.), либо вообще явно для каждой переменной (DIM ... AS ... в «Бейсике»).
Были реализации «Бейсика» со словом REDIM, где тип можно было поменять (старая переменная уничтожалась).
По-моему AS — новодел. У меня в интерпретаторе никакого AS не было (впервые я увидел его в QB)
А была система суффиксов.
DIM использовали для объявления массивов (многомерных).
Отсюда и название: DIMENSION.
> Статической.
Затем пользователя заставляют смешать целых и плавающих питухов.
> DEFINT, DEFSTR
Этого точно не было.
Зато была странная конструкция c умножением
DIM A(10)
DIM B$(2)*30
>> DEFINT, DEFSTR
> Этого точно не было.
Похоже, что DEFINT, DEFSTR «Кубейсик» утащил у «Фортрана».
Офигеть. Уже не помню такого.
А в MS-диалектах такое было?
В «Фортране» были 2х, 4х и 8ми байтные Integerы.
INTEGER*2
INTEGER*4
INTEGER*8
Синтаксиально похоже.
Вполне ожидаемо, языки похожие.
Да.
А в QB/VB его смысл немного поменяли: оно использовалось для изменения размеров массивов, как аналог realloc.
Только если не написать With Preserve (вроде бы), то получишь массив с нулями.
Удобная фигня (если с индексом не проёбывать).
Её потом йажасцриптеры своровали.
Но это точно было не в MS диалектах.
Это дико удобно для сбора всякой статистики.
Конечно не так идеально, как ассоциативные массивы awk.
Но тем не менее не надо думать про память и пердолиться с постоянными Redim.
awk я до сих пор используя для ранжирования грепов из http-логов по кодам ошибок, времени ответа, и прочему.
в перле тоже так можно, но это считается так себе практикой
см autovivification
Первой ссылкой статья на вики.
Мразь поражённая синдромом цыпл утёнка с упоением пишет о пёрле, руби, йаже, рнр, путухе, с#.
И ни слова об origin языках (awk, BASIC) где это было задолго до появления той анскильной параши.
Вообще Perl никогда не скрывал своей глубокой связи с `awk`: очень много чего он оттуда взял
Во-первых, в функцию скалярного аргумента можно было передать массив, тогда функция применялась к каждому элементу массива и возвращался массив результатов.
Во-вторых, неявные циклы были в операциях ввода-вывода.
> а при использовании локальных переменных это почти не реально
Сишка. Возможности безграничны.
Какой указатель )))
г генератор без *
> zero knowledge in coding
Устроиться на курьера или упаковщика...