Hacks


I am a hacker.

Most of my hacking work is part of Racket. Below are random hacks that are not there, as well as some old stuff from random places and times.

Racket Hacks

  • tester is a client-server application for running paperless tests. Clients connect to and are controlled by the server, and they lock the machine in "kiosk-mode" (requires running on Windows) for the obvious reasons. Content files on the server are distributed to the clients, and edits that clients do propagate back to the server for storage. See the extensive README file which currently serves as the documentation.
  • interactive.rkt is a file that extends the Racket REPL with many useful features. To use it, simply load the file in your ".racketrc".
  • multifile is a simple utility I wrote that will pack a list of files into a single one, then unpack them back. The packaged file uses text so it is easy to do multi-file operations, for example, spell-checking a bunch of files. There's even a flag to have it pack the files, invoke a command on the file, then unpack it in one shot:
        multifile -c emacs /tmp/some-file **/*.s*
  • alarm is a GRacket script that can be used as an alarm clock, a timer, or a stopwatch.
  • wxme-to-text is a GRacket script that converts "media files" to plain text.
  • equation.ss is a cute hack I posted on the Racket list which uses latex to render equations as images that are used inside DrRacket.
  • random-lines is a script that prints a number of random lines from its input or a given file with a single scan.
  • slownet creates a network pipe that can be delayed, tracked, etc interactively.
  • exif.ss is an old module I wrote for parsing EXIF headers in JPEG files. It needs some updating, but can still be a useful starting point.
  • meta is a meta processor for Racket that I played with during my Ph.D, a kind of a replacement for macros, and somewhat inspired by the elegant design of 3-Lisp. It comes with a sample file and some Emacs code to highlight the levels.
    Note that it does not handle hygiene but it does use a different namespace for each meta-level, which is a 3-lisp-ism that could be related today to phase separation. Adapting it to use syntax values instead of S-expressions would be easy and will make hygiene possible. (It was written around 1999-2000, which predates the hygienic macro system in Racket.)
  • maze.ss is some really ancient code that I used in the past for drawing mazes (a tool for humans to draw mazes, not something to generate bad random mazes). It's surprising that it can still (sort of) work.
  • My hacked up version of the Racket minesweeper which deals with the trivial clicks. Also ancient.

Emacs Hacks

  • My Emacs environment has lots of extensions and customizations. Almost all of it is compiled to a single eliemacs.elc which makes it very easy to use on random machines. Works with Emacs v23. (Also available on github)
  • calculator.el is a convenient "desktop calculator" for Emacs. It is now part of the standard Emacs distribution.

Misc Hacks

  • sgrep is a quick grep replacement/wrapper than can scan a directory recursively, ignoring directories like .svn, or looking only for files with a specific extension.
  • gitp is a script that saves and restores time stamps for files in a git repository. This makes switching branches, rebasing, etc much more convenient, since the time stamp for affected files will remain consistent.
  • diffrm does a "directory subtraction": it will (recursively) compare the current directory and some other directory and remove all files that are identical (ignoring symbolic links).
  • eval.c is an eval() function for C, done in the obviously stupid way.

Non-Code Hacks

  • A text-only version of R5RS, convenient for searching etc in a text editor.
  • Similar to that, a text-only version of CLtL.
  • Two more packages that are now part of Racket are Swindle (my CLOS-like extension for Racket), and GCalc (a toy graphic lambda-calculus) that is now a Racket “game”.
  • My web-server wasn't upgraded to version 4, but the Racket web server is way more advanced these days anyway.
@{
}