LINUX.ORG.RU

Вопрос начинающего по Erlang


0

0

Добрый день. Разбираюсь потиху с Erlang и с функциональным
программированием, сразу возникло несколько вопросов: например, есть-ли
возможность в списке (list) поменять два элемента местами, при этом не
создавая дополнительного списка, то есть чтобы операция происходила на
месте?

Из

[4,1,3,2,5,6]
     ^^^

получить

[4,1,2,3,5,6]
     ^^^
★★★★

Ответил товарищ teo из linux@c.j.r. Списки, кортежи, как и переменные могут биндиться только один раз, так что, судя по всему, на месте это сделать нельзя.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от Bohtvaroh

Ерланг ведь функциональный? Возможно, компилятор заценит, что изначальный вариант списка никто использовать не будет и сделает modification in place.

Kpoxman ★★
()

Немного оффтопик. А ты часом книжку по Эрлангу(которая недавно вышла) нигде не нашел?

Cris
()
Ответ на: комментарий от Bohtvaroh

а если посмотреть в исходники otp, то можно увидеть, что присваивание происходит так(сначала куча проверок на соответствие типов):
а)создание нового кортежа той же длины
б)изменение значения элемента в созданном кортеже по требуемой позиции

bik ★★
()
Ответ на: комментарий от Cris

> Немного оффтопик. А ты часом книжку по Эрлангу(которая недавно вышла) нигде не нашел?

Нет, к сожалению, если имеется ввиду эта: http://pragmaticprogrammer.com/titles/jaerlang/index.html . Наверное, куплю pdf-ку. Ещё было бы здорово достать Erlang Book Part 2.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от bik

> а если посмотреть в исходники otp...

А можно тыкнуть на это место в исходниках OTP, я в них пока не ориентируюсь.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от Bohtvaroh

otp_src_R11B-4/erts/emulator/beam/bif.c
BIF_RETTYPE setelement_3(BIF_ALIST_3)
{
    Eterm* ptr;
    Eterm* hp;
    Eterm* resp;
    Uint ix;
    Uint size;
 
    if (is_not_small(BIF_ARG_1) || is_not_tuple(BIF_ARG_2)) {
    error:
        BIF_ERROR(BIF_P, BADARG);
    }
    ptr = tuple_val(BIF_ARG_2);
    ix = signed_val(BIF_ARG_1);
    size = arityval(*ptr) + 1;   /* include arity */
 
    if ((ix < 1) || (ix >= size)) {
        goto error;
    }

    hp = HAlloc(BIF_P, size);

    /* copy the tuple */
    resp = hp;
    while (size--) {            /* XXX use memcpy? */
        *hp++ = *ptr++;
    }
    resp[ix] = BIF_ARG_3;
    BIF_RET(make_tuple(resp));
}

bik ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.