MacOSでCommonLispのaserveを動かして「実践CommonLisp」を試す

## sbclインストール

brew install sbcl

```
$ sbcl
(require :sb-aclrepl)

CL-USER(1): (quit)

```

## quicklispインストール

```
$ sudo curl -O https://beta.quicklisp.org/quicklisp.lisp

$ sbcl --load quicklisp.lisp
(ql:quickload "aserve")
(load "~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/INSTALL.lisp")
(quicklisp-quickstart:install)
(ql:system-apropos "term")
(ql:add-to-init-file)
```
INSTALL.lispでエラーが出るが、「2」で実行してしまう。

### example実行

```
(ql:quickload "aserve")

(load "~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/examples/examples.cl")

(net.aserve:start :port 2001)

```
http://localhost:2001
でサンプルが動くようになります。

## 「実践CommonLisp」からコードを記載
ここからはわかりやすいように
プログラムファイルと起動ファイルを分けます。

### hello worldプログラムファイル

vi ~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/hello-world.cl

```
(defpackage #:net.aserve
  (:use #:common-lisp #:acl-compat.excl #:net.html.generator #:net.aserve))

(in-package #:net.aserve)

(net.aserve:publish :path "/hello" :content-type "text/html"
                    :function 'hello-function)
                    (defun hello-function (request entity)
                      (net.aserve:with-http-response (request entity)
                        (net.aserve:with-http-body (request entity)
                        (net.html.generator:html
                            (:html
                              (:head (:title "Hello"))
                              (:body (:p "Hello world!")))))))
```

### hello-world起動ファイル

vi
~/quicklisp/hello-world.lisp

```
(ql:quickload "aserve")
(load "~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/hello-world.cl")

(net.aserve:start :port 2001)
```

#### hello-world起動
```
> sbcl --load ~/quicklisp/hello-world.lisp
```

http://localhost:2001/hello
にHello World!が表示されます。

### random-numberプログラムファイル

vi ~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/random-number.cl

```
(defpackage #:net.aserve
  (:use #:common-lisp #:acl-compat.excl #:net.html.generator #:net.aserve))

(in-package #:net.aserve)

(defparameter *example-pathname* *load-pathname*) ; where this file is
(defmacro example-file (name)
    ;; create an absolute address for this file we'll load
    `(merge-pathnames ,name *example-pathname*))

(defvar *hit-counter* 0)

(publish :path "/random-number" :content-type "text/html"
                    :function 'random-number)
    (defun random-number (request entity)
      (with-http-response (request entity :content-type "text/html")
        (with-http-body (request entity)
          (format
            (request-reply-stream request)
            "<html>~@
             <head><title>Random</title></head>~@
             <body>~@
             <p>Random number: ~d</p>~@
             </body>~@
             </html>~@
             "
             (random 1000)))))

```

### random-number起動ファイル

vi
~/quicklisp/random-number.lisp

```
(ql:quickload "aserve")
(load "~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/random-number.cl")

(net.aserve:start :port 2001)

```
#### random-number起動

```
> sbcl --load ~/quicklisp/random-number.lisp
```

http://localhost:2001/random-number
に乱数が表示されます。


### hrefプログラムファイル

vi ~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/href.cl

```
(net.aserve:publish :path "/href" :content-type "text/html"
                    :function 'href2-function)
                    (defun href2-function (request entity)
                        (net.aserve:with-http-response (request entity)
                          (net.aserve:with-http-body (request entity)
                        (net.html.generator:html
                              (:html
                                (:head (:title "href2"))
                                (:body ((:a :href "http://google.co.jp/") "This is a link")))))))
```

### href起動ファイル

vi
~/quicklisp/href.lisp

```
(ql:quickload "aserve")
(load "~/quicklisp/dists/quicklisp/software/portableaserve-20190813-git/aserve/href.cl")

(net.aserve:start :port 2001)

```

#### href起動

```
> sbcl --load ~/quicklisp/href.lisp
```

http://localhost:2001/href
でlinkをクリックするとGoogleに飛びます。

### うまく行ったのはここまで
## 26.6章のクエリパラメータは「with-html-output」がundefienedで、動きませんでした。

## caveman2も使いたかったのですが、postgresqlの情報が少なくて確認できませんでした。