r2835: *** empty log message ***
[lml.git] / lml.cl
diff --git a/lml.cl b/lml.cl
index 4f73fdb071206b0b592053669da37c8f35f64ca5..c3542bb423a88a28dc3ee5d481484b80a138f826 100644 (file)
--- a/lml.cl
+++ b/lml.cl
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Aug 2002
 ;;;;
-;;;; $Id: lml.cl,v 1.6 2002/09/16 09:36:27 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
 ;;;;
@@ -23,7 +23,7 @@
   "<!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
-                   (princ 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)
-                   (princ (eval (read-from-string curr-string)))
-                   (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)))))
-       (princ curr-string))
-      t))
+       (push `(lml-print ,curr-string) forms)
+       `(progn ,@(nreverse forms)))))