Reputation: 31
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
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
Reputation: 34860
(defun html (&rest values)
(apply #'concatenate 'string values))
Upvotes: 3