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