<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Artful Code &#187; Software</title>
	<atom:link href="http://www.artfulcode.net/categories/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.artfulcode.net</link>
	<description>Resources and tips for dynamic, interactive languages.</description>
	<lastBuildDate>Fri, 09 Sep 2011 02:15:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Newlisp modules</title>
		<link>http://www.artfulcode.net/articles/newlisp-modules/</link>
		<comments>http://www.artfulcode.net/articles/newlisp-modules/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 02:13:30 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Site news]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[newlisp]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/articles/newlisp-modules/</guid>
		<description><![CDATA[The newlisp modules, including web.lsp, are now being maintained actively by Kanen Flowers on github. Thank you, Kanen. I have not had much time to work on any personal projects between family and work, so I appreciate his stewardship tremendously. You can check out his site at ScruffyThinking.com. Submit article]]></description>
			<content:encoded><![CDATA[<p>The newlisp modules, including web.lsp, are now being maintained actively by Kanen Flowers on <a href="https://github.com/LifeZero/artful-newlisp">github</a>. Thank you, Kanen. I have not had much time to work on any personal projects between family and work, so I appreciate his stewardship tremendously. You can check out his site at <a href="http://www.scruffythinking.com"  alt="ScruffyThinking.com">ScruffyThinking.com</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Newlisp+modules&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Newlisp+modules+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/newlisp-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hacking Vim</title>
		<link>http://www.artfulcode.net/articles/hacking-vim/</link>
		<comments>http://www.artfulcode.net/articles/hacking-vim/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 02:18:03 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[vim software]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=825</guid>
		<description><![CDATA[Vim has the potential to dramatically increase a programmer's productivity if you have the time and wherewithal to learn it. And it is a challenge to learn because it is unlike any other text editor (leaving aside other vi clones). It takes work not only to learn the editor's features and commands, but also to train yourself to use them effectively. Even experienced vim users will discover new, exciting features from time to time. And that is what makes Hacking Vim a real treat. It takes you on a brief tour of some of the coolest features of vim without getting bogged down in any one of them.]]></description>
			<content:encoded><![CDATA[<p>Vim has the potential to dramatically increase a programmer&#8217;s productivity if you have the time and wherewithal to learn it. And it is a challenge to learn because it is unlike any other text editor (leaving aside other vi clones). It takes work not only to learn the editor&#8217;s features and commands, but also to train yourself to use them effectively. Even experienced vim users will discover new, exciting features from time to time. And that is what makes <a href="https://www.packtpub.com/Vim/book">Hacking Vim</a>, by Kim Schulz, a real treat. It takes you on a brief tour of some of the coolest features of vim without getting bogged down in any one of them.<span id="more-825"></span></p>
<p>Hacking Vim bills itself as a recipe book. While it provides quite a few good ones, it seems to be organized more like a tutorial, using the examples to walk through some of the cooler features of vim. That said, the recipes it provides are very useful and a good number have made it into my ~/.vimrc.</p>
<p>I found some examples to be overly contrived. The author could have done a better job relating samples to real-world situations. I also wish it had gone into more depth when explaining some examples early on. If you don&#8217;t skip ahead and read the section on vim scripting (or know it already), there are a few traps in the examples.</p>
<p>For all that, though, my now heavily dog-eared and ruffled copy was well worth the money. Like other books from the same publisher, Hacking Vim stays on subject, maintaining its focus and pragmatism. Definitely a good source of worthwhile tips.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Hacking+Vim&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Hacking+Vim+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/hacking-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New projects and updates</title>
		<link>http://www.artfulcode.net/articles/new-projects-and-updates/</link>
		<comments>http://www.artfulcode.net/articles/new-projects-and-updates/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 19:37:38 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Site news]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=803</guid>
		<description><![CDATA[Just a few updates and some new projects. newLISP modules A Google Code project has been created for my newLISP modules. Anyone who would like to contribute is welcome. It can be found at http://code.google.com/p/actools-newlisp/. Phorms The Phorms library also has a Google Project page, located at http://code.google.com/p/php-phorms/. Contributions, as always, are welcome. PHP Pipeline [...]]]></description>
			<content:encoded><![CDATA[<p>Just a few updates and some new projects.</p>
<p><strong>newLISP modules</strong></p>
<p>A Google Code project has been created for my newLISP modules. Anyone who would like to contribute is welcome. It can be found at <a href="http://code.google.com/p/actools-newlisp/">http://code.google.com/p/actools-newlisp/</a>.</p>
<p><strong>Phorms</strong></p>
<p>The Phorms library also has a Google Project page, located at <a href="http://code.google.com/p/php-phorms/">http://code.google.com/p/php-phorms/</a>. Contributions, as always, are welcome.</p>
<p><strong>PHP Pipeline</strong></p>
<p>PHP Pipeline is an asynchronous HTTP pool. It is very simple to use and extremely efficient on resources. Code and samples available at <a href="http://code.google.com/p/php-pipeline/">http://code.google.com/p/php-pipeline/</a>.</p>
<p><strong>JoQ</strong></p>
<p><a href="http://code.google.com/p/joq/">JoQ</a> is a simple message broker written in Java. Its design goals are efficiency, speed, and ease of use. It is optimized for use as a massive job queue for multiple work flows. One neat feature is the ability to create multiple queues on the fly and add jobs to multiple queues; retrieved jobs are removed from all queues in which they appear.</p>
<p>This is a fairly new project and there is not much code yet written, but if anyone has any suggestions, comments, or contributions, I am happy to hear them.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=New+projects+and+updates&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+New+projects+and+updates+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/new-projects-and-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A better newLISP web library</title>
		<link>http://www.artfulcode.net/articles/a-better-newlisp-web-library/</link>
		<comments>http://www.artfulcode.net/articles/a-better-newlisp-web-library/#comments</comments>
		<pubDate>Fri, 29 May 2009 13:32:29 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[newlisp]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=648</guid>
		<description><![CDATA[One problem from which newLISP suffers is the lack of a really useful library for web-based applications. The <a href="http://newlisp.nfshost.com/code/modules/cgi.lsp.html">official CGI module</a> has serious enough problems to justify an entirely new library. After some thought, I decided moreover that the <a href="http://static.artfulcode.net/newlisp/request.lsp.html">request</a> and <a href="http://static.artfulcode.net/newlisp/response.lsp.html">response</a> modules that I designed were neither practical nor sufficient. To that end, I have designed a new, monolithic library to provide the essential functionality required for web programming]]></description>
			<content:encoded><![CDATA[<p>One problem from which newLISP suffers is the lack of a really useful library for web-based applications. The <a href="http://newlisp.nfshost.com/code/modules/cgi.lsp.html">official CGI module</a> has serious enough problems to justify an entirely new library. After some thought, I decided moreover that the <a href="http://static.artfulcode.net/newlisp/request.lsp.html">request</a> and <a href="http://static.artfulcode.net/newlisp/response.lsp.html">response</a> modules that I designed were neither practical nor sufficient. To that end, I have designed a new, monolithic library to provide the essential functionality required for web programming.<span id="more-648"></span></p>
<p>The official CGI module has some real issues. First, it combines POST and GET variables into a single structure. This has two serious consequences: 1) the application has no way to determine the method by which a parameter is passed (that information is completely lost), and 2) name clashes between GET and POST result in the loss of one or the other parameter (in the case of the CGI module, GET information would be overwritten.)</p>
<p>Another issue in the CGI module is with the <code>put-page</code> function, which breaks if &#8220;%&gt;&#8221; is used inside of a code island, even legitimately, such as in a string.</p>
<p><a href="http://static.artfulcode.net/newlisp/web.lsp.html">Web</a> fixes both of these problems and provides a number of other features, including:</p>
<ul>
<li>ASP/PHP-style templates</li>
<li>Getting/setting cookies, GET, and POST parameters</li>
<li>Entity encoding and decoding</li>
<li>HTTP header control</li>
<li>Sessions</li>
<li>Custom session storage</li>
<li>URL building and parsing</li>
<li>URL encoding and decoding</li>
<li>Query string building and parsing</li>
</ul>
<p>Additionally, Web does not suffer from the GET/POST issues that the CGI module does, nor does it mishandle tags inside of code.</p>
<h2>HTTP Headers</h2>
<p>Headers are set using <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_header"><code>Web:header</code></a>, which accepts two parameters &#8211; the header name and the header value. By default, one header is already set: <strong>Content-type: text/html</strong>. Headers are output using <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_send-headers"><code>Web:send-headers</code></a>, which is called before any other output. The convenience function <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_redir"><code>Web:redir</code></a> redirects the browser to the passed URL.</p>
<h2>GET and POST</h2>
<p>GET and POST variables are accessed using <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_get"><code>Web:get</code></a> and <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_post"><code>Web:post</code></a>, which may be called in two ways. When called with a single parameter, these functions act like <code>lookup</code> and return the GET/POST parameter with the named key. When called with no parameters, they return an association list of the corresponding query.</p>
<h2>Cookies</h2>
<p>Cookies must be set before headers are sent. They are set using the <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_cookie"><code>Web:cookie</code></a> function, which accepts up to six parameters.</p>

<div class="wp_syntax"><div class="code"><pre class="newlisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Set a basic cookie</span>
<span style="color: #AF0500;">&#40;</span>cookie <span style="color: #3AA43E;">&quot;foo&quot;</span> <span style="color: #3AA43E;">&quot;bar&quot;</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; Access a cookie value</span>
<span style="color: #AF0500;">&#40;</span>cookie <span style="color: #3AA43E;">&quot;foo&quot;</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; Delete a cookie by setting expires to now</span>
<span style="color: #AF0500;">&#40;</span>cookie <span style="color: #3AA43E;">&quot;foo&quot;</span> <span style="color: #2028B8;">nil</span> <span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">date-value</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; Set a cookie that expires in an hour</span>
<span style="color: #AF0500;">&#40;</span>cookie <span style="color: #3AA43E;">&quot;foo&quot;</span> <span style="color: #3AA43E;">&quot;bar&quot;</span> <span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">+</span> <span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">date-value</span><span style="color: #AF0500;">&#41;</span> <span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">*</span> <span style="color: #675400;">60</span> <span style="color: #675400;">60</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span></pre></div></div>

<p>See the <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_cookie">documentation</a> for a full list of accepted parameters.</p>
<h2>Sessions</h2>
<p>By default, sessions use file-based storage (located at /tmp). They are controlled with a few simple functions. The default <code>exit</code> function is wrapped to ensure that <code>Web:close-session</code> is called at the end of a script (at least, a script that calls <code>exit</code> at its end.)</p>

<div class="wp_syntax"><div class="code"><pre class="newlisp" style="font-family:monospace;"><span style="color: #AF0500;">&#40;</span>Web:<span style="color: #2028B8;">open-session</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #AF0500;">&#40;</span>Web:<span style="color: #2028B8;">session</span> <span style="color: #3AA43E;">&quot;foo&quot;</span> <span style="color: #3AA43E;">&quot;bar&quot;</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; store &quot;foo&quot; as &quot;bar&quot;</span>
<span style="color: #AF0500;">&#40;</span>Web:<span style="color: #2028B8;">send-headers</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; start output</span>
<span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">println</span> <span style="color: #3AA43E;">&quot;&lt;p&gt;&lt;strong&gt;foo is:&lt;/strong&gt; &quot;</span> <span style="color: #AF0500;">&#40;</span>Web:<span style="color: #2028B8;">session</span> <span style="color: #3AA43E;">&quot;foo&quot;</span><span style="color: #AF0500;">&#41;</span> <span style="color: #3AA43E;">&quot;&lt;/p&gt;&quot;</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">exit</span> <span style="color: #675400;">0</span><span style="color: #AF0500;">&#41;</span></pre></div></div>

<p>It is a simple matter to design and use custom storage handlers. The function <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_define-session-handlers"><code>Web:define-session-handlers</code></a> allows customization of which functions are called to begin/load, close/write, delete a session, and clear old sessions. See the <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_define-session-handlers">documentation</a> for a list of helpful functions and variables for custom storage handlers.</p>
<h2>Templates</h2>
<p>Templates work almost identically to the official CGI module, with a few differences. First, <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_eval-template"><code>Web:eval-template</code></a> is called with a string, rather than a file, to permit other storage methods and programmatic building of templates. Second, &lt;%= .. %&gt; may be substituted for the default opening tag as a shortcut for &lt;% (print &#8230; ) %&gt;. Last, the opening and closing tags may be customized by setting values of <code>Web:OPEN_TAG</code> and <code>Web:CLOSE_TAG</code>. The shortcut tag will always be <code>Web:OPEN_TAG</code> appended with and equal sign.</p>
<h2>Encoding and decoding</h2>
<p>There are several functions to make encoding, decoding, and escaping strings easier for dealing with URLs, javascript, and HTML entities.</p>
<p><a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_escape"><code>Web:escape</code></a> takes a string and encodes the basic HTML character entities (apostrophe, quote, ampersand, and left and right angle brackets.) <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_unescape"><code>Web:unescape</code></a> provides the reverse. The function <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_escape-js"><code>Web:escape-js</code></a> does no encoding of entities, but instead ensures that a string may be safely output in javascript string without causing syntax errors.</p>
<p><a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_encode-entities"><code>Web:encode-entities</code></a> encodes all HTML entities, including a number of entities that are not fully supported by all browser. The full list of entities is derived from <a href="http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references">Wikipedia</a>. Its reverse, <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_decode-entities"><code>Web:decode-entities</code></a>, translates entities back into their character equivalents.</p>
<p>The functions <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_url-encode"><code>Web:url-encode</code></a> and <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_url-decode"><code>Web:url-decode</code></a> deal with hex-encoding/decoding strings for use in URLs.</p>
<p>Query strings are easily created using <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_build-query"><code>Web:build-query</code></a>, modeled after the PHP function  <code>http_build_query</code>.  Its counterpart, <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_parse-query"><code>Web:parse-query</code></a>, takes a query string and turns it into an association list.</p>
<p>For URLs, it is simpler to use <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_build-url"><code>Web:build-url</code></a>, which takes a URL and any number of association lists which it uses to build a complete URL. Each alist may overwrite parameters from the previous, including any parameters on the passed URL.</p>

<div class="wp_syntax"><div class="code"><pre class="newlisp" style="font-family:monospace;"><span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">let</span> <span style="color: #AF0500;">&#40;</span><span style="color: #AF0500;">&#40;</span>url <span style="color: #3AA43E;">&quot;http://www.artfulcode.net/?s=newlisp&quot;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span>
  <span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">println</span> <span style="color: #AF0500;">&#40;</span>Web:<span style="color: #2028B8;">build-url</span> url '<span style="color: #AF0500;">&#40;</span><span style="color: #AF0500;">&#40;</span><span style="color: #3AA43E;">&quot;s&quot;</span> <span style="color: #3AA43E;">&quot;newlisp web module&quot;</span><span style="color: #AF0500;">&#41;</span> <span style="color: #AF0500;">&#40;</span><span style="color: #3AA43E;">&quot;foo&quot;</span> <span style="color: #3AA43E;">&quot;bar&quot;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; =&gt; http://www.artfulcode.net/?s=newlisp+web+module&amp;foo=bar</span></pre></div></div>

<p>It also has a counterpart, <a href="http://static.artfulcode.net/newlisp/web.lsp.html#Web_parse-url"><code>Web:parse-url</code></a>, which breaks a URL up into an association list of its component parts.</p>
<h2>Download</h2>
<p>You can find it in the <a href="http://static.artfulcode.net/newlisp/index.html">repository</a> or download it directly <a href="http://static.artfulcode.net/newlisp/web.lsp">here</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F&amp;title=A+better+newLISP+web+library" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F&amp;title=A+better+newLISP+web+library" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=A+better+newLISP+web+library&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F&amp;title=A+better+newLISP+web+library" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F&amp;title=A+better+newLISP+web+library" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F&amp;title=A+better+newLISP+web+library" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+A+better+newLISP+web+library+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-newlisp-web-library%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/a-better-newlisp-web-library/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Updated Json module for newLISP</title>
		<link>http://www.artfulcode.net/articles/updated-json-module-for-newlisp/</link>
		<comments>http://www.artfulcode.net/articles/updated-json-module-for-newlisp/#comments</comments>
		<pubDate>Fri, 22 May 2009 18:10:01 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[newlisp]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=643</guid>
		<description><![CDATA[Thanks to Andrew Pennebaker for pointing out where the decoder was broken. This update includes a complete rewrite of the JSON decoder. It is now slightly more forgiving and much more accurate. You can download it here or upgrade using nl-install. Submit article]]></description>
			<content:encoded><![CDATA[<p>Thanks to Andrew Pennebaker for pointing out where the decoder was broken. This update includes a complete rewrite of the JSON decoder. It is now slightly more forgiving and much more accurate. You can download it <a href="http://static.artfulcode.net/newlisp/json.lsp.html">here</a> or upgrade using <a href="http://static.artfulcode.net/nl-install/packages.lsp">nl-install</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F&amp;title=Updated+Json+module+for+newLISP" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F&amp;title=Updated+Json+module+for+newLISP" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Updated+Json+module+for+newLISP&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F&amp;title=Updated+Json+module+for+newLISP" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F&amp;title=Updated+Json+module+for+newLISP" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F&amp;title=Updated+Json+module+for+newLISP" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Updated+Json+module+for+newLISP+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fupdated-json-module-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/updated-json-module-for-newlisp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phorms: a PHP form library</title>
		<link>http://www.artfulcode.net/articles/phorms-a-php-form-library/</link>
		<comments>http://www.artfulcode.net/articles/phorms-a-php-form-library/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 20:29:45 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=587</guid>
		<description><![CDATA[Phorms is a general purpose, easy-to-use HTML forms library. Phorms aims to provide a simple framework for generating complex forms. Forms are created by extending the abstract Phorm class. Validation is simple and easy to implement. Django users especially will find Phorms&#8217; validation familiar: require_once&#40;'lib/phorms/phorms.php'&#41;; &#160; function required&#40;$value&#41; &#123; if &#40;$value == '' &#124;&#124; is_null&#40;$value&#41;&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>Phorms is a general purpose, easy-to-use HTML forms library.  Phorms aims to provide a simple framework for generating complex forms.<span id="more-587"></span></p>
<p>Forms are created by extending the abstract Phorm class.  Validation is simple and easy to implement.  Django users especially will find Phorms&#8217; validation familiar:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'lib/phorms/phorms.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> required<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span> <span style="color: #339933;">||</span> <span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    throw <span style="color: #000000; font-weight: bold;">new</span> ValidationError<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'This field is required.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> CommentForm <span style="color: #000000; font-weight: bold;">extends</span> Phorm
<span style="color: #009900;">&#123;</span>
  protected <span style="color: #000000; font-weight: bold;">function</span> define_fields<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Define form fields</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_id</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HiddenField<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">first_name</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TextField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;First name&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">last_name</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TextField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Last name&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> EmailField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Email address&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> URLField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Home page&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">number</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IntegerField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Favorite number&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">message</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LargeTextField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Message'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">40</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'required'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">notify</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BooleanField<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Reply notification'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Add some help text</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">notify</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set_help_text</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Email me when my comment receives a response.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set_help_text</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'We will never give out your email address.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Setting default values is simple:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$form</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CommentForm<span style="color: #009900;">&#40;</span>Phorm<span style="color: #339933;">::</span><span style="color: #004000;">POST</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'post_id'</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">42</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'notify'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>And form validation is a breeze:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valid</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_valid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Phorm instances serialize to an HTML table and provide methods to open and close the form:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">open</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_SELF'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>The Phorms library:</p>
<ul>
<li>supports file and image uploads</li>
<li>has easy to use validation</li>
<li>is extensible by subclassing the build-in PhormField and PhormWidget classes</li>
<li><a href="http://static.artfulcode.net/phorms/doc/">is completely documented with phpdoc</a></li>
</ul>
<p>You can download it from my <a href="http://www.artfulcode.net/phorms/">projects page</a> or <a href="http://static.artfulcode.net/phorms/phorms.zip">directly</a>.</p>
<p><strong>Update:</strong> fixed a couple bugs and put API docs online.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F&amp;title=Phorms%3A+a+PHP+form+library" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F&amp;title=Phorms%3A+a+PHP+form+library" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Phorms%3A+a+PHP+form+library&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F&amp;title=Phorms%3A+a+PHP+form+library" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F&amp;title=Phorms%3A+a+PHP+form+library" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F&amp;title=Phorms%3A+a+PHP+form+library" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Phorms%3A+a+PHP+form+library+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fphorms-a-php-form-library%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/phorms-a-php-form-library/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>A module manager for newlisp</title>
		<link>http://www.artfulcode.net/articles/a-module-manager-for-newlisp/</link>
		<comments>http://www.artfulcode.net/articles/a-module-manager-for-newlisp/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 18:28:02 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[newlisp]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=551</guid>
		<description><![CDATA[nl-install is a basic module manager for newlisp. With this first release, I have set up a repository for the Artful Code modules and included it in the default settings for the application.]]></description>
			<content:encoded><![CDATA[<p>nl-install is a simple module manager for newlisp. With this first release, I have set up a repository for the Artful Code modules and included it in the default settings for the application.<span id="more-551"></span></p>
<p>There are not a huge number of features at the moment, but here is the list:</p>
<ul>
<li>install modules from multiple repositories</li>
<li>install/uninstall module dependencies</li>
<li>automatic upgrade of modules</li>
<li>newlisp version checking</li>
<li>file clash checking</li>
</ul>
<h2>Basic setup</h2>
<p>Download the archive nl-install from <a href="http://static.artfulcode.net/nl-install/">http://static.artfulcode.net/nl-install/</a>. Extract and edit the nl-install file to set up your target installation directory (/usr/share/newlips/site-lisp by default) and any (future) extra repositories you would like to add. Make the file executable and place in your path, then update:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x nl-install
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> nl-install <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin
<span style="color: #c20cb9; font-weight: bold;">sudo</span> nl-install update</pre></div></div>

<h2>Usage</h2>
<p>To see the list of all available modules or just the ones installed:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">nl-install list available
nl-install list installed</pre></div></div>

<p>To install one or more modules:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> nl-install <span style="color: #c20cb9; font-weight: bold;">install</span> acode:csv
<span style="color: #c20cb9; font-weight: bold;">sudo</span> nl-install <span style="color: #c20cb9; font-weight: bold;">install</span> acode:matching acode:util</pre></div></div>

<p>If there are other modules that must be installed first, you will be prompted for their installation.</p>
<p>To uninstall a module:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> nl-install uninstall acode:csv</pre></div></div>

<p>Re-install a module to get the latest version.</p>
<h2>Repositories</h2>
<p>Setting up your own repository is easy. Just write a package listing and put it online somewhere. A sample is included in the tarball:</p>

<div class="wp_syntax"><div class="code"><pre class="newlisp" style="font-family:monospace;"><span style="color: #AF0500;">&#40;</span>repository
  <span style="color: #AF0500;">&#40;</span>title <span style="color: #3AA43E;">&quot;My repository&quot;</span><span style="color: #AF0500;">&#41;</span>
  <span style="color: #AF0500;">&#40;</span>identifier <span style="color: #3AA43E;">&quot;foo&quot;</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; once chosen, this should *not* change</span>
  <span style="color: #AF0500;">&#40;</span>contact <span style="color: #3AA43E;">&quot;My Name &quot;</span><span style="color: #AF0500;">&#41;</span>
  <span style="color: #AF0500;">&#40;</span>version <span style="color: #675400;">1000</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; repository version number (1.0)</span>
&nbsp;
  <span style="color: #AF0500;">&#40;</span>module
    <span style="color: #AF0500;">&#40;</span>title <span style="color: #3AA43E;">&quot;module1&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>description <span style="color: #3AA43E;">&quot;A short description of module1&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>url <span style="color: #3AA43E;">&quot;http://location/of/module1.lsp&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>qwerty <span style="color: #3AA43E;">&quot;http://location/of/module1.qwerty&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>version <span style="color: #675400;">1010</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; 1.1</span>
    <span style="color: #AF0500;">&#40;</span>newlisp-min-version <span style="color: #675400;">10000</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; 10</span>
    <span style="color: #AF0500;">&#40;</span>newlisp-max-version <span style="color: #675400;">10001</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; 10.0.1</span>
    <span style="color: #AF0500;">&#40;</span>depends <span style="color: #2028B8;">nil</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; no dependencies</span>
&nbsp;
  <span style="color: #AF0500;">&#40;</span>module
    <span style="color: #AF0500;">&#40;</span>title <span style="color: #3AA43E;">&quot;module2&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>description <span style="color: #3AA43E;">&quot;A short description of module2&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>url <span style="color: #3AA43E;">&quot;http://location/of/module2.lsp&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>qwerty <span style="color: #3AA43E;">&quot;http://location/of/module2.qwerty&quot;</span><span style="color: #AF0500;">&#41;</span>
    <span style="color: #AF0500;">&#40;</span>version <span style="color: #675400;">2011</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; 2.1.1</span>
    <span style="color: #AF0500;">&#40;</span>newlisp-min-version <span style="color: #675400;">10000</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; 10</span>
    <span style="color: #AF0500;">&#40;</span>newlisp-max-version <span style="color: #675400;">10001</span><span style="color: #AF0500;">&#41;</span> <span style="color: #808080; font-style: italic;">; 10.0.1</span>
    <span style="color: #AF0500;">&#40;</span>depends <span style="color: #3AA43E;">&quot;foo:module1&quot;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span></pre></div></div>

<p>Let me know about it and I will put it in the repository list.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F&amp;title=A+module+manager+for+newlisp" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F&amp;title=A+module+manager+for+newlisp" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=A+module+manager+for+newlisp&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F&amp;title=A+module+manager+for+newlisp" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F&amp;title=A+module+manager+for+newlisp" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F&amp;title=A+module+manager+for+newlisp" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+A+module+manager+for+newlisp+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-module-manager-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/a-module-manager-for-newlisp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiprocessing utilities for newLisp</title>
		<link>http://www.artfulcode.net/articles/multiprocessing-utilities-for-newlisp/</link>
		<comments>http://www.artfulcode.net/articles/multiprocessing-utilities-for-newlisp/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 17:39:26 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[newlisp]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=533</guid>
		<description><![CDATA[newLisp's Cilk API simplifies the task for forking new processes and retrieving the results of child processes' calculations a breeze. Some patterns remain complex, particularly when dealing with shared state or managing access to resources. To formalize some of the more common patterns of usage with the Cilk API, semaphores, and shared memory, I have written a multiprocessing library for newLisp.]]></description>
			<content:encoded><![CDATA[<p>newLisp&#8217;s Cilk API simplifies the task for forking new processes and retrieving the results of child processes&#8217; calculations a breeze. Some patterns remain complex, particularly when dealing with shared state or managing access to resources. To formalize some of the more common patterns of usage with the Cilk API, semaphores, and shared memory, I have written a multiprocessing library for newLisp.<span id="more-533"></span></p>
<p>The module came out of my original locks module, which contained only the Lock and RLock classes. The new library contains the following classes:</p>
<ul>
<li><strong>Semaphore:</strong> simplifies use of semaphores</li>
<li><strong>Shared:</strong> simplifies use of shared memory</li>
<li><strong>Synchronized:</strong> shared memory made safe for use between processes</li>
<li><strong>Lock:</strong> a binary semaphore, or mutex</li>
<li><strong>RLock:</strong> a recursive Lock</li>
<li><strong>Event:</strong> a simple mechanism to signal multiple processes</li>
<li><strong>Pipe:</strong> simplifies use of pipes</li>
<li><strong>Channel:</strong> a two-way communications channel made with pipes</li>
<li><strong>Queue:</strong> a synchronized first in, first out class</li>
</ul>
<p>MP additionally includes various utilities to deal with common tasks:</p>
<ul>
<li><strong>get-pid:</strong> gets the current processes&#8217; pid</li>
<li><strong>with-lock-held:</strong> a macro that evaluates its body while holding a lock</li>
<li><strong>wait:</strong> waits for a condition with variable length polling to reduce processor load</li>
<li><strong>map and iter:</strong> versions of map and dolist evaluated asynchronously using the Cilk API</li>
</ul>
<p>Perhaps the most useful function in the module is with-lock-held, which simplifies the most common locking case: assuring that a block of code is executed atomically.</p>

<div class="wp_syntax"><div class="code"><pre class="newlisp" style="font-family:monospace;"><span style="color: #AF0500;">&#40;</span><span style="color: #2028B8;">setf</span> lock <span style="color: #AF0500;">&#40;</span>RLock<span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span>
<span style="color: #AF0500;">&#40;</span>with-lock-held lock
  <span style="color: #AF0500;">&#40;</span>access-restricted-resource<span style="color: #AF0500;">&#41;</span><span style="color: #AF0500;">&#41;</span></pre></div></div>

<p>In this case, no more than one process can evaluate <code>(access-restricted-resource)</code> at a time.</p>
<p>You can download the <a href="http://static.artfulcode.net/newlisp/mp.lsp.html">MP module</a> from my <a href="http://static.artfulcode.net/newlisp/index.html">newLisp module repository</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F&amp;title=Multiprocessing+utilities+for+newLisp" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F&amp;title=Multiprocessing+utilities+for+newLisp" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Multiprocessing+utilities+for+newLisp&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F&amp;title=Multiprocessing+utilities+for+newLisp" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F&amp;title=Multiprocessing+utilities+for+newLisp" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F&amp;title=Multiprocessing+utilities+for+newLisp" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Multiprocessing+utilities+for+newLisp+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmultiprocessing-utilities-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/multiprocessing-utilities-for-newlisp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A better MySQL module for newLISP</title>
		<link>http://www.artfulcode.net/articles/a-better-mysql-module-for-newlisp/</link>
		<comments>http://www.artfulcode.net/articles/a-better-mysql-module-for-newlisp/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 17:23:32 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[foop]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[newlisp]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=491</guid>
		<description><![CDATA[The Mysql module has been written from scratch utilizing some of the more recent features of newLisp, such as FOOP and reference returns. One of its major design goals was to simplify use as well as broaden the features of the standard MySQL module, while at the same time allowing the creation of new, anonymous [...]]]></description>
			<content:encoded><![CDATA[<p>The <strong><code>Mysql</code></strong> module has been written from scratch utilizing some of the more recent features of newLisp, such as FOOP and reference returns. One of its major design goals was to simplify use as well as broaden the features of the standard <a href="http://www.newlisp.org/code/modules/mysql.lsp.html">MySQL module</a>, while at the same time allowing the creation of new, anonymous instances at run-time.<span id="more-491"></span></p>
<p>The <code>Mysql</code> module differs from the distribution standard module in several important ways. Most obviously, it uses <a href="http://www.artfulcode.net/articles/using-the-newlisp-ffi/">FOOP wrappers for MySQL types</a>. It also requires clients to free results instances; in the standard module, only the base MYSQL instance itself must be freed (using <code>MySQL:close-db</code>).</p>
<p>The significance of this is that it is much simpler to create multiple connections (without having to duplicate the entire context at compile time). Result sets are completely independent of each other, and several may be maintained in any state at once. This also means that a spawned process may be given its own Mysql instance to use without having to worry about other processes&#8217; instances interfering. Using the standard module, the entire context would need to be cloned at compile time and given a static symbol reference (e.g., <code>(new 'MySQL 'db)</code>) in order to run multiple instances or connections to a server.</p>
<p>Moreover, because this module uses <code>unpack</code> and MySQL C API accessor functions, there is no need for the client to calculate member offsets in MySQL compound types. So long as newLisp was compiled for the same target as the <code>libmysqlclient</code> library (both are 32 bit or both are 64 bit), everything should work out of the box. Additionally, MySQL errors are now checked in the connect and query functions and re-thrown as interpreter errors. Instead of checking for <code>nil</code> returns and a using MySQL:error to get the error message, standard error  handling with the <code>catch</code> function may be used.</p>
<p>Several convenience functions and macros have been defined in the <code>mysql</code> context for common operations, including connecting to the database and iterating over results without having to worry about catching errors and managing memory. SQL statements may be passed as strings or a list containing a format string and its parameters, which will type-checked and automatically be escaped as needed.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>mysql<span style="color: #66cc66;">:</span><span style="color: #555;">on-connect</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;localhost&quot;</span> <span style="color: #ff0000;">&quot;user&quot;</span> <span style="color: #ff0000;">&quot;secret&quot;</span> <span style="color: #ff0000;">&quot;my_database&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>db err<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> err
      <span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Error! &quot;</span> err<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>mysql<span style="color: #66cc66;">:</span><span style="color: #555;">row-iter</span> db <span style="color: #ff0000;">&quot;SELECT * FROM some_table&quot;</span> true
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>row<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>println row<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>This module has been tested with MySQL version 5 and 5.1 and newLisp version 10.0.1. It requires newLisp 10.0 or later. You can <a href="http://static.artfulcode.net/newlisp/mysql.lsp.html">download it</a> from the <a href="http://static.artfulcode.net/newlisp/">Artful Code newLisp module repository</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F&amp;title=A+better+MySQL+module+for+newLISP" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F&amp;title=A+better+MySQL+module+for+newLISP" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=A+better+MySQL+module+for+newLISP&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F&amp;title=A+better+MySQL+module+for+newLISP" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F&amp;title=A+better+MySQL+module+for+newLISP" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F&amp;title=A+better+MySQL+module+for+newLISP" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+A+better+MySQL+module+for+newLISP+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fa-better-mysql-module-for-newlisp%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/a-better-mysql-module-for-newlisp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>newLISP TextMate bundle 1.1</title>
		<link>http://www.artfulcode.net/articles/newlisp-textmate-bundle-11/</link>
		<comments>http://www.artfulcode.net/articles/newlisp-textmate-bundle-11/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 17:49:05 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[releases]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/articles/newlisp-textmate-bundle-11/</guid>
		<description><![CDATA[Not a whole lot new with this release. A new theme (newLISP dark) with a dark background and a couple of updates to recognized keywords. Download it here. Submit article]]></description>
			<content:encoded><![CDATA[<p>Not a whole lot new with this release.  A new theme (newLISP dark) with a dark background and a couple of updates to recognized keywords.  Download it <a href="/projects/">here</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F&amp;title=newLISP+TextMate+bundle+1.1" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F&amp;title=newLISP+TextMate+bundle+1.1" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=newLISP+TextMate+bundle+1.1&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F&amp;title=newLISP+TextMate+bundle+1.1" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F&amp;title=newLISP+TextMate+bundle+1.1" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F&amp;title=newLISP+TextMate+bundle+1.1" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+newLISP+TextMate+bundle+1.1+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-textmate-bundle-11%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/newlisp-textmate-bundle-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

