forgot to cc the list, fwded!<br><br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Drew Crampsie</b> <span dir="ltr"><<a href="mailto:me@drewc.ca">me@drewc.ca</a>></span><br>
Date: Mon, Oct 29, 2012 at 4:41 PM<br>Subject: Re: [lisp-interface-library-devel] Curating libraries<br>To: Faré <<a href="mailto:fahree@gmail.com">fahree@gmail.com</a>><br><br><br><br><br><div class="gmail_quote"><div class="im">
On Mon, Oct 29, 2012 at 3:36 PM, Faré <span dir="ltr"><<a href="mailto:fahree@gmail.com" target="_blank">fahree@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div>On Tue, Oct 30, 2012 at 6:32 AM, Drew Crampsie <<a href="mailto:me@drewc.ca" target="_blank">me@drewc.ca</a>> wrote:<br>
> This is the call/cc that will/should be included in :interface/monad :<br>
><br>
</div>Yay for the continuation monad!<br>
<br>
I propose you create a ips-monad.asd system and put the code<br>
in a new monad/ directory.<br>
<div><br></div></blockquote></div><div>K, can do. In my local code, I have one package per file. And I plan on keeping it that way...  </div><div class="im"><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div>
> (define-interface <monad> (<type>) ()<br>
>   (:singleton)<br>
>   (:generic result (<monad> value))<br>
>   (:generic bind (<monad>  monadic-value monadic-function)))<br>
><br>
</div>I would personally use :generic> to elide the <monad> argument,<br>
here and in all definitions you have where it applies.<br></blockquote><div><br></div></div><div>Makes sense, it simply was not there when I did that :) </div><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div><br>
>   ,@(when (string-equal (symbol-name symbol) "_")<br>
>   `((declare (ignorable ,symbol))))<br>
</div>Shouldn't that be ignore instead?<br>
<br>
> ORG/IPS/MONAD/CONTINUATION><br>
I would put everything in the MONAD package,<br>
or IPS-MONAD if you suspect there might be<br>
any useful non-IPS monad package.<br></blockquote><div><br></div></div><div>can we say INTERFACE/MONAD ? that package name makes sense to me as it relies on INTERFACE package and is a part of the new IPS thingie. </div><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><br>
> So, that is call/cc based on the cont monad, in IPS. w00t.<br>
><br>
</div>Re-w00t!<br>
<div><br>
> any questions/comments/etc are most welcome.<br>
><br>
</div>How do I combine several monads,<br>
say, non-determinism, continuation, error, state monads?<br></blockquote><div><br></div></div><div>strangley enough, this is dealt with by monads themselves .</div><div><br></div><div><div>(interface:define-interface <transformer> (<monad>)</div>


<div>  ((inner-monad :accessor inner </div><div><span style="white-space:pre-wrap">         </span>:initarg :inner </div><div><span style="white-space:pre-wrap">                </span>:initarg inner</div><div>
<span style="white-space:pre-wrap">             </span>:initform <identity>))</div><div>  (:singleton)</div><div>  (:parametric (&optional (inner <identity>))</div><div>     (make-interface :key-interface inner))</div>


<div>  (:generic inner (<transformer>))</div><div>  (:generic lift (<transformer> inner-monadic-value))</div><div>  (:method lift (inner-monadic-value) </div><div><span style="white-space:pre-wrap">        </span>   inner-monadic-value))</div>


<div>  </div><div>(defmethod result ((m <transformer>) value)</div><div>  (lift m (result (inner m) value)))</div><div><br></div><div>(defmethod bind ((m <transformer>) mv mf)</div><div>  (lift m (bind (inner m) mv mf)))</div>


</div><div><br></div><div> and ...</div><div><div><br></div><div>(interface:define-interface <list-transformer></div><div>    (<list> <transformer>)</div><div>  ()</div><div>  (:singleton)</div><div>  (:method* result ((m <list-transformer>) value) </div>


<div><span style="white-space:pre-wrap">  </span>    (call-next-method m</div><div><span style="white-space:pre-wrap">                        </span>      (result (inner m) value))))</div><div><br></div><div>
(defmethod lift ((m <list-transformer>) inner-mv)</div><div>  (list inner-mv))</div><div><br></div><div><br></div><div>(defmethod bind ((m <list-transformer>) mvs mf)</div><div>  (loop :for mv in mvs</div><div>


     :append (bind (inner m) mv mf)))</div></div><div><br></div><div><br></div><div>The double (<list> <transformer>) superclasses is new, but besides that, the <list-transformer> is pretty much copied straight from haskell.</div>


<div><br></div><div>How to combine the monads? that depends on which order you want them in, but <foo-transformer> for every one that needs an 'inner' monad.</div><div><br></div><div>Does that make sense? There is no inheritance to combine the monads, but rather <transformer>s (the code, not the robots in disguise). </div>

<div><br></div><div>So, say, (define-interface <foo> (<state-transformer>) (() (:default-initargs :inner <error>))) or something like that, to combine the state (toplevel) with the error.</div><div><br>
</div>
<div>or, heh ... (eval '(<state-transformer> :inner (<error-transformer> :inner <continuation>)) if we do not need the class define at all etc.</div><div><br></div><div>Can tell more about it if required, and do not mind because it will all be in my docs anyway :)</div>

<div><br></div><div>Cheers, </div><div>drewc</div><div class="im"><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• <a href="http://fare.tunes.org" target="_blank">http://fare.tunes.org</a><br>
</div>Few facts are more revealing than the direction people travel<br>
when they vote with their feet. — Don Boudreaux <a href="http://bit.ly/afZgx2" target="_blank">http://bit.ly/afZgx2</a><br>
</blockquote></div></div><br>
</div><br>