1

CL-WHO のマクロを定義したとします。

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

予想通り。これで、CL-WHO で使用される s 式を生成する関数を定義しました。

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

"hello" で呼び出されると戻ります

(:h1 "hallo")

しかし、今私が電話するとき

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

戻り値:

"<html>
  <body>

  </body>
</html>"

何が問題で、その理由は?

4

2 に答える 2

1

私も同じ問題を抱えていました。私がグーグルアウトできる限り、それはcl-whoの公式バージョンでは不可能でした:http://lisp-univ-etc.blogspot.com/2009/03/cl-who-macros.html

代わりに、マクロをサポートするこのバージョンを使用しました:https ://github.com/vseloved/cl-who

于 2012-04-12T13:25:52.817 に答える
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"))
于 2012-04-12T19:11:16.247 に答える