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.