Я занимаюсь проектом, который включает в себя анализ историй обычных репозиториев на lisp. Мне нужно разобрать их в списки списков или что-то в этом роде. В идеале я бы хотел сохранить как можно больше исходного синтаксиса исходного файла. Например, в случае текста #+sbcl <something>
, который, я думаю, означает «Если наш текущий lisp - sbcl, прочитайте <something>
, в противном случае пропустите его», я хотел бы получить что-то вроде (#+ 'sbcl <something>)
.
Первоначально я написал LALR-парсер на Python, который работал, но по многим причинам он не идеален. У меня много трудностей с получением правильного вывода, и у меня есть тонны особых случаев, которые нужно добавить.
Я подумал, что на самом деле я должен использовать сам lisp, поскольку в него уже встроен парсер lisp. Если бы я мог просто прочитать файл в sexps, я бы мог его записать во что-нибудь (подойдет cl-json) для дальнейшей обработки по линии.
К сожалению, когда я пытаюсь прочитать https://github.com/fukamachi/woo/blob/master/src/woo.lisp,, я получаю ошибку
There is no package with the name WOO.EV.TCP
, который, конечно, идет из строки 80 этого файла, поскольку этот пакет определен в src/ev/tcp.lisp
, а мы его не читали.
В принципе, возможно ли просто прочитать файл в sexps, не заботясь о том, определены ли пакеты или они содержат соответствующие символы? Если так, то как? Я попытался просмотреть документацию по читателю HyperSpec, но не вижу ничего, что звучит уместно.
Я на практике не пишу общий lisp, но потенциально возможно возможно взломать, обработав неопределенное условие пакета, создав пустой пакет с таким именем и обработав Условие условного обозначения имени в пакете, просто заключая данный символ. Я думаю . Я не знаю, как на самом деле это сделать, я не знаю, сработает ли это, я не знаю, сколько будет особых случаев. Случайно, первое условие называется no-such-package
, но второе (по крайней мере, в sbcl) называется simple-error
, поэтому я даже не знаю, как определить, является ли этот конкретный simple-error
символом такого-не-такого -in-that-package error, не говоря уже о том, как извлечь соответствующие имена из условия, исправить его и перезапустить. Мне бы очень хотелось услышать от обычного эксперта по LISP, что это правильное решение, прежде чем я попытаюсь сделать это таким образом, потому что это потребует много знаний.
Мне также кажется, что я мог бы это исправить, просто собрав файл перед его чтением. Например. превращая woo.ev.tcp:start-listening-socket
в, скажем, woo.ev.tcp===start-listening-socket
. Мне не особенно нравится это решение, и не ясно, что я не столкнусь с множеством более отвратительных особых случаев, но оно может сработать, если нет лучшего ответа.