<?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>brool &#187; macro</title>
	<atom:link href="http://www.brool.com/index.php/tag/macro/feed" rel="self" type="application/rss+xml" />
	<link>http://www.brool.com</link>
	<description>brool \brool\ (n.) : a low roar; a deep murmur or humming</description>
	<lastBuildDate>Fri, 20 Jan 2012 07:58:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Snippet: Automatic Proxy Creation in Clojure</title>
		<link>http://www.brool.com/index.php/snippet-automatic-proxy-creation-in-clojure</link>
		<comments>http://www.brool.com/index.php/snippet-automatic-proxy-creation-in-clojure#comments</comments>
		<pubDate>Fri, 21 Aug 2009 22:20:42 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=366</guid>
		<description><![CDATA[The proxy function makes it easy for Clojure to interface with the Java layer, but I was dealing with an interface (the AIM Java API) that had an punitive number of things that needed to be overridden&#8230; public void OnIdleStateChange&#40;AccSession arg0, int arg1&#41; &#123; &#125; &#160; public void OnInstanceChange&#40;AccSession arg0, AccInstance arg1, AccInstance arg2, AccInstanceProp [...]]]></description>
			<content:encoded><![CDATA[<p>The proxy function makes it easy for Clojure to interface with the Java layer, but I was dealing with an interface (the AIM Java API) that had an punitive number of things that needed to be overridden&#8230;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> OnIdleStateChange<span class="br0">&#40;</span>AccSession arg0, <span class="kw4">int</span> arg1<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> OnInstanceChange<span class="br0">&#40;</span>AccSession arg0, AccInstance arg1, AccInstance arg2, AccInstanceProp arg3<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> OnLookupUsersResult<span class="br0">&#40;</span>AccSession arg0, <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> arg1, <span class="kw4">int</span> arg2, AccResult arg3, AccUser<span class="br0">&#91;</span><span class="br0">&#93;</span> arg4<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> OnSearchDirectoryResult<span class="br0">&#40;</span>AccSession arg0, <span class="kw4">int</span> arg1, AccResult arg2, AccDirEntry arg3<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// ... go on like this for pages</span></pre></div></div></div></div></div></div></div>




<p>The Java code is <a href="http://dev.aol.com/aimclient/OpenAIM182/samples/accjsample/AccJSample.java">here</a>, if you&#8217;re interested in the entire set of calls.  Now, I didn&#8217;t care about most of those events, but I had to override them, since they didn&#8217;t have a default implementation.  What made this seem painful was that I was really only interested in two of the callbacks.  So I started to record an Emacs macro to convert the Java code to the equivalent Clojure proxy statement, and then I realized that I didn&#8217;t have to &mdash; <i>I was using a Lisp</i>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defmacro</span> auto<span class="sy0">-</span><span class="kw1">proxy</span> <span class="br0">&#91;</span>interfaces variables <span class="sy0">&amp;</span> args<span class="br0">&#93;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#91;</span>defined <span class="br0">&#40;</span><span class="kw1">set</span> <span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#40;</span><span class="kw1">str</span> <span class="br0">&#40;</span><span class="kw1">first</span> <span class="sy0">%</span><span class="br0">&#41;</span><span class="br0">&#41;</span> args<span class="br0">&#41;</span><span class="br0">&#41;</span>
        names <span class="br0">&#40;</span><span class="kw1">fn</span> <span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="br0">&#40;</span><span class="kw1">map</span> #<span class="br0">&#40;</span><span class="sy0">.</span>getName <span class="sy0">%</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">.</span>getMethods i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        all<span class="sy0">-</span>names <span class="br0">&#40;</span><span class="kw1">into</span> #<span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="br0">&#40;</span><span class="kw1">apply</span> <span class="kw1">concat</span> <span class="br0">&#40;</span><span class="kw1">map</span> names <span class="br0">&#40;</span><span class="kw1">map</span> resolve interfaces<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        undefined <span class="br0">&#40;</span>difference all<span class="sy0">-</span>names defined<span class="br0">&#41;</span> 
        auto<span class="sy0">-</span>gen <span class="br0">&#40;</span><span class="kw1">map</span> <span class="br0">&#40;</span><span class="kw1">fn</span> <span class="br0">&#91;</span>x<span class="br0">&#93;</span> `<span class="br0">&#40;</span>~<span class="br0">&#40;</span>symbol x<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="sy0">&amp;</span> ~'args<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> undefined<span class="br0">&#41;</span><span class="br0">&#93;</span>
    `<span class="br0">&#40;</span><span class="kw1">proxy</span> ~interfaces ~variables ~@args ~@auto<span class="sy0">-</span>gen<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Auto-proxy works just like proxy, but it makes an empty implementation for any call that wasn&#8217;t defined.  So, suddenly, what would have been a bunch of lines collapsed into just:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="clojure"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">defn</span> create<span class="sy0">-</span>aim<span class="sy0">-</span><span class="kw1">proxy</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
  <span class="br0">&#40;</span>auto<span class="sy0">-</span><span class="kw1">proxy</span> <span class="br0">&#91;</span>com<span class="sy0">.</span>aol<span class="sy0">.</span>acc<span class="sy0">.</span>AccEvents<span class="br0">&#93;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
     <span class="br0">&#40;</span>OnImReceived <span class="br0">&#91;</span>session imSession participant im<span class="br0">&#93;</span> 
        <span class="br0">&#40;</span>handle<span class="sy0">-</span>im session imSession participant im<span class="br0">&#41;</span><span class="br0">&#41;</span>
     <span class="br0">&#40;</span>OnStateChange <span class="br0">&#91;</span>arg0 arg1 arg2<span class="br0">&#93;</span>
        <span class="br0">&#40;</span>handle<span class="sy0">-</span>state<span class="sy0">-</span>change arg0 arg1 arg2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>




<p>Macros ftw.  The nice thing about Clojure/Lisp is that it makes coding up this kind of reusable framework stuff really easy.</p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/snippet-automatic-proxy-creation-in-clojure/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

