Practical Common Lisp学习笔记 (六)AllegroServe有关问题小结

Practical Common Lisp学习笔记 (六)AllegroServe问题小结

在第二十六章的学习中遇到了前所未有的困难,几乎一步一坑,一页一停(哎,天杀的我怎么还不是大神)

首先说明一下,我的上一篇博文完全浪费了时间和精力,因为我发现作者给出的IDE环境中已经包含了AllegroServe这个库直接使用(require ‘aserve)就可以了。

然后文章中

(defpackage :com.talon.web
	   (:use :cl :net.aserve :com.gigamonkeys.html))
我看了一下quicklisp中下载的源代码,应该是net.html.generator(也许是我哪里不对,至少我这样做没有问题

后面的文章又讲到了动态生成网页本来很顺利结果到了使用宏生成的网页我是如何也过不去了书中代码如下

(defun random-number (request entity)
  (with-http-response (request entity :content-type "text/html")
    (with-http-body (request entity)
      (with-html-output ((request-reply-stream request))
        (html
          (:html
            (:head (:title "Random"))
            (:body
              (:p "Random number: " (:print (random 1000))))))))))

问题就来了,编译器说with-html-output不是一个宏,(PS:55555,作者这是留的作业嘛?)书中说明这是在htmlgen中的一个宏可是我编译器给了我一个否定的答案,我查了一下,应该是一个叫做CL-WHO的包中的宏,好吧,使用万能的quicklisp

还没来得及高兴又说request-reply-stream不是一个变量之类的意思,我看了一下之前的代码没有问题,没办法编译器才是上帝,我使用了let绑定变量竟然可以,估计是宏用法的问题(PS:希望是我技术比较浅,不是作者的失误)

最后一个编译器告诉我print不是一个关键字。。。。。。。我该怎么办,没关系菜鸟又菜鸟的路,我使用fromat写入到返回的流中,搞定。希望能让和我一样在学习的人少走点弯路。

我运行成功的代码

(defun random-number (request entity)
  (with-http-response (request entity :content-type "text/html")
    (with-http-body (request entity)
      (let ((stream (request-reply-stream request)))
	(with-html-output (stream)
        (html
          (:html
            (:head (:title "Random"))
            (:body
              (:p (format stream "random number ~d" (random 1000)))))))))))