2013-03-27 2 views
0
(require :cl-who) 
(defmacro rawpage ((&rest head) &body body) 
    `(cl-who:with-html-output-to-string (*standard-output* nil :prologue t) 
    (:html 
    (:head 
     (:meta :charset "utf-8") 
     ,@head) 
    (:body 
     ,@body)))) 

(defmacro str+ (&rest strs) 
    `(concatenate 'string ,@strs)) 

(rawpage() (:div (str+ "hello," "name"))) 

Этот фрагмент кода не выводит то, что я хочу. Я ожидал, что его вывод:Строки, не отображаемые в шаблоне CL-WHO

<html><head><meta charset='utf-8' /></head><body><div>hello,name</div></body></html> 

Но, выход:

<html><head><meta charset='utf-8' /></head><body><div></div></body></html> 

Любой может сказать мне, почему? Я использую SBCL.

+1

Хороший первый старт, вероятно, делать '(MACROEXPAND-1«(rawpage() (: div (str + "hello", "name")))) 'и посмотреть, на что он фактически распространяется. Во-вторых, МОЖЕТ быть лучше заменить ваш 'str +' macro на '(defun str + (& rest strs) (формат nil" ~ {~ a ~} "strs)' (никогда не используйте макрос, где функция будет делать трюк) , – Vatine

ответ

4

Ваша проблема заключается в том, что в CL-ВОЗ непостоянные строки должны быть размещены внутри str так:

(defmacro rawpage() 
    (:div (str (str+ "hello," "name")))) 
Смежные вопросы