处理常见的lisp中的& rest-parameters

时间:2010-04-13 22:50:43

标签: common-lisp

我想定义一个接受&rest参数的函数,并将它们委托给另一个函数。

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

我找不到比这更好的方法:

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

但这对我来说看起来有点怪异,因为第4行只不过是连接&amp; rest参数“值”。我试过(concatenate 'string "<html>" (values-list values) "</html>"),但这似乎不起作用(SBCL)。有人可以给我一个建议吗?

亲切的问候

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

原则上,除非你使用format,否则它不会好得多,但你可以使用CL-WHO库,它允许你用Lisp编写HTML:

(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")))))

编辑:也许应该显示format方式:

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