- `(multiple-value-bind (,value ,win ,consumedp) (parse ,parser)
- (cond (,win
- (values ,value ,win ,consumedp))
- (t
- ,(parser-restore-place context place)
- (values ,value ,win nil)))))))
+ `(macrolet ((commit-peeked-place ()
+ `(progn
+ ,',(parser-release-place context place)
+ (setf ,',place nil))))
+ (multiple-value-bind (,value ,win ,consumedp) (parse ,parser)
+ (cond ((or ,win (null ,place))
+ (values ,value ,win ,consumedp))
+ (t
+ ,(parser-restore-place context place)
+ (values ,value ,win nil))))))))
+
+(defun commit-peeked-place ()
+ "Called by `commit' not lexically within `peek'."
+ (error "`commit' is not within `peek'."))
+
+(export 'commit)
+(defparse commit ()
+ "Commit to the current parse.
+
+ This releases the place captured by the innermost lexically enclosing
+ `peek'."
+ '(progn
+ (commit-peeked-place)
+ (values nil t nil)))