几个月前,我受到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中成功安装这些软件包的人能告诉我你是怎么做到的吗?你遇到了什么麻烦吗?你怎么弄清楚出了什么问题并修好了?越详细越有帮助。
答案 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。一些注意事项
答案 2 :(得分:2)
5年后。
quicklisp很容易。我假设你已经安装了SBCL或其他CL实现。
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);
(ql:quickload :aserve)
(net.aserve:start :port 8000)
快乐的黑客攻击!
答案 3 :(得分:0)
保罗格雷厄姆,首先是: - )
我也发现Common Lisp需要做很多工作才能完成第一步。当你刚刚开始时环境很糟糕,没有一个明确的One True Path可以让你能够在某些代码中查看并看到一些结果(例如,有Python)。和你一样,我浪费了很多时间从一个实现跳到另一个实现。所以我的建议是:
我建议你选择一个并忽略所有其他建议,直到你开始。
如果你不喜欢,只需获取Apache并编写一些PHP: - )