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