Привет, решил поближе изучить common lisp. Использую реализацию clisp под DragonFlyBSD (то, о чём я буду писать ниже, будет касаться и linux)
Написал тут свою программку для проверки запоминания иностранных слов.
Тестовый файл:
http://shamazmazum.users.sourceforge.net/test
Прога:
http://shamazmazum.users.sourceforge.net/mnemonic.tar
Принцип прост: составляем файл вида:
форма_слова11 - перевод
форма_слова12 - перевод
....
%
форма_слова21 - перевод
форма_слова22 - перевод
....
итд.
Запускаем strfile имя_файла и получаем бинарник, используемый для произвольного чтения строк. (Как раз эта программа ещё используется для фортунок, которые тоже состоят из строк, разделенных символом %)
Дальше запускаем программу (нужен asdf, cl-gtk2, cl-utilities): (asdf:load-system :mnemonic) (mnemonic:run),
выбираем файл словаря (test) и индекс для произвольного доступа (test.dat) и нажимаем "Start test". В общем, легко разобраться)
Теперь, собственно, вопрос:
У программы есть недостаток (которого бы не было, если бы я выбрал C:) - это то, что в 32 и 64 битных системах тип в C long имеет разную длину (ничего не путаю? 4 против 8), а strfile как раз хранит значения смешений и значения в шапке в unsigned long, а fseek их принимает:
http://www.cppreference.com/wiki/io/c/fseek
http://pwet.fr/man/linux/commandes/strfile
Так как же заставить работать программу и под 32- и под 64-битные системы? Пока можно изменить значение переменной где-то в dictio.lisp, но это ведь не выход!
Также интересует возможность читать файлы относительно большими блоками (так ведь быстрее, да?). Пока я делаю так:
(let ((a (open file-name :direction :input :element-type (list 'unsigned-byte (* 8 *long-size*))))) (read-byte a))
Интересно, что будет, если я укажу большое значение с unsigned-byte, и read-byte пока не достигнет конца файла, но уже и не сможет прочитать такой большой блок. Похоже, если я всё правильно делаю, вернет ошибку. А до конца высосать файл как-то можно?