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

Jan 10, 2016 06:11

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

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


/** ... **/
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, но я и не собираюсь создавать стопроцентно совместимое.

uncommon lisp

Previous post Next post
Up