2010-04-13 7 views
3

Je souhaite définir une fonction qui accepte les paramètres &rest et les délègue à une autre fonction.Traitement des paramètres & rest en Lisp commun

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

Je n'ai pas trouvé une meilleure façon que celui-ci:

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

Mais cela ressemble un peu glumbsy pour moi, puisque la ligne 4 ne fait que concaténer le paramètre reste & « valeurs ». J'ai essayé (concatenate 'string "<html>" (values-list values) "</html>") mais cela ne semble pas fonctionner (SBCL). Quelqu'un pourrait-il me donner un conseil?

Amitiés

Répondre

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

P note de bail la question a été changée après que j'ai donné cette réponse. –

3

En principe, il ne sera pas beaucoup mieux, sauf si vous utilisez format, mais vous pouvez utiliser la bibliothèque CL-WHO, qui vous permet d'écrire HTML dans 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"))))) 

Modifier: Le format chemin devrait peut-être aussi être montré:

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

+1 pour la façon humoristique et ludique de pointer vers CL-WHO :-) –

Questions connexes