<div dir="ltr"><div><div>Piotr,<br><br></div>This isn&#39;t good Racket code, it&#39;s *gorgeous*.  That was my impression at first glance, and the more I look, the more I like it.  Your Bezier library absolutely does not read like the code of a novice Racketeer.  Few enough people regularly use a combination of objects, pattern matching, map, cut, macros, contracts, named let, multiple values, submodules... let alone using them all in readable and idiomatic fashion.<br>

<br></div><div>There are some minor improvements to be made, certainly -- for instance, you could use define/private instead of define for private methods, it avoids allocating a closure for each object -- but only at the nitpick level, that I can see.  The important thing is that you&#39;ve found a lot of the useful Racket tools, certainly more than are even strictly necessary for good code, and you&#39;ve put them to good use.<br>

<br></div><div>I do hope you get some more in-depth feedback.  I&#39;ll try to find time to give your code a closer read myself.  But as for &quot;beginner&quot; or &quot;passable&quot;, I can say with confidence that you&#39;ve vaulted past those on your first attempt.  I&#39;ve submitted code to the Racket sources myself that I&#39;m less proud 
of than you should be of your library.  (Should I have admitted that?  
Oh, well.  You&#39;ve all been running it anyway.)  Seriously, you can consider yourself a bona fide Racketeer, no disclaimers or qualifications needed.<br><br>Welcome to the club.<br></div><div class="gmail_extra"><br clear="all">

<div>Carl Eastlund</div>
<br><div class="gmail_quote">On Wed, Jan 30, 2013 at 8:20 PM, Piotr Klibert <span dir="ltr">&lt;<a href="mailto:piotr.klibert@10clouds.com" target="_blank">piotr.klibert@10clouds.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div dir="ltr">Hello all.<div><br></div><div>TL;DR: I &quot;want&quot; a code review. Link to the repository at the end.</div><div><br></div><div>This is my first post here so I think it&#39;s appropriate to introduce myself. I&#39;m a professional programmer and I have been programming for nearly twenty years now. At work I use Python and CoffeeScript; before that I used PHP, C++ and C, but I have no formal education in the field, which means that I missed an opportunity to learn about many interesting, but not immediately usable things.</div>



<div><br></div><div>For the last few years I have been trying to compensate for this in my spare time. I have learnt, to various degrees, languages such as OCaml, F#, Smalltalk, Erlang, J and Prolog among other more or less interesting languages, dialects and environments.</div>



<div><br></div><div>Still, until about a year ago I knew nothing about Lisps. I decided to take a look at one of them and by pure chance I chose Racket. I am in love with it ever since.</div><div><br></div>

<div>For the last year I was scribbling Racket code from time to time and reading a lot about it: from docs to blog posts to source code. Everything I wrote was short and incomplete, I was essentially playing with newly discovered features without trying to build anything in particular.</div>



<div><br></div><div>It took me so long, because Racket is vast and because I was concurrently playing with Erlang and Smalltalk. I still don&#39;t know much about Racket and I consider myself a beginner, but I decided that it&#39;s time to actually do something instead of just playing.</div>



<div><br></div><div>Two weeks ago at work I was asked to prototype a JS app that would display on &lt;canvas&gt; and would allow a user to type some text and then bend it freely along the curve.</div><div>

<br></div><div>I needed to figure a bit of math for this. HTML canvas API is rather low level one and essentially everything in the app would have to be computed by hand. I chose to play with math in Racket, using its GUI capabilities and I planned to switch to JS once the equations and basic algorithms were established. Which I did, the project started and the app is being developed right now (I&#39;m not involved anymore).</div>



<div><br></div><div>All this left me with about 200 lines of Racket code - the greatest amount I&#39;ve written to date. I thought that this is the chance I was waiting for - all I had to do was to refactor the spaghetti into modules, add some event handlers and I would end up with a working Racket app.</div>



<div><br></div><div>For a few days more I was cleaning up the code and optimizing it, trying to transform it into something I wouldn&#39;t be embarrassed of. I still didn&#39;t write a proper contracts nor docs, but I somehow succeeded - I have a little app that works and looks ok to my eyes.</div>



<div><br></div><div>And that&#39;s the problem.</div><div><br></div><div>I know very well that I&#39;m a beginner and I know that there are vast parts of Racket that I don&#39;t know of. I would like to ask anyone who has a few  moments of free time to review what I wrote and tell me if it is a &quot;good&quot; - ok, passable - Racket code; what should I do to make it better, what mistakes I made and - maybe - what I managed to get right. I&#39;m especially concerned with the style of the code and it&#39;s structure, but any comment is fine.</div>



<div><br></div><div>The code lives here: <a href="http://bazaar.launchpad.net/~klibertp/+junk/bezier/files" target="_blank">http://bazaar.launchpad.net/~klibertp/+junk/bezier/files</a> </div><div><br></div><div>I will really appreciate any feedback from anyone. Thanks in advance!</div>



<div><br></div><div><div><div dir="ltr">Best regards,<div>Piotr Klibert</div></div></div>
</div></div>
<br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div></div>