(list prev)
(let*
((line (car lines))
- (parser (getf (cadr (find-if #1'(funcall (getf $1 :checker) line) (reverse *line-parsers*) :key #'cadr)) :parser)))
+ (parser
+ (getf
+ (cadr (find-if (lambda (parser) (funcall (getf parser :checker) line)) (reverse *line-parsers*) :key #'cadr))
+ :parser)))
(when (not parser) (error "Weird! Couldn't find a match for ~A" line))
(multiple-value-bind (parsed-line squash-prev suspension) (funcall (funcall parser line) prev)
- (cond
+ (cond
(squash-prev (parse-lines (cdr lines) parsed-line))
(suspension
(let*
(defun parse-inline (str)
(let
- ((parser (getf (cadr (find-if #1'(funcall (getf $1 :checker) str) (reverse *inline-parsers*) :key #'cadr)) :parser)))
+ ((parser
+ (getf
+ (cadr (find-if (lambda (parser) (funcall (getf parser :checker) str)) (reverse *inline-parsers*) :key #'cadr))
+ :parser)))
(if parser (funcall parser str) str)))
(defmacro defline-parser (regex handler)
(let
((regex (format nil "^~A$" regex)))
`(progn
- (when (not (utils:strassoc ,regex *line-parsers*)) (push (list ,regex nil) *line-parsers*))
- (setf (utils:strassoc ,regex *line-parsers*)
- (list
- :checker (lambda (str) (cl-ppcre:scan ,regex str))
- :parser (lambda (str)
- (apply
- (function ,handler)
- (mapcar
- #'as-text
- (coerce (second (multiple-value-list (cl-ppcre:scan-to-strings ,regex str))) 'list)))))))))
+ (when (not (find ,regex *line-parsers* :key #'car :test #'string=)) (push (list ,regex nil) *line-parsers*))
+ (let
+ ((parser (find ,regex *line-parsers* :key #'car :test #'string=)))
+ (setf
+ (cadr parser)
+ (list
+ :checker (lambda (str) (cl-ppcre:scan ,regex str))
+ :parser (lambda (str)
+ (apply
+ (function ,handler)
+ (mapcar
+ #'as-text
+ (coerce (second (multiple-value-list (cl-ppcre:scan-to-strings ,regex str))) 'list))))))))))
(defmacro definline-parser (regex handler)
(let
((regex (format nil "^~A$" regex)))
`(progn
- (when (not (utils:strassoc ,regex *inline-parsers*)) (push (list ,regex nil) *inline-parsers*))
- (setf (utils:strassoc ,regex *inline-parsers*)
- (list
- :checker (lambda (str) (cl-ppcre:scan ,regex str))
- :parser (lambda (str)
- (apply (function ,handler)
- (mapcar
- #'parse-inline
- (coerce (second (multiple-value-list (cl-ppcre:scan-to-strings ,regex str))) 'list)))))))))
+ (when (not (find ,regex *inline-parsers* :key #'car :test #'string=)) (push (list ,regex nil) *inline-parsers*))
+ (let
+ ((parser (find ,regex *inline-parsers* :key #'car :test #'string=)))
+ (setf
+ (cadr parser)
+ (list
+ :checker (lambda (str) (cl-ppcre:scan ,regex str))
+ :parser (lambda (str)
+ (apply (function ,handler)
+ (mapcar
+ #'parse-inline
+ (coerce (second (multiple-value-list (cl-ppcre:scan-to-strings ,regex str))) 'list))))))))))
; each parser function needs to return a function that takes the previous line and returns
;