Скажи мне, как фанат Лиспа, есть какой-нибудь вменяемый способ прочитать файл, который состоит как бы из s-exp, но при этом относится к точкам, запятым и прочей лабуде как к обычным буквам, т.е. считать точку как символ, а не конструктор dotted pair и т.п.
Спасибо, почти идеально, основная неувязка с пунктом 1) разрывает n't на два слова и сдвоенные одинарные кавычки. А чем плохо, то, что все интернируется? То что сборщик мусора их потом не удаляет? Зато каждое слово только один раз в памяти сохраняется. А в строки мне вроде и не надо их обращать.
есть всякие генераторы парсеров, усё как у людёв. я ими никакими не пользовался, правда, так что ничего умного сказать не могу. cl-yacc должен выглядеть достаточно привычно, наверно.
Comments 34
Reply
Reply
Reply
Reply
Reply
Reply
Reply
хотя с берлинцев станется в любом случае наплевать. :)
Reply
Reply
например, так:
(defvar *my-readtable* (copy-readtable))
(defun read-as-is (stream char)
(declare (ignore stream))
char)
(set-macro-character #\. #'read-as-is t *rt*)
(set-macro-character #\: #'read-as-is t *rt*)
(set-macro-character #\# #'read-as-is t *rt*)
(setf (readtable-case *rt*) :preserve)
(defun read-almost-but-not-quite-sexp (stream)
(let ((*read-eval* nil)
(*readtable* *rt*))
(read stream)))
"определённые пределы" заданы прискорбной негибкостью стандартного ридера. к примеру ( ... )
Reply
почти идеально, основная неувязка с пунктом 1) разрывает n't на два слова и сдвоенные одинарные кавычки.
А чем плохо, то, что все интернируется? То что сборщик мусора их потом не удаляет? Зато каждое слово только один раз в памяти сохраняется. А в строки мне вроде и не надо их обращать.
А парсить ручками, или есть снандартные средства?
Reply
угу, на #\' тоже надо read-as-is повесить.
А парсить ручками, или есть снандартные средства?
есть всякие генераторы парсеров, усё как у людёв.
я ими никакими не пользовался, правда, так что ничего умного сказать не могу.
cl-yacc должен выглядеть достаточно привычно, наверно.
Reply
Leave a comment