Size: a a a

Эликсир и Вунш

2019 August 26

TT

Taras 🦀 Taraskin in Эликсир и Вунш
блин, вот что бывает, когда функциональщики пишут сишный код https://github.com/erlang/otp/blob/3715839afb532c156771b8daddcba03fb2902502/erts/emulator/beam/erl_bif_lists.c#L1162
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
хрен его пойми, как сам разворот в памяти происходит)
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
да, не на 100% уверен, но кажется, что да
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
список должен быть односвязный, короче. и указатель есть только на первую ноду в этом списке
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
вот чтоб сделать ++ или там еще что-то, в реальности нужно пройти весь список первый до конца
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
чтобы найти последний элемент
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
бинарь же — последовательный кусок памяти, он хранится как просто указатель на начало и длина. соответственно, тебе без разницы, ты и первый элемент этого бинаря найдешь и последний по сути одинаково быстро
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
ну пару сложений нужно будет выполнить — но это неважно. от размера бинаря это не зависит
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
а вот у списка зависит
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
и даже если компилятор делает ту оптимизацию, о которой я выше сказал, вот это уже он никак не сможет убрать
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
вот если бы в списке хранился указатель на конец этого списка, то да, можно было бы сразу переместиться в конец
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
но что-то мне подсказывает, что struct _eterm *tail; — это именно "хвост" в функциональном понимании. т.е. все, кроме первого элемента
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
а не указатель на конец
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
потому что если это не так, то будет не очень понятно, где хранится указатель на следующий. _eterm *head — это должен быть текущий элемент (голова списка), произвольный терм
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
одно меня правда смущает, почему struct _eterm *tail;, а не struct Erl_List *tail;
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
ну да ладно
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
в любом случае, при использовании ++ это тоже надо иметь ввиду
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
тут что-то аяй?)
я не понял
источник

TT

Taras 🦀 Taraskin in Эликсир и Вунш
ну CAR, CDR, CONS
источник