CL-WHO在有条件之后不显示任何HTML

时间:2017-07-29 14:02:36

标签: common-lisp hunchentoot cl-who

对于这个可能很愚蠢的问题感到抱歉,但我是Common Lisp的新手(我从Racket迁移过来)到目前为止,我正在与Hunchentoot建立一个网络应用程序,cl-who,and,一些其他的杂项包,但我最近遇到了一个我无法解决的问题:我试图循环一个哈希并显示其值(结构)如果哈希不是空。如果是,我想显示一个"这是空的"信息。但是,cl-who只输出调用后的HTML。这是我的代码:

(tbnl:define-easy-handler (index :uri "/") () 
  "Landing page." 
  (setf (tbnl:content-type*) "text/html") 
  (with-html-ouptut (*standard-output*) 
    (:html 
     (:head (:title "Chattr: Neo-BBS")) 
     (:body 
      (:div :id "header" 
            :style "text-align:center;" 
            (:h1 "Welcome to Chattr") 
            (:h3 "Please select the sub-board you would like to chat 
            on.")) 
      (if (> (hash-table-size *boards*) 0) 
          (dolist (board (hash-table-values *boards*)) 
            (htm 
             (:span (html-display board)) (:br)))
          (htm 
           (:b "Sorry, there aren't any boards. Why not create 
                one?") (:br))) 
      (:a :href "/new-board" "Create New Board"))))) 

所以在这种情况下,"创建新董事会"正在出现,但粗体文字和标题都没有。但是,如果我在if之后移动标题,它会显示出来。

我已经挣扎了六个多小时,有人对我有任何暗示吗?谢谢!

1 个答案:

答案 0 :(得分:4)

返回一个字符串

来自http://weitz.de/hunchentoot

  

请求处理程序通过在必要时修改回复对象并最终以字符串或二进制序列的形式返回响应主体来完成其工作。

处理程序应返回一个字符串,这里唯一发出的是打印的最后一个值(因为write返回其参数) 1 。这就是你只看到最后一个元素的原因。你需要使用with-html-output-to-string;通常在绑定中添加变量out,但在大多数情况下,不使用该变量(至少不在此处)。您可以使用*standard-output*,但必须小心。在有用的最小范围内更好地重新绑定*standard-output*。 如果您不想先构建字符串,则可以使用与当前响应关联的流。

  

作为替代方案,他们也可以调用SEND-HEADERS并直接写入流。

使用hash-table-count

您正在使用hash-table-size而不是hash-table-count,这意味着如果您有一张空桌子,那么尺寸(即容量)是正数,但您没有显示任何内容,因为该购物者没有做任何事。顺便说一句,您还可以使用maphashloop迭代哈希表:

(maphash (lambda (key board)
           (declare (ignore key))
           (htm ...)) 
         *boards*)

(loop
  for board being the hash-values of *boards*
  do (htm ...))

1。您没有看到任何write语句,但它们是由宏发出的。您可以自己macroexpand表单,或使用Slime进行quickly