2012-04-12 8 views
1

私はCL-のマクロを定義していると言う。そして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)))) 

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

予想されたように:

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

は、(削除最初の行)を得ます。今、私はS式を生成する機能を定義したCL-が使用する:

(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

関連する問題