Quick Notes #
hacking, February 5th 2008
The only valid measurement of code quality: WTFM
Getting Git series will continue later this week, but in the meanwhile I would like to bring to your attention an oft-forgotten output operator in Common Lisp: WRITE. It is perfect for both REPL and code in many cases, since you don't need to bind printer control variables around it — just pass the ones you care about as keywords. Similarly, you don't have to worry about it munging variables your callers may care about.
Presenting ESRAP 0.1. It is a simple packrat parser for Common Lisp. It's been almost a year since I wrote it, and it seems unlikely that I'll work more on it in near future. In its current state it is neither particularly optimized or polished, nor does it have a great deal of fancy features, but it did what I needed it to do at the time, and I figured someone else might find it a more useful starting point for their own needs then CL-PEG. The feature list reads:
- dynamic redefinition of nonterminals
- inline grammars
- semantic predicates
- simple introspective facilities
Examples:
(parse '(or "foo" "bar") "foo") ⇒ "foo", NIL (add-rule 'foo+ (make-instance 'rule :expression '(+ "foo"))) ⇒ FOO+ (parse 'foo+ "foofoofoo") ⇒ ("foo" "foo" "foo"), NIL (add-rule 'decimal (make-instance 'rule :expression '(+ (or "0" "1" "2" "3" "4" "5" "6" "7" "8" "9")) :transform (lambda (list) (parse-integer (format nil "~{~A~}" list))))) ⇒ DECIMAL (parse '(oddp decimal) "123") ⇒ 123, NIL (handler-case (parse '(oddp decimal) "124") (error (e) (format t "~&oops: ~A~%" e))) ⇒ NIL ; output oops: Expression (ODDP DECIMAL) failed at 0. (parse 'foo+ "foofoofoobar" :junk-allowed t) ⇒ ("foo" "foo" "foo"), 9 (parse '(evenp decimal) "123" :junk-allowed t) ⇒ NIL, 0 (add-rule 'foos-or-decimal (make-instance 'rule :expression '(or foo+ decimal))) ⇒ FOOS-OR-DECIMAL (describe-grammar 'foos-or-decimal) ⇒ NIL ; output Grammar FOOS-OR-DECIMAL: FOOS-OR-DECIMAL <- (OR FOO+ DECIMAL) FOO+ <- (+ "foo") DECIMAL <- (+ (OR "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
Existence of bugs is guaranteed. Licence is zero-clause MIT.