There aren’t too many examples of Clojure’s instaparse use out there, so if you’re working on parsing a little language of your own, I hope this might come in handy.
I’ve been working on a little interpreter for some internal stuff part of the Front Row stack, mainly for validating student answers in the more complex middle school math domains. The interpreting the answer becomes pretty much mandatory for validating things like equivalence of two polynomials. This is what came out from the early efforts.
The EBNF grammar itself can be found here, the implementation of the parser is here (still blows my mind it’s under 50 lines), and the tests are all here. Wouldn’t have touched this with a ten foot pole without testing every single incremental addition.
A couple of resources I found useful, in addition to instaparse’s official docs:
The author of instaparse himself was also generous with a few tips on the library’s Google Groups.
Another great little guide on understanding differences between traditional Regular Expression engines. Greg’s wiki is generally considered a real goldmine.
List of great Clojure libraries for reference
By Mr. bitemyapp's recommendation, the following libraries are a great way to advance one's Clojure style chops. Dumping the list here for my own reference.
Got my homework cut out for me :)
Correct Content-Type of static assets in Ring apps
If you’re thinking of serving assets from a Clojure Ring app, then you should be aware of an interesting quirk of one of the core pieces of Ring middleware: wrap-file-info. This middleware is used to automatically detect the file type based on extension and inject the corresponding Content-Type header into the HTTP response.
Now, when developing with it enabled, you might run into an interesting and somewhat hard situation to debug. In development mode the files will be served with the correct MIME type. In production, when the app is packaged together into a single uberjar, IF your resources were being served from within the resources/ folder, then wrap-file-info will fail to correctly identify the file type.
Why? In development ring will be working with real files on disk, in a .jar situation you simply don’t get file extensions. See the following thread where Weavejester clarifies the situation.
Solution? Use wrap-content-type middleware instead. It only cares about the extension specified in the URL and should work correctly in most of the basic cases. I imagine you could have Ring fetch resources outside of the .jar itself, in which case the problem above would not reproduce. I believe you could get the best of both worlds by moving your assets outside of the uberjar and by using wrap-content-type regardless.
As a sidenote, cURL seems to infer MIME type based off of the URL, a behavior that’s inconsistent with the current versions of Firefox and Chrome. If you try to debug the issue above with cURL, you will be deeply puzzled. cURL will consistently correctly guess the MIME type, while the browser pointing at the file will print out a console message saying it’s getting a resource with text/plain, instead a different Content-Type value. The browser still correctly tries to use the resource, as they’re wrapped in a <script> or <link> tag with a specified content type. What makes this a tad extra frustrating is that Firefox allows you to generate cURL requests from the debug panel, and the requests are actually inconsistent with the browser that output that command.
If someone knows how to turn off Content-Type inference in cURL, do let me know :)
Apparently I’m not the only one who experiences those feelings towards ObjC block syntax.
[git] How many lines have I written today?
Neat one-liner that might be interesting to folks. Say you’ve been working in a separate branch for a few hours and you want to know how many new lines of code you cranked out. There you go:
$ git diff parent-branch...topic-branch | grep '^+' | wc -l 390
Pretty neat given how small the command is.
Front Row Classroom has been out for less than a week and already the visionaries at FCPS are experiencing the power of adaptive math practice and teacher analytics to improve teacher effectiveness and quality of education.
Very satisfying to see the hard work paying off when students across the country have a much better time with math.
Back to work now!
Sitting on UW campus watching UW CS lectures… That was not premeditated in any way. Life is random.
Can’t recommend this course highly enough if you’re a web dev of are doing work beyond one device.
It’s a very bittersweet course, as I continuously run into concepts that make me go:”I really should already know this like the back of my hand”, but oh well, it’s never too late.
David Wetherall is a very pleasant instructor and does a superb job.
I have to say I have a much better understanding of networking internals now and this is a good ramp for diving into meatier material such as http://www.amazon.com/TCP-Illustrated-Volume-Addison-Wesley-Professional/dp/0321336313