You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by bu...@apache.org on 2018/03/05 17:18:44 UTC
svn commit: r1026304 - in /websites/staging/thrift/trunk/content: ./
lib/cl.html lib/index.html sitemap.html
Author: buildbot
Date: Mon Mar 5 17:18:44 2018
New Revision: 1026304
Log:
Staging update by buildbot for thrift
Added:
websites/staging/thrift/trunk/content/lib/cl.html
Modified:
websites/staging/thrift/trunk/content/ (props changed)
websites/staging/thrift/trunk/content/lib/index.html
websites/staging/thrift/trunk/content/sitemap.html
Propchange: websites/staging/thrift/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Mon Mar 5 17:18:44 2018
@@ -1 +1 @@
-1825916
+1825919
Added: websites/staging/thrift/trunk/content/lib/cl.html
==============================================================================
--- websites/staging/thrift/trunk/content/lib/cl.html (added)
+++ websites/staging/thrift/trunk/content/lib/cl.html Mon Mar 5 17:18:44 2018
@@ -0,0 +1,320 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+ <meta content="en-us" http-equiv="Content-Language" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <link href="/static/images/favicon.ico" rel="shortcut icon" />
+ <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+ <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+ <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+ <script src="/static/js/jquery.min.js"></script>
+ <script src="/static/js/bootstrap-dropdown.js"></script>
+ <script src="/static/js/bootstrap-tab.js"></script>
+
+ <title>Apache Thrift - Common Lisp Library README</title>
+ </head>
+ <body>
+ <div class="navbar">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="/">Apache Thrift ™</a>
+ <div class="nav-collapse">
+ <ul class="nav pull-right">
+ <li>
+ <a href="/download">Download</a>
+ </li>
+ <li>
+ <a href="/docs">Documentation</a>
+ </li>
+ <li>
+ <a href="/developers">Developers</a>
+ </li>
+ <li>
+ <a href="/lib">Libraries</a>
+ </li>
+ <li>
+ <a href="/tutorial">Tutorial</a>
+ </li>
+ <li>
+ <a href="/test">Test Suite</a>
+ </li>
+ <li>
+ <a href="/about">About</a>
+ </li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+ Apache <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li>
+ <a href="http://www.apache.org/" target="_blank">Apache Home</a>
+ </li>
+ <li>
+ <a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a>
+ </li>
+ <li>
+ <a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a>
+ </li>
+ <li>
+ <a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a>
+ </li>
+ <li>
+ <a href="http://www.apache.org/security/" target="_blank">Security</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
+
+ <div class="container">
+ <style type="text/css">
+/* The following code is added by mdx_elementid.py
+ It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+ visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
+<h1 id="using-thrift-with-common-lisp">Using Thrift with Common Lisp<a class="headerlink" href="#using-thrift-with-common-lisp" title="Permanent link">¶</a></h1>
+<p>Thrift is a protocol and library for language-independent communication between cooperating
+ processes. The communication takes the form of request and response messages, of which the forms
+ are specified in advance throufh a shared interface definition. A Thrift definition file is translated
+ into Lisp source files, which comprise several definitions:</p>
+<ul>
+<li>Three packages, one for the namespace of the implementation operators, and one each for request and
+ response operators.</li>
+<li>Various type definitions as implementations for Thrift typedef and enum definitions.</li>
+<li>DEF-STRUCT and DEF-EXCEPTION forms for Thrift struct and exception definitions.</li>
+<li>DEF-SERVICE forms for thrift service definitions.</li>
+</ul>
+<p>Each service definition expands in a collection of generic function definitions. For each <code>op</code>
+ in the service definition, two functions are defined</p>
+<ul>
+<li><code>op</code>-request is defined for use by a client. It accepts an additional initial <code>protocol</code> argument,
+ to act as the client proxy for the operation and mediate the interaction with a remote process
+ through a Thrift-encoded transport stream.</li>
+<li><code>op</code>-response is defined for use by a server. It accepts a single <code>protocol</code> argument. A server
+ uses it to decode the request message, invoke the base <code>op</code> function with the message arguments,
+ encode and send the the result as a response, and handles exceptions.</li>
+</ul>
+<p>The client interface is one operator</p>
+<ul>
+<li><code>with-client (variable location) . body</code> : creates a connection in a dynamic context and closes it
+ upon exit. The variable is bound to a client proxy stream/protocol instance, which wraps the
+ base i/o stream - socket, file, etc, with an operators which implement the Thrift protocol
+ and transport mechanisms.</li>
+</ul>
+<p>The server interface combines server and service objects</p>
+<ul>
+<li><code>serve (location service)</code> : accepts connections on the designated port and responds to
+ requests of the service's operations.</li>
+</ul>
+<h2 id="building">Building<a class="headerlink" href="#building" title="Permanent link">¶</a></h2>
+<p>The Thrift Common Lisp library is packaged as the ASDF[[1]] system <code>thrift</code>.
+It depends on the systems</p>
+<ul>
+<li>puri[[2]] : for the thrift uri class</li>
+<li>closer-mop[[3]] : for class metadata</li>
+<li>trivial-utf-8[[4]] : for string codecs</li>
+<li>usocket[[5]] : for the socket transport</li>
+<li>ieee-floats[[6]] : for conversion between ints and floats</li>
+<li>trivial-gray-streams[[7]] : an abstraction layer for gray streams</li>
+<li>alexandria[[8]] : handy utilities</li>
+</ul>
+<p>The dependencies are bundled for local builds of tests and tutorial binaries -
+it is possible to use those bundles to load the library, too.</p>
+<p>In order to build it, register those systems with ASDF and evaluate:</p>
+<div class="codehilite"><pre><span class="p">(</span><span class="n">asdf</span><span class="p">:</span><span class="n">load</span><span class="o">-</span><span class="n">system</span> <span class="p">:</span><span class="n">thrift</span><span class="p">)</span>
+</pre></div>
+
+
+<p>This will compile and load the Lisp compiler for Thrift definition files, the
+transport and protocol implementations, and the client and server interface
+functions. In order to use Thrift in an application, one must also author and/or
+load the interface definitions for the remote service.[[9]] If one is implementing a service,
+one must also define the actual functions to which Thrift is to act as the proxy
+interface. The remainder of this document follows the Thrift tutorial to illustrate how
+to perform the steps</p>
+<ul>
+<li>implement the service</li>
+<li>translate the Thrift IDL</li>
+<li>load the Lisp service interfaces</li>
+<li>run a server for the service</li>
+<li>use a client to access the service remotely</li>
+</ul>
+<p>Note that, if one is to implement a new service, one will also need to author the
+IDL files, as there is no facility to generate them from a service implementation.</p>
+<h2 id="implement-the-service">Implement the Service<a class="headerlink" href="#implement-the-service" title="Permanent link">¶</a></h2>
+<p>The tutorial comprises serveral functions: <code>add</code>, <code>ping</code>, <code>zip</code>, and <code>calculate</code>.
+Each translated IDL file generates three packages for every service. In the case of
+the tutorial file, the relevant packages are:</p>
+<ul>
+<li>tutorial.calculator</li>
+<li>tutorial.calculator-implementation</li>
+<li>tutorial.calculator-response</li>
+</ul>
+<p>This is to separate the request (generated), response (generated) and implementation
+(meant to be implemented by the programmer) functions for defined Thrift methods.</p>
+<p>It is suggested to work in the <code>tutorial-implementation</code> package while implementing
+the services - it imports the <code>common-lisp</code> package, while the service-specific ones
+don't (to avoid conflicts between Thrift method names and function names in <code>common-lisp</code>).</p>
+<div class="codehilite"><pre><span class="p">;;</span> <span class="n">define</span> <span class="n">the</span> <span class="n">base</span> <span class="n">operations</span>
+
+<span class="p">(</span><span class="n">in</span><span class="o">-</span><span class="n">package</span> <span class="p">:</span><span class="n">tutorial</span><span class="o">-</span><span class="n">implementation</span><span class="p">)</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">add</span> <span class="p">(</span><span class="n">num1</span> <span class="n">num2</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">format</span> <span class="n">t</span> "<span class="o">~&</span><span class="n">Asked</span> <span class="n">to</span> <span class="n">add</span> <span class="o">~</span><span class="n">A</span> <span class="n">and</span> <span class="o">~</span><span class="n">A</span><span class="p">.</span>" <span class="n">num1</span> <span class="n">num2</span><span class="p">)</span>
+ <span class="p">(</span><span class="o">+</span> <span class="n">num1</span> <span class="n">num2</span><span class="p">))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">ping</span> <span class="p">()</span>
+ <span class="p">(</span><span class="n">print</span> <span class="p">:</span><span class="n">ping</span><span class="p">))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">zip</span> <span class="p">()</span>
+ <span class="p">(</span><span class="n">print</span> <span class="p">:</span><span class="n">zip</span><span class="p">))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">calculate</span> <span class="p">(</span><span class="n">logid</span> <span class="n">task</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">calculate</span><span class="o">-</span><span class="n">op</span> <span class="p">(</span><span class="n">work</span><span class="o">-</span><span class="n">op</span> <span class="n">task</span><span class="p">)</span> <span class="p">(</span><span class="n">work</span><span class="o">-</span><span class="n">num1</span> <span class="n">task</span><span class="p">)</span> <span class="p">(</span><span class="n">work</span><span class="o">-</span><span class="n">num2</span> <span class="n">task</span><span class="p">)))</span>
+
+<span class="p">(</span><span class="n">defgeneric</span> <span class="n">calculate</span><span class="o">-</span><span class="n">op</span> <span class="p">(</span><span class="n">op</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+ <span class="p">(:</span><span class="n">method</span> <span class="p">:</span><span class="n">around</span> <span class="p">(</span><span class="n">op</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+ <span class="p">(</span><span class="n">let</span> <span class="p">((</span><span class="n">result</span> <span class="p">(</span><span class="n">call</span><span class="o">-</span><span class="n">next</span><span class="o">-</span><span class="n">method</span><span class="p">)))</span>
+ <span class="p">(</span><span class="n">format</span> <span class="n">t</span> "<span class="o">~&</span><span class="n">Asked</span> <span class="n">to</span> <span class="n">calculate</span><span class="p">:</span> <span class="o">~</span><span class="n">d</span> <span class="n">on</span> <span class="o">~</span><span class="n">A</span> <span class="n">and</span> <span class="o">~</span><span class="n">A</span> <span class="p">=</span> <span class="o">~</span><span class="n">d</span><span class="p">.</span>" <span class="n">op</span> <span class="n">arg1</span> <span class="n">arg2</span> <span class="n">result</span><span class="p">)</span>
+ <span class="n">result</span><span class="p">))</span>
+
+ <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">add</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+ <span class="p">(</span><span class="o">+</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">))</span>
+ <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">subtract</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+ <span class="p">(</span><span class="o">-</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">))</span>
+ <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">multiply</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+ <span class="p">(</span><span class="o">*</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">))</span>
+ <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">divide</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+ <span class="p">(</span><span class="o">/</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">zip</span> <span class="p">()</span> <span class="p">(</span><span class="n">print</span> <span class="s">'</span><span class="err">zip))</span>
+</pre></div>
+
+
+<h2 id="translate-the-thrift-idl">Translate the Thrift IDL<a class="headerlink" href="#translate-the-thrift-idl" title="Permanent link">¶</a></h2>
+<p>IDL files employ the file extension <code>thrift</code>. In this case, there are two files to translate
+ * <code>tutorial.thrift</code>
+ * <code>shared.thrift</code>
+As the former includes the latter, one uses it to generate the interfaces:</p>
+<div class="codehilite"><pre>$<span class="n">THRIFT</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">thrift</span> <span class="o">-</span><span class="n">r</span> <span class="o">--</span><span class="n">gen</span> <span class="n">cl</span> $<span class="n">THRIFT</span><span class="o">/</span><span class="n">tutorial</span><span class="o">/</span><span class="n">tutorial</span><span class="p">.</span><span class="n">thrift</span>
+</pre></div>
+
+
+<p><code>-r</code> stands for recursion, while <code>--gen</code> lets one choose the language to translate to.</p>
+<h2 id="load-the-lisp-translated-service-interfaces">Load the Lisp translated service interfaces<a class="headerlink" href="#load-the-lisp-translated-service-interfaces" title="Permanent link">¶</a></h2>
+<p>The translator generates three files for each IDL file. For example <code>tutorial-types.lisp</code>,
+<code>tutorial-vars.lisp</code> and an <code>.asd</code> file that can be used to load them both and pull in
+other includes (like <code>shared</code> within the tutorial) as dependencies.</p>
+<h2 id="run-a-server-for-the-service">Run a Server for the Service<a class="headerlink" href="#run-a-server-for-the-service" title="Permanent link">¶</a></h2>
+<p>The actual service name, as specified in the <code>def-service</code> form in <code>tutorial.lisp</code>, is <code>calculator</code>.
+Each service definition defines a global variable with the service name and binds it to a
+service instance whch describes the operations.</p>
+<p>In order to start a service, specify a location and the service instance. </p>
+<div class="codehilite"><pre><span class="p">(</span><span class="n">in</span><span class="o">-</span><span class="n">package</span> <span class="p">:</span><span class="n">tutorial</span><span class="p">)</span>
+<span class="p">(</span><span class="n">serve</span> #<span class="n">u</span>"<span class="n">thrift</span><span class="p">:</span><span class="o">//</span>127<span class="p">.</span>0<span class="p">.</span>0<span class="p">.</span>1<span class="p">:</span>9091" <span class="n">calculator</span><span class="p">)</span>
+</pre></div>
+
+
+<h2 id="use-a-client-to-access-the-service-remotely">Use a Client to Access the Service Remotely<a class="headerlink" href="#use-a-client-to-access-the-service-remotely" title="Permanent link">¶</a></h2>
+<p>[in some other process] run the client</p>
+<div class="codehilite"><pre><span class="p">(</span><span class="n">in</span><span class="o">-</span><span class="n">package</span> <span class="p">:</span><span class="n">cl</span><span class="o">-</span><span class="n">user</span><span class="p">)</span>
+
+<span class="p">(</span><span class="n">macrolet</span> <span class="p">((</span><span class="n">show</span> <span class="p">(</span><span class="n">form</span><span class="p">)</span>
+ `<span class="p">(</span><span class="n">format</span> <span class="o">*</span><span class="n">trace</span><span class="o">-</span><span class="n">output</span><span class="o">*</span> "<span class="o">~</span><span class="c">%~s =>~{ ~s~}"</span>
+ <span class="s">',form</span>
+<span class="s"> (multiple-value-list (ignore-errors ,form)))))</span>
+<span class="s"> (with-client (protocol #u"thrift://127.0.0.1:9091")</span>
+<span class="s"> (show (tutorial.calculator:ping protocol))</span>
+<span class="s"> (show (tutorial.calculator:add protocol 1 2))</span>
+<span class="s"> (show (tutorial.calculator:add protocol 1 4))</span>
+
+<span class="s"> (let ((task (make-instance '</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span>
+ <span class="p">:</span><span class="n">op</span> <span class="n">operation</span><span class="p">.</span><span class="n">subtract</span> <span class="p">:</span><span class="n">num1</span> 15 <span class="p">:</span><span class="n">num2</span> 10<span class="p">)))</span>
+ <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="p">:</span><span class="n">calculate</span> <span class="n">protocol</span> 1 <span class="n">task</span><span class="p">))</span>
+
+ <span class="p">(</span><span class="n">setf</span> <span class="p">(</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span><span class="o">-</span><span class="n">op</span> <span class="n">task</span><span class="p">)</span> <span class="n">operation</span><span class="p">.</span><span class="n">divide</span>
+ <span class="p">(</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span><span class="o">-</span><span class="n">num1</span> <span class="n">task</span><span class="p">)</span> 1
+ <span class="p">(</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span><span class="o">-</span><span class="n">num2</span> <span class="n">task</span><span class="p">)</span> 0<span class="p">)</span>
+ <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="p">:</span><span class="n">calculate</span> <span class="n">protocol</span> 1 <span class="n">task</span><span class="p">)))</span>
+
+ <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">shared</span><span class="p">.</span><span class="n">shared</span><span class="o">-</span><span class="n">service</span><span class="p">:</span><span class="n">get</span><span class="o">-</span><span class="n">struct</span> <span class="n">protocol</span> 1<span class="p">))</span>
+
+ <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">zip</span> <span class="n">protocol</span><span class="p">))))</span>
+</pre></div>
+
+
+<h2 id="issues">Issues<a class="headerlink" href="#issues" title="Permanent link">¶</a></h2>
+<h3 id="optional-fields">optional fields<a class="headerlink" href="#optional-fields" title="Permanent link">¶</a></h3>
+<p>Where the IDL declares a field options, the def-struct form includes no
+ initform for the slot and the encoding operator skips an unbound slot. This leave some ambiguity
+ with bool fields.</p>
+<h3 id="instantiation-protocol">instantiation protocol :<a class="headerlink" href="#instantiation-protocol" title="Permanent link">¶</a></h3>
+<p>struct classes are standard classes and exception classes are
+ whatever the implementation prescribes. decoders apply make-struct to an initargs list.
+ particularly at the service end, there are advantages to resourcing structs and decoding
+ with direct side-effects on slot-values</p>
+<h3 id="maps">maps:<a class="headerlink" href="#maps" title="Permanent link">¶</a></h3>
+<p>Maps are now represented as hash tables. As data through the call/reply interface is all statically
+ typed, it is not necessary for the objects to themselves indicate the coding form. Association lists
+ would be sufficient. As the key type is arbitrary, property lists offer no additional convenience:
+ as <code>getf</code> operates with <code>eq</code> a new access interface would be necessary and they would not be
+ available for function application.</p>
+<ul>
+<li>usocket[[5]] : for the socket transport</li>
+<li>ieee-floats[[6]] : for conversion between ints and floats</li>
+<li>trivial-gray-streams[[7]] : an abstraction layer for gray streams</li>
+<li>alexandria[[8]] : handy utilities
+<p class='snippet_footer'>
+ This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+ <a href="http://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=lib/cl/README.md;hb=HEAD"</a>lib/cl/README.md</a>
+</p></li>
+</ul>
+ </div>
+ <div class="container">
+ <hr>
+ <footer class="footer">
+ <div class="row">
+ <div class="span3">
+ <h3>Links</h3>
+ <ul class="unstyled">
+ <li><a href="/download">Download</a></li>
+ <li><a href="/developers">Developers</a></li>
+ <li><a href="/tutorial">Tutorials</a></li>
+ </ul>
+ <ul class="unstyled">
+ <li><a href="/sitemap">Sitemap</a></li>
+ </ul>
+ </div>
+ <div class="span3">
+ <h3>Get Involved</h3>
+ <ul class="unstyled">
+ <li><a href="/mailing">Mailing Lists</a></li>
+ <li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+ <li><a href="/docs/HowToContribute">How To Contribute</a></li>
+ </ul>
+ </div>
+ <div class="span6">
+ <a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
+ Copyright ©2017 <a href="http://www.apache.org/">Apache Software Foundation</a>.
+ Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
+ Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+ </div>
+ </div>
+
+ </footer>
+</div>
+
+ </body>
+</html>
Modified: websites/staging/thrift/trunk/content/lib/index.html
==============================================================================
--- websites/staging/thrift/trunk/content/lib/index.html (original)
+++ websites/staging/thrift/trunk/content/lib/index.html Mon Mar 5 17:18:44 2018
@@ -91,6 +91,7 @@ h2:hover > .headerlink, h3:hover > .head
<p>Some language specific documentation is for the Apache Thrift Libraries are generated from lib/${language}/README.md files:</p>
<ul>
<li><a href="/lib/c_glib">C GLib</a></li>
+<li><a href="/lib/cl">Common Lisp Library README</a></li>
<li><a href="/lib/cpp">C++ library</a></li>
<li><a href="/lib/csharp">C# library</a></li>
<li><a href="/lib/d">D library</a></li>
Modified: websites/staging/thrift/trunk/content/sitemap.html
==============================================================================
--- websites/staging/thrift/trunk/content/sitemap.html (original)
+++ websites/staging/thrift/trunk/content/sitemap.html Mon Mar 5 17:18:44 2018
@@ -119,6 +119,7 @@ h2:hover > .headerlink, h3:hover > .head
<li><a href="/download">Download</a></li>
<li><a href="/lib/">Index of lib/</a><ul>
<li><a href="/lib/c_glib">C GLib</a></li>
+<li><a href="/lib/cl">Common Lisp Library README</a></li>
<li><a href="/lib/cpp">C++ library</a></li>
<li><a href="/lib/csharp">C# library</a></li>
<li><a href="/lib/d">D library</a></li>