r3729: *** empty log message ***
authorKevin M. Rosenberg <kevin@rosenberg.net>
Sat, 4 Jan 2003 13:26:14 +0000 (13:26 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Sat, 4 Jan 2003 13:26:14 +0000 (13:26 +0000)
base.lisp
debian/changelog
doc/readme.html

index 85a59117fc1b81e94cf59e178e1a86de1011a5da..421eac0d8aefd2efd310ec8ff6f7e55bdd9dab61 100644 (file)
--- a/base.lisp
+++ b/base.lisp
@@ -1,4 +1,4 @@
-;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
 ;;;; *************************************************************************
 ;;;; FILE IDENTIFICATION
 ;;;;
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Aug 2002
 ;;;;
-;;;; $Id: base.lisp,v 1.1 2002/12/29 09:10:41 kevin Exp $
+;;;; $Id: base.lisp,v 1.2 2003/01/04 13:26:14 kevin Exp $
 ;;;;
 ;;;; This file, part of LML, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
@@ -59,7 +59,7 @@
              `(lml-print "~D" ,form))
             (symbol
              (when form
-             `(lml-print (string-downcase (symbol-name ,form)))))
+             `(lml-print ,form)))
             (cons
              form)))
        forms)))
        (kv (gensym)))
   `(progn
      (let ((,attr '()))
-       (dolist (,kv ',keyargs)
-        (awhen (cadr ,kv)
+       (dolist (,kv ,keyargs)
+        (awhen (cdr ,kv)
           (push (one-keyarg-string (car ,kv) it) ,attr)))
        (with-attr-string ,tag (list-to-spaced-string (nreverse ,attr)) ,@body)))))
 
+(defmacro bind-one-keyarg (keyarg)
+  `(list ,(car keyarg) ,(cdr keyarg)))
+
+(defmacro bind-all-keyargs (keyargs)
+  "Convert a list of keyarg pairs and convert eval/bind arguments"
+  (let* ((npairs (length keyargs))
+        (syms (make-array npairs))
+        (ipair 0)
+        (ipair2 0))
+    (declare (dynamic-extent syms))
+    (dotimes (i npairs)
+      (setf (aref syms i) (gensym)))
+    `(let ,(mapcar #'(lambda (ka)
+                      (prog1
+                          (list (aref syms ipair) (cdr ka))
+                        (incf ipair)))
+                  keyargs)
+      (list ,@(mapcar #'(lambda (ka)
+                         (prog1
+                             `(cons ,(car ka) ,(aref syms ipair2))
+                           (incf ipair2)))
+                     keyargs)))))
+
 (defmacro with (tag &rest args)
+  "Return a list of keyargs and also the body of LML form"
   (let ((body '())
        (keyargs '())
-       (n (length args)))
-    (do ((i 0 (1+ i)))
-       ((> i (1- n)))
-      (let ((arg (nth i args))
-           (value (when (< (1+ i) n)
-                    (nth (1+ i) args))))
-       (if (keyword-symbol? arg)
-           (progn
-             (push (list arg value) keyargs)
-             (incf i))
-         (push arg body))))
-    `(with-keyargs ,tag ,keyargs ,@(nreverse body))))
+       (bound-keyargs (gensym)))
+    (do* ((n (length args))
+         (i 0 (+ 2 i))
+         (arg (nth i args) (nth i args))
+         (value (when (< (1+ i) n)
+                  (nth (1+ i) args))
+                (when (< (1+ i) n)
+                  (nth (1+ i) args))))
+        ((or (not (keyword-symbol? arg))
+             (>= i n))
+         (dotimes (j (- n i))
+           (push (nth (+ i j) args) body)))
+      (push (cons arg value) keyargs))
+    (setq keyargs (nreverse keyargs))
+    (setq body (nreverse body))
+    `(let ((,bound-keyargs ,(macroexpand `(bind-all-keyargs ,keyargs))))
+      ,(macroexpand `(with-keyargs ,tag ,bound-keyargs ,@body)))))
 
 
 (defmacro keyargs-string (&rest args)
   (let ((name (intern (format nil "~A-~A" tag :c))))
     `(progn
        (defmacro ,name (&body body)
-        `(with ,',tag :class ,(car body) ,@(cdr body)))
+        `(with ,',tag :class (quote ,(car body)) ,@(cdr body)))
        (export ',name))))
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
index c256bc51ae41cc22a8abaa4bf145ab3c1de07748..e7746e436ec7e3667dda3021ec5efc2415d44a55 100644 (file)
@@ -1,3 +1,9 @@
+cl-lml (2.0.0-1) unstable; urgency=low
+
+  * Major change: keyword parameters are now evaluated in the lexical environment.
+
+ -- Kevin M. Rosenberg <kmr@debian.org>  Sat,  4 Jan 2003 06:17:40 -0700
+
 cl-lml (1.7.6-1) unstable; urgency=low
 
   * Add checked to input macro
index e52a9a71f9aa8aac9c1dd0886026db3725ca056b..5c9e51ba363531ddf1e96b6662d13146eb2b69bf 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
 <!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"><head><title>LML README</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></meta><meta content="Kevin Rosenberg 2002 <kevin@rosenberg.net>" name="Copyright"></meta><meta content="Lisp Markup Language Documentation" name="description"></meta><meta content="Kevin Rosenberg" name="author"></meta><meta content="Common Lisp, HTML, Markup Langauge" name="keywords"></meta></head><body><h1>LML Documentation</h1><h2>Overview</h2><p><a href="http://lml.b9.com">LML</a> is a Common Lisp package for generating HTML and XHTML documents. 
+<html xmlns="http://www.w3.org/1999/xhtml"><head><title>LML README</title><meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"></meta><meta name="Copyright" content="Kevin Rosenberg 2002 <kevin@rosenberg.net>"></meta><meta name="description" content="Lisp Markup Language Documentation"></meta><meta name="author" content="Kevin Rosenberg"></meta><meta name="keywords" content="Common Lisp, HTML, Markup Langauge"></meta></head><body><h1>LML Documentation</h1><h2>Overview</h2><p><a href="http://lml.b9.com">LML</a> is a Common Lisp package for generating HTML and XHTML documents. 
        LML is authored by 
        <a href="mailto:kevin@rosenberg.net">Kevin Rosenberg</a>. The home page for LML is
        <a href="http://lml.b9.com/">http://lml.b9.com/</a>.</p><h2>Installation</h2><p>The easiest way to install LML is to use the <a href="http://www.debian.org/">Debian</a>
@@ -9,7 +9,7 @@
           or <a href="http://www.sourceforge.net/clocc/">mk-defsystem</a>
        installed to load the system definition file. You will need to change the source 
        pathname in the system file to match the location where you have installed LML.</p><h2>Usage</h2><p>Currently, there is no documentation on the functions provided by LML. However, the source code is
-                  instructive and there are example files included in the LML package.</p><h2>Examples</h2><table cellpadding="3" border="1"><tbody><tr><td style="color:#000;background-color:#ccc;font-weight:bold;" colspan="2">Iteration</td></tr><tr><td><pre>(i "The square of the first five integers are)"
+                  instructive and there are example files included in the LML package.</p><h2>Examples</h2><table border="1" cellpadding="3"><tbody><tr><td colspan="2" style="color:#000;background-color:#ccc;font-weight:bold;">Iteration</td></tr><tr><td><pre>(i "The square of the first five integers are)"
  (b
    (loop as x from 1 to 5 
      doing