试用 Portable Allegro Serve
安装好 Common Lisp 的开发环境后,想试试看 web 开发。
虽然 Allegro Serve 运行起来更简单,但是要在 Allegro CL 中运行,而后者是个商业软件,暂时我没有购买的打算。退而求其次,只好用 Portable Allegro Serve.
这个开源代码貌似很久没更新了。下载后,运行出了很多小问题。简要记录如下:
- 用 CLisp 来运行的时候,可能下载的 aserve 代码里包含的那些中间文件是由其他 lisp 实现生成的,也可能是 clisp 的早期版本,会报错误提示这些中间文件 out-dated 了。解决的办法很简单,只要将 aserve 代码的子孙目录中所有 .fas 和 .lib 文件全部删掉即可,可以写个简单的脚本来做这个 clean 的工作。删掉后,重新加载时会自动重新生成这些中间文件。这个非常类似于 Python 的 .pyc 文件。
- 加载 install.lisp 的时候会报一个函数调用 ipaddr-to-dotted 找不到。这是因为代码里有个地方的调用少写了该函数所在包的前缀。解决办法是,打开 aserve\log.cl, 找到这个函数调用的地方,将函数写法替换为 acl-compat.socket:ipaddr-to-dotted 即可。
- 执行 (start :port 8080) 启动服务器的时候,会报错如下:
Evaluation aborted on #<SIMPLE-TYPE-ERROR #x1A2AAEF9>.
Lisp connection closed unexpectedly: connection broken by remote peer
首先需要通过 Emacs 里打开 *inferior-lisp* buffer,然后重新加载这些代码来测试。得到一个更为详细的错误:
*** - FUNCALL: undefined function ACL-COMPAT.MP:MAKE-PROCESS
可以判断是因为 clisp 不支持多线程造成的问题。
解决办法:启动 aserve 多提供一个参数如下:
(start :port 8080 :listeners 0)