<div dir="ltr"><div>Matthias,</div><div><br></div><div>I'm likely very misguided here and really just learning by hacking around, so bare with me :).</div><div><br></div><div>I'm playing around with the idea of a sort of "Language Integrated Query" like LINQ.  For example:</div>
<div><br></div><div>> (sql (query 'my-table</div><div>     #:where (λ (row) (> (hash-ref row 'id) 3))))</div><div>"select * from my-table where id > 3"</div><div><br></div><div>I can have a static mapping of known procedure translations to sql (such as >, <, not), but I thought if I could unroll procedure source code I could reduce simple definitions to see if they *ultimately* have translations to sql.  For example:</div>
<div><br></div><div>> (define (some-pred? row) (> (hash-ref row 'id) 3))</div><div><div>> (sql (query 'my-table</div><div>     #:where (λ (row) (or (some-pred? row) (> (hash-ref row 'id) 10)))))</div>
</div><div>"select * from my-table where id > 3 or id > 10"</div><div><br></div><div>> (sql (query 'my-table #:where (λ (row) (> (hash-count row) 3))))</div><div>error: hash-count has no translation to sql</div>
<div><br></div><div>If that was so, I could transparently reuse procedures designed for filter/map operations on lists to be reduced down and *potentially* translated to sql.</div><div><br></div><div>I suppose it might be possible to do this with a macro <i>(define-for-sql (some-pred? row) ...)</i> which would provide more power for syntax local expansion and (possibly achieve???) what I'm trying to do.  But that has the disadvantage of not being able to reuse functions that were designed for other purposes yet which fit the required protocol.  It would be nice if the same query form expression(s) could be reused on lists, vectors, xml, database tables, etc.</div>
<div><br></div><div>In another thread, I'd like to poll this list as to the benefits (if any) of such a linq-style approach.  I got inspired by this paper: <a href="http://homepages.inf.ed.ac.uk/slindley/papers/practical-theory-of-linq.pdf">http://homepages.inf.ed.ac.uk/slindley/papers/practical-theory-of-linq.pdf</a> and really enjoyed the c# linq stuff I've played around with.  It may very well be; however, that this is not desired or useful, and rather I should have simple macros that work <i>exclusively</i> on databases and employ a mini-dsl that maps directly to sql strings at expansion, ie:</div>
<div><br></div><div>(query 'my-table #:where (id <> 3 or id > 10))</div><div><br></div><div>As an aside:</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
This might be a MIT misunderstanding about the relationship between Scheme and the lambda calculus. It is certainly not possible in general and I see no pragmatic use case for an approximation. <br></blockquote><div><br></div>
<div>It would be really nice to print the source code of a known procedure on the repl, in order to get a quick view of what it does.  Or, the "pa" function which prints out the arguments of a procedure is even more useful.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Dec 27, 2013 at 4:35 PM, Matthias Felleisen <span dir="ltr"><<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div><br></div><div><br>
</div><div><div class="im"><div>On Dec 27, 2013, at 6:27 PM, Scott Klarenbach wrote:</div><br><blockquote type="cite"><div dir="ltr">I noticed that MIT Scheme has the "pp" procedure which prints the source code of a given function.  Is there an equivalent way to do this in Racket?</div>
</blockquote><div><br></div></div><div>No. The 'pp' idea probably dates back to the age of Lisp-machine repls when MIT programmers thought that you enter functions into the repl and the program is the current state of the repl. Since definitions for large programs scroll off the visible screen, you need pp. </div>
<div class="im"><div><br></div><div><br></div><blockquote type="cite"><div dir="ltr"><div>More generally, I'm looking to normalize nested procedures to their most rudimentary expressions.</div></div></blockquote><div>
<br></div><div><br></div></div><div>This might be a MIT misunderstanding about the relationship between Scheme and the lambda calculus. It is certainly not possible in general and I see no pragmatic use case for an approximation. </div>
<div><br></div><div>-- Matthias</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>
<br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><br><blockquote type="cite">
<div class="im"><div dir="ltr">
<div><br></div><div>For example:</div><div><br></div><div>(define (something? x) (> x 3))</div><div>(define (something-else? x) (< x 10))</div><div>(define (combined x) (and (something? x) (something-else? x)))</div>

<div><br></div><div>(normalize combined) =></div><div>'(lambda (x) (and (> x 3) (< x 10)))</div><div><br></div><div>((normalize combined) 7) => #t</div><div><br></div><div>I'm sure it's not so simple and a robust general solution involves some type of beta reduction and/or argument constraints, but I'm just looking for a nudge in the right direction.</div>

<div><br></div><div>Thanks.</div><div><br></div><div><br></div><div> <br clear="all"><div><br></div>-- <br>Talk to you soon,<br><br>Scott Klarenbach<br><br>PointyHat Software Corp.<br><a href="http://www.pointyhat.ca/" target="_blank">www.pointyhat.ca</a><br>

p <a href="tel:604-568-4280" value="+16045684280" target="_blank">604-568-4280</a><br>e <a href="mailto:scott@pointyhat.ca" target="_blank">scott@pointyhat.ca</a><br><span style="color:rgb(34,34,34);font-size:13px;font-family:arial,sans-serif">200-1575 W. Georgia</span><br>

Vancouver, BC <span style="color:rgb(34,34,34);font-size:13px;font-family:arial,sans-serif">V6G2V3</span><br><br>_______________________________________<br>To iterate is human; to recur, divine
</div></div></div>
____________________<br>  Racket Users list:<br>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br></blockquote></div><br></div></blockquote></div><br><br clear="all">
<div><br></div>-- <br>Talk to you soon,<br><br>Scott Klarenbach<br><br>PointyHat Software Corp.<br><a href="http://www.pointyhat.ca" target="_blank">www.pointyhat.ca</a><br>p 604-568-4280<br>e <a href="mailto:scott@pointyhat.ca" target="_blank">scott@pointyhat.ca</a><br>
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">200-1575 W. Georgia</span><br>Vancouver, BC <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">V6G2V3</span><br>
<br>_______________________________________<br>To iterate is human; to recur, divine
</div></div>