2012-04-12 116 views
1

說我已經定義爲CL-WHO宏:Common Lisp:如何使用宏爲CL-WHO生成S表達式?

(defmacro test-html (&body body) 
    `(with-html-output-to-string (*standard-output* nil :PROLOGUE t :indent t) 
     (:html 
     (:body 
    ,@body)))) 

然後:

(test-html (:h1 "hallo")) 

給出(已刪除第一行):

"<html> 
    <body> 
    <h1> 
     hallo 
    </h1> 
    </body> 
</html>" 

正如所預期的。現在我已經定義了一個函數生成S-表達由CL-WHO使用:

(defun test-header (txt) 
    `(:h1 ,txt)) 

當所謂的「你好」返回

(:h1 "hallo") 

但現在當我打電話

(test-html (test-header "hallo")) 

它返回:

"<html> 
    <body> 

    </body> 
</html>" 

出了什麼問題,爲什麼?

回答

1

我傾向於解決這個問題的方法問題是通過定義一個快捷宏像

(defmacro html-to-stout (&body body) 
    "Outputs HTML to standard out." 
    `(with-html-output (*standard-output* nil :indent t) ,@body)) 

或字符串等效。這裏的關鍵是它不輸出:prologue,所以它可以輸出一個HTML塊,而不是整個頁面。一旦你有了,你可以做的事情,如

(defun test-header (text) 
    (html-to-stout 
    (:h1 (str text)))) 

(test-html (test-header "Hello Hello")) 
1

我有同樣的問題。至於我可以谷歌退出了,這是不可能的正式版CL-誰:http://lisp-univ-etc.blogspot.com/2009/03/cl-who-macros.html

我用這個版本代替,它支持宏:https://github.com/vseloved/cl-who

+1

感謝您的鏈接!這很有趣......在閱讀整篇文章並進入評論部分後,我意識到2個月前我閱讀了這篇文章並留下了評論。我的記憶讓我失望 - 我會嘗試Vsevolod的叉子! – mck 2012-04-12 13:50:56