LSP is copyright I/NET and is licensed under the MIT License. It was written by John Wiseman, who discusses it in this blog post.
LSP is designed to work with a separate web server library. The code comes with support for both the AllegroServe and Araneida servers, but it shouldn't be difficult to add support for other libraries (see lsp-aserve.lisp and lsp-allegroserve.lisp from the distribution for examples).
LSP itself should be portable ANSI Lisp code that will run in any Lisp implementation.
Example of publishing an LSP file:
Example of an LSP file:
<html>
<head>
<title>LSP Example (AllegroServe)</title>
</head>
<body>
<h1>LSP Example</h1>
<h2>User Agent</h2>
<%=
(:princ-safe (or (net.aserve:header-slot-value request
:user-agent)
"None."))
%>
<h2>Referrer</h2>
<%=
(:princ-safe (or (net.aserve:header-slot-value request
:referer)
"None."))
%>
<h2>Query Variables</h2>
<table>
<%
(let ((queries (request-query request)))
(if (null queries)
(html (:tr (:td "None.")))
(dolist (query queries)
(html
(:tr (:td (:princ-safe (car query)))
(:td (:princ-safe (cdr query))))))))
%>
</table>
<h2>Loop Of Dynamism</h2>
<% (dotimes (i (+ (random 10) 1)) %>
Hi!<br>
<% ) %>
</body>
</html>
CL-EMB uses some code from LSP, but does more. However, it requires passing the "environment" as a plist to the rendering function. See the README for CL-EMB.
Hunchentoot LSP is a port of LSP that targets the Hunchentoot webserver.
See Lisp Server Pages for a more serious attempt at doing this right, by Sunil Mishra and Tim Bradshaw.