Skip to content

Instantly share code, notes, and snippets.

@kurohuku
Created October 4, 2010 04:45
Show Gist options
  • Save kurohuku/609254 to your computer and use it in GitHub Desktop.
Save kurohuku/609254 to your computer and use it in GitHub Desktop.
(asdf:oos 'asdf:load-op :cl-ppcre)
(defpackage expect
(:use :cl :cl-ppcre)
(:export expect expect-strings))
(in-package expect)
(defmacro expect (port (&rest options) &body clauses)
(let ((ch (gensym "ch"))
(str (gensym "str"))
(p (gensym "port"))
(eof (gensym "eof"))
(next (gensym "next")))
`(let ((,p ,port)
(,str ""))
(labels ((,next ()
(let ((,ch (read-char ,p nil ',eof)))
(unless (eq ',eof ,ch)
(setf ,str
(concatenate 'string ,str (string ,ch)))
(cond
,@(mapcar
#'(lambda (clause)
`((funcall ,(car clause) ,str)
,@(cdr clause)))
clauses)
(T (,next)))))))
(,next)))))
(defmacro expect-strings (port (&rest options) &body clauses)
(let ((syms (mapcar #'(lambda (_) (gensym)) clauses))
(s (gensym)))
`(let ,(mapcar
#'(lambda (clause sym)
`(,sym (lambda (,s)
(cl-ppcre:all-matches
,(car clause)
,s))))
clauses
syms)
(expect ,port (,@options)
,@(mapcar
#'(lambda (clause sym)
`(,sym ,@(cdr clause)))
clauses
syms)))))
;;
(with-input-from-string (s "Hello,World")
(expect-strings s ()
("Foo" (print 0))
("Hello" (print 1))
("World" (print 2))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment