Patrick
Patrick

Reputation: 31

Dealing with &rest-parameters in common lisp

I want to define a function that accepts &rest parameters and delegates them to another function.

(html "blah" "foo" baz) => "<html>blahfoobaz</html>"

I did not find a better way than this one:

(defun html (&rest values)
  (concatenate 'string 
               "<html>" 
               (reduce #'(lambda (a b)
                           (concatenate 'string a b))
                       values :initial-value "") 
               "</html>"))

But this looks somewhat glumbsy to me, since line 4 does no more than concatenating the &rest parameter "values". I tried (concatenate 'string "<html>" (values-list values) "</html>") but this does not seem to work (SBCL). Could someone give me an advice?

Kind regards

Upvotes: 3

Views: 421

Answers (2)

Svante
Svante

Reputation: 51531

In principle, it will not get much better, unless you use format, but you can use the CL-WHO library, which lets you write HTML in Lisp:

(defun hello-page ()
  (with-html-output-to-string (string)
    (:html (:head (:title "Hello, world!"))
           (:body (:h3 "Hello, World!")
                  (:a :href "http://weitz.de/cl-who/"
                      "The CL-WHO library")))))

Edit: The format way should perhaps also be shown:

(defun html (&rest values)
  (format nil "<html>~{~a~}</html>" values))

Upvotes: 3

Michiel Borkent
Michiel Borkent

Reputation: 34860

(defun html (&rest values) 
  (apply #'concatenate 'string values))

Upvotes: 3

Related Questions