Многомерные массивы в C на самом деле являются массивами массивов. (Это не может быть любым другим способом, так как RAM по своей природе линейна). Вы можете эмулировать их для линейных массивов в терминах арифметики указателей:
#undef NDEBUG
#include <assert.h>
#include <stdint.h>
int main()
{
typedef uint32_t TYPE;
enum{A=3,B=4,C=5};
TYPE a[A][B][C];
assert((char*)&a[1][2][3] == ((char*)&a) + \
3*sizeof(TYPE) + 2 *C*sizeof(TYPE) + 1 *B*C*sizeof(TYPE));
}
Компьютеры не позволяют вам обращаться к типам под-символов, но нетрудно представить тип под-символов.
Вышеуказанное вычисление смещения символа для адресации [1] [2] [3] можно переписать как
char_ix = (3*sizeof(TYPE)*CHAR_BIT + 2 *C*sizeof(TYPE)*CHAR_BIT + 1 *B*C*sizeof(TYPE)*CHAR_BIT)/CHAR_BIT;
, и если вместо символов (8 бит) вы хотите обратиться, например, 4 -бит, вы бы изменили его на
char_ix_of_4_bit =
(3*sizeof(TYPE)*CHAR_BIT/2 +
2 *C*sizeof(TYPE)*CHAR_BIT/2 +
1 *B*C*sizeof(TYPE)*CHAR_BIT/2) \
/ CHAR_BIT; //2 4-bits per octet
char_ix_of_4_bit_remainder =
(3*sizeof(TYPE)*CHAR_BIT/2 +
2 *C*sizeof(TYPE)*CHAR_BIT/2 +
1 *B*C*sizeof(TYPE)*CHAR_BIT/2) \
% CHAR_BIT; //2 4-bits per octet
4-битное значение в месте назначения будет тогда
((unsigned char*)&a)[char_ix_of_4_bit] >> (4*char_ix_of_4_bit_remainder)
аналогично для других битовых групп.
Короче говоря, вы можете думать о многомерных битовых массивах, заново представлять их как линейные битовые массивы, а затем использовать регулярное индексирование и сдвиг битов для адресации соответствующей битовой группы или отдельных битов (IIRC, C ++ std::bitset
/ std::vector<bool>
скрывают последняя часть посвящена индексации битов с помощью перегруженного оператора [], но это не сложно сделать вручную (это то, что вам нужно делать в чистом C, так как в чистом C нет перегрузки операторов).
montezuma является тем же самым как lucene, но записанный в шепелявости.
я не думаю, что любой использует это активно, ни что это в большой степени протестировало..., но это - хорошее начало, если Вы хотите работать над самой вещью. это уже имеет наиболее использованные функции. считайте архив группы Google для получения ощущения...
Я знаю, что Вы спрашиваете о языке Common LISP, но существуют ориентированные приложения поискового сервиса многого инвертированного текста. Одним известным и уважаемым на является Lucene.
Решение могло состоять в том, чтобы использовать ту поисковую систему, но соединить интерфейсом с Вашим кодом языка Common LISP через веб-сервис API? (xml-rpc, xml по http или просто тексту по http)?
Существует ли дальнейшая причина, почему Вы хотели бы, чтобы она была в языке Common LISP? Пакеты как Lucene могут покрыть все связанные с поиском функции, в которых Вы нуждаетесь, в то время как использование удаленного API может все еще позволить Вам выполнять свою более сложную логику в языке Common LISP.