‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

worklog: векторный тип

В силу того, что минимальная гранула памяти, которой оперирует моя, не побоюсь этого термина, виртуальная машина - это ячейка, организация Си-подобных массивов затруднена (ибо в них минимальная гранула это байт, как правило). Зато можно сделать вектор! Это почти массив, только элементы могут быть любого типа. Адресоваться к ним можно так же, как в массиве - по индексу. Производительность, особенно когда элементов "много", должна быть заметно выше, чем у простого списка.

Экспериментальный код выглядит так:

/** ... **/
arr = create_atom (UCL_TYPE_VECTOR, UCL_INT(10));
symbol_intern (&environment, create_atom (UCL_TYPE_SYMBOL, "zulu"));
symbol_set_value (environment, create_atom (UCL_TYPE_SYMBOL, "zulu"), arr);

VECTOR_set_element (arr, create_atom (UCL_TYPE_UINT32, UCL_INT(0)), create_atom (UCL_TYPE_SYMBOL, "Romeo"));
VECTOR_set_element (arr, create_atom (UCL_TYPE_UINT32, UCL_INT(1)), create_atom (UCL_TYPE_STRING, "Yankee"));
VECTOR_set_element (arr, create_atom (UCL_TYPE_UINT32, UCL_INT(2)), create_atom (UCL_TYPE_INT32, UCL_INT(-2)));
/* next one will fail */
VECTOR_set_element (arr, create_atom (UCL_TYPE_UINT32, UCL_INT(123)), create_atom (UCL_TYPE_SYMBOL, "yankee"));

VECTOR_set_element (symbol_get_value (environment, create_atom (UCL_TYPE_SYMBOL, "zulu")), 
    create_atom (UCL_TYPE_UINT32, UCL_INT(9)), create_atom (UCL_TYPE_SYMBOL, "juliette"));

printf ("Array length: ");
print_this(VECTOR_get_length (arr));
printf ("\n");
garbage_collector_mark_and_sweep();
printf("environment after: "); debug_list (environment); printf ("\n");
/** ... **/



А результат его работы - так:

Error: array index out of bounds
Array length: 10
environment after: ( ( ZULU . [ ROMEO "Yankee" -2 NIL NIL NIL NIL NIL NIL JULIETTE ] ) )



Сборщик мусора реально помогает: раньше приходилось вручную удалять ячейки, ставшие ненужными: например, в этом длинном вызове, где эмулирую (vector-set-element zulu 9 juliette) - да, в CL нету именно такого API, но я и не собираюсь создавать стопроцентно совместимое.
Tags: uncommon lisp
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments