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.