;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Aug 2002
;;;;
-;;;; $Id: lml.cl,v 1.8 2002/09/16 09:45:50 kevin Exp $
+;;;; $Id: lml.cl,v 1.13 2002/09/16 10:18:19 kevin Exp $
;;;;
;;;; This file, part of LML, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">")
(defun xml-prologue-string ()
- "version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>")
+ "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>")
(defun xhtml-prologue-string ()
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">")
(html :xmlns "http://www.w3.org/1999/xhtml"
,@body)))
+(defun new-string ()
+ (make-array 1024 :fill-pointer 0 :adjustable t :element-type 'character))
+
(set-macro-character #\[
#'(lambda (stream char)
(declare (ignore char))
- (let ((curr-string (make-array 1024 :fill-pointer 0 :adjustable t :element-type 'character))
+ (let ((forms '())
+ (curr-string (new-string))
+ (paren-level 0)
(got-comma nil))
(do ((ch (read-char stream t nil t) (read-char stream t nil t)))
((eql ch #\]))
(if (eql ch #\()
;; Starting top-level ,(
(progn
- (lml-print curr-string)
- (setf (fill-pointer curr-string) 0)
+ (push `(lml-print ,curr-string) forms)
+ (setq curr-string (new-string))
(setq got-comma nil)
(vector-push #\( curr-string)
(do ((ch (read-char stream t nil t) (Read-char stream t nil t)))
- ((eql ch #\)))
+ ((and (eql ch #\)) (zerop paren-level)))
(when (eql ch #\])
(format *trace-output* "Syntax error reading #\]")
(return nil))
+ (case ch
+ (#\(
+ (incf paren-level))
+ (#\)
+ (decf paren-level)))
(vector-push-extend ch curr-string))
(vector-push-extend #\) curr-string)
- (let ((result (eval (read-from-string curr-string))))
- (when result
- (lml-print result)))
- (setf (fill-pointer curr-string) 0))
+ (let ((eval-string (read-from-string curr-string))
+ (res (gensym)))
+ (push
+ `(let ((,res ,eval-string))
+ (when ,res
+ (lml-print ,res)))
+ forms))
+ (setq curr-string (new-string)))
;; read comma, then non #\( char
(progn
(unless (eql ch #\,)
(progn
(setq got-comma nil)
(vector-push-extend ch curr-string)))))
- (lml-print curr-string))
- t))
+ (push `(lml-print ,curr-string) forms)
+ `(progn ,@(nreverse forms)))))