lsp
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Lisp Server Pages, a simple Common Lisp version of JSP.
LSP - Lisp Server Pages
=======================

Copyright 2001, 2009 John Wiseman (jjwiseman@gmail.com)


Introduction
-------------

Java Server Pages are a way to make web pages that are dynamic, by
embedding Java code in HTML.  Similarly, Lisp Server Pages allow you
to make dynamic web pages that contain Lisp code.

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`` for examples).

LSP itself should be portable ANSI Lisp code that will run in any Lisp
implementation.

Before loading LSP, first load the particular web server code you're
using.  Then the easiest way to load LSP is to use ASDF, by evaluting
one of the following forms::

  (asdf:operate 'asdf:load-op :lsp-aserve)   ;; For AllegroServe support
  (asdf:operate 'asdf:load-op :lsp-araneida) ;; For Araneida support


Using LSP
----------

To publish an LSP page, call the ``PUBLISH-LSP`` function::

  PUBLISH-LSP (&key path file server (package *package*))     [function]

Publishes an LSP file.  ``PATH`` is a string containing the name part
of the URL at which to publish the file,e.g. ``"/math/sum.lsp"``;
``FILE`` is a pathname that specifies the file containing the page to
publish. ``PACKAGE`` is the package the reader should use when loading
and compiling this file (``*package*`` is the default).  ``SERVER`` is
the HTTP listener on which to publish the file.

Example::

  (publish-lsp :path "/temperature.html"
               :file "/Users/wiseman/src/temperature.lsp"
               :server *my-server-or-http-listener*)

An LSP file looks just like an HTML file, except for two new tags:
``<% ... %>`` and ``<%= ... %>``.

``<% ... %>`` is a scriptlet tag (to use the JSP terminology), and
wraps lisp code.  For example, ``<% (dotimes (i 10) (beep)) %>``. The
code inside the tag is executed each time the page is requested.

``<%= ... %>`` is an expression tag, and the effect of this tag varies
according to the particular web framework you are using, but is
intended to evaluate the contents as if they were wrapped with the
HTML generation macro that is usually provided.

For example, ``lsp-aserve.lisp`` defines ``<%=...%>`` such that the
contents are wrapped with the Franz ``net.html.generator:html`` macro.
More precisely::

  <%= (:h1 "header") "hi" (:princ-safe (generate-footer)) %>

is equivalent to::

  (net.html.generator:html
    (:h1 "header")
    "hi"
    (:princ-safe (generate-footer)))

which will output something like the following HTML::

 

header

hi
2002-06-09 The ``lsp-araneida.lisp`` file defines ``<%= %>`` to use Araneida's HTML generation facility. During execution of LSP code, some variables related to the HTTP request will be bound for use by the LSP code itself. For example, LSP's AllegroServe support binds the following two variables: REQUEST The HTTP request object containing all the information about the request. ENTITY The information passed to the ``publish-lsp`` function. (See the AllegroServe documentation for more information on these objects.) In Araneida, the two variables are ``METHOD`` and ``REQUEST``, which are bound to objects representing the type of HTTP request and the HTTP request itself, respectively. Tips ---- Expressions can be used inside HTML attributes, e.g.:: Scriptlets do not need to be complete lisp forms, as long as the page as a whole is syntactically valid, e.g.:: <% (dotimes (i 10) %> <% ) %> See the ``examples`` directory for examples of publishing and using LSP files in both AllegroServe and Araneida. Implementation notes and caveats -------------------------------- LSP pages are converted to strings containing lisp code, which are then compiled and cached. If the source file containing the lsp code is modified, the next time a request is made for that page the code will be recompiled and recached. In my first attempt to do this, I tried to construct forms instead of strings. That just made it trickier to separate forms across ``<% ... %>`` tags (see the ``dotimes`` example above). Just because it's bad that other languages are often *limited* to manipulating code as strings doesn't mean there aren't times where it's appropriate. There's nothing like JSP's directives or declarations. LSP requires Franz' AllegroServe (http://allegroserve.sourceforge.net/), Portable AllegroServe (http://portableaserve.sourceforge.net/) or Araneida (http://www.cliki.net/Araneida). See http://sourceforge.net/projects/lsp for a more serious attempt at doing this right, by Sunil Mishra and Tim Bradshaw.

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。