如何在常见的lisp中设置网络服务器?

时间:2010-05-24 07:29:27

标签: linux lisp webserver common-lisp

几个月前,我受到Paul Graham撰写的宏伟书籍 ANSI Common Lisp 的启发,以及Lisp可能被用作网络开发中的秘密武器的声明,作者在他的博客上。哇,太神奇了。这是我一直在寻找的东西。作者真正开发了一个成功的网络应用程序并将其出售给雅虎。

有了那些令人鼓舞的图像,我决定花一些时间(1年或2年,谁知道)学习Common Lisp。也许有一天我会开发我的Web应用程序并变成一个伟大的Lisp专家。事实上,这是我第二次学习Lisp。几年前我第一次被着名的书籍 SICP 着迷,但后来发现Scheme对于现实生活应用来说是如此令人难以置信的不成熟。

在阅读 ANSI Common Lisp 的一些章节之后,我非常确定这本书是一本非常详尽的探索Common Lisp的书。然后我开始在Common Lisp中设置一个Web服务器。毕竟,如果你想学点东西,这应该是最好的方法。示威总是好于定义。

正如本书 Practical Common Lisp 所建议的那样(顺便说一下,这也是一本好书),我选择在一些Common Lisp实现上安装AllegroServe。然后,从其他地方,我了解到Hunchentoot似乎比AllegroServe更好。 (我不记得这个词的来源和对象。所以不要和我争论。)

具有讽刺意味的是,你知道吗,我从未在任何Common Lisp实现上安装这两个软件包。更烦人的是,我甚至不知道为什么。机器总是吐出很多行话,导致我陷入混乱。我试过在互联网上搜索,但没找到任何东西。

在Linux中成功安装这些软件包的人能告诉我你是怎么做到的吗?你遇到了什么麻烦吗?你怎么弄清楚出了什么问题并修好了?越详细越有帮助。

4 个答案:

答案 0 :(得分:6)

您是否尝试过these instructions

我已经安装了SBCL,所以我只遵循了后半部分的说明。它设置了一个非常小的Web应用程序,因此它可以让您了解如何构建自己的Web应用程序。

These instructions可能不是你想要的 - 它们用于设置一个Web服务器(在Ubuntu上),与emacs / SLIME进行远程交互,但我想“远程交互”可能就像好意思是localhost。

答案 1 :(得分:5)

基本上,这些安装步骤来自本文 A Simple Lisp Webapp for beginners ,由Frank Shearar推荐(再次感谢)。但我没有遵循确切的步骤,因为(1)我想与本地用户安装Common Lisp; (2)我不熟悉作者提到的一些事情。你可以查看原始文章,或者你可以在这里关注我。我担心我的指示更容易理解。 :)

安装前需要下载三个软件包。 sbcl二进制和源包可以下载here,并且可以下载smanek包here

  • SBCL-1.0.38 86 Linux的binary.tar.bz2

  • SBCL-1.0.38-source.tar.bz2

  • smanek平凡-口齿不清-web应用-3681c1

注意:当您看到这篇文章时,版本号可能已经改变。所以不要费心去获取确切的包裹。但是,这是适合我的包。

以下是我的所作所为(用您的真实路径替换YOURPATH,我假设您使用的是 BASH ):

<强> 1。安装二进制sbcl软件包

tar jxf sbcl-1.0.38-x86-linux-binary.tar.bz2

cd sbcl-1.0.38-x86-linux

INSTALL_ROOT=YOURPATH sh install.sh

cd ..

嗯,现在已经安装了二进制sbcl软件包。当安装程序抱怨“没有手动找到”之类的东西时,可以正常使用,因为二进制包中不包含手册内容。就这样吧。

<强> 2。设置PATH和SBCL_HOME

export PATH=YOURPATH/bin/:$PATH

export SBCL_HOME=YOURPATH/lib/sbcl/

第3。安装源sbcl软件包

tar jxf sbcl-1.0.38-source.tar.bz2

cd sbcl-1.0.38

sh make.sh

export SBCL_HOME=''

INSTALL_ROOT=YOUROTHTERPATH sh install.sh

cd ..

注意:您可能需要指定另一个目录进行安装,或者它将安装到二进制sbcl所在的同一目录中。

<强> 4。设置PATH和SBCL_HOME

export PATH=YOUROTHERPATH/bin/:$PATH

export SBCL_HOME=YOUROTHERPATH/lib/sbcl/

<强> 5。安装smanek软件包

unzip smanek-trivial-lisp-webapp-36816c1.zip

cd smanek-trival-lisp-webapp-36816c1

cd scripts

./startserver.sh

当它显示“网络服务器在端口8080上启动”时,您可以在网络浏览器中访问“http://localhost:8080”。它就在那里,对吗?

<强> 6。一些注意事项

  • 将三个软件包放在一个目录中后,您可以逐个或批量运行上述脚本。请记住用真实路径替换PATH。
  • 我怀疑Shaneal Manek已经破解了asdf和hunchentoot包,因为我在$ HOME / .sbclrc和$ HOME / .sbcl中找不到任何内容。谢谢你,Shaneal Manek,你已经帮了很多人。
  • 我仍然对那些经常说很多但却做一点点的人感到厌恶。即使是人们也很生气,但很明显,他们说的很重要,而不是他们怎么说。尽管如此,我心情不好时说错了。

答案 2 :(得分:2)

5年后。

quicklisp很容易。我假设你已经安装了SBCL或其他CL实现。

  1. 转到您的REPL并评估
  2. IMMDevice* pEndpointRead = NULL; IMMDevice* pEndpointWrite = NULL; IMMDeviceEnumerator* pEnumerator = NULL; IPropertyStore* propertyStoreRead = NULL; IPropertyStore* propertyStoreWrite = NULL; IAudioClient *audioClient = NULL; PROPVARIANT propRead; HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pEnumerator); hr = pEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, &pEndpointRead); hr = pEndpointRead->OpenPropertyStore(STGM_READ, &propertyStoreRead); if (FAILED(hr)) { std::cout << "OpenPropertyStore failed!" << std::endl; } hr = propertyStoreRead->GetValue(PKEY_AudioEngine_DeviceFormat, &propRead); if (FAILED(hr)) { std::cout << "GetValue failed!" << std::endl; } deviceFormatProperties =(WAVEFORMATEXTENSIBLE *)propRead.blob.pBlobData; deviceFormatProperties->Format.nChannels = 2; deviceFormatProperties->Format.nSamplesPerSec = 48000; deviceFormatProperties->Format.wBitsPerSample = 16; deviceFormatProperties->Samples.wValidBitsPerSample = deviceFormatProperties->Format.wBitsPerSample; deviceFormatProperties->Format.nBlockAlign = (deviceFormatProperties->Format.nChannels*deviceFormatProperties->Format.wBitsPerSample) / 8; deviceFormatProperties->Format.nAvgBytesPerSec = deviceFormatProperties->Format.nSamplesPerSec*deviceFormatProperties->Format.nBlockAlign; deviceFormatProperties->dwChannelMask = KSAUDIO_SPEAKER_STEREO; deviceFormatProperties->Format.cbSize = 22; deviceFormatProperties->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; hr = pEndpointRead->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&audioClient); if (FAILED(hr)) { std::cout << "pDevice->Activate failed!" << std::endl; } hr = audioClient->IsFormatSupported(/*AUDCLNT_SHAREMODE_SHARED*/AUDCLNT_SHAREMODE_EXCLUSIVE, (PWAVEFORMATEX)&deviceFormatProperties->Format, NULL); if (FAILED(hr)) { std::cout << "IsFormatSupported failed" << std::endl; } hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pEnumerator); hr = pEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, &pEndpointWrite); hr= pEndpointWrite->OpenPropertyStore(STGM_WRITE, &propertyStoreWrite); if (FAILED(hr)) { std::cout << "OpenPropertyStore failed!" << std::endl; } hr = propertyStoreWrite->SetValue(PKEY_AudioEngine_DeviceFormat, propRead); if (FAILED(hr)) { std::cout << "SetValue failed!" << std::endl; } hr = propertyStoreWrite->Commit(); pEndpointWrite->Release(); pEnumerator->Release(); propertyStoreWrite->Release(); pEndpointRead->Release(); propertyStoreRead->Release(); pEndpointRead = NULL; PropVariantClear(&propRead);

    1. 启动AllegroServe
    2. (ql:quickload :aserve)

      1. 发布一些HTML文件
      2. (net.aserve:start :port 8000)

        1. 转到http://localhost:8000/
        2. 快乐的黑客攻击!

          详细了解 Introduction to AllegroServe Tutorial

答案 3 :(得分:0)

保罗格雷厄姆,首先是: - )

我也发现Common Lisp需要做很多工作才能完成第一步。当你刚刚开始时环境很糟糕,没有一个明确的One True Path可以让你能够在某些代码中查看并看到一些结果(例如,有Python)。和你一样,我浪费了很多时间从一个实现跳到另一个实现。所以我的建议是:

我建议你选择一个并忽略所有其他建议,直到你开始。

如果你不喜欢,只需获取Apache并编写一些PHP: - )