Functional programming without feeling stupid, part 5: Project
In the last four installments of [Functional programming without feeling stupid] I’ve slowly built up a small utility called
ucdump with [Clojure]. Experimentiing and developing with the Clojure REPL is fun, but now it’s time to give some structure to the utility. I’ll package it up as a [Leiningen] project and create a standalone JAR for executing with the Java runtime.
Creating a new project with Leiningen
You can use Leiningen to create a skeleton project quickly. In my project’s root directory, I’ll say:
Leiningen will respond with:
The result is a directory called ucdump, which contains:
For now I’m are most interested in the project file,
project.clj, which is actually a Clojure source file, and the
src directory, which is intended for the app’s actual source files.
Leiningen creates a directory called
src/ucdump and seeds it with a
core.clj file, but that’s not what actually what I want, for two reasons:
ucdumpto be a good Clojure citizen, so I’m going to put it in a namespace
My [Git repository for
ucdump] also contains the original Python version of the application, which is in <_project-root_>/python, and I want the Clojure version to live in
Functional programming without feeling stupid, part 4: Logic
In the previous parts of “Functional programming without feeling stupid” we have slowly been building ucdump, a utility program for listing the Unicode codepoints and character names of characters in a string. In actual use, the string will be read from a UTF-8 encoded text file.
We don’t know yet how to read a text file in Clojure (well, you may know, but I only have a foggy idea), so we have been working with a single string. This is what we have so far:
But we are still missing the actual offsets. Let’s fix that now.
Functional programming without feeling stupid, part 3: Higher-order functions
Welcome to the third installment of “Functional programming without feeling stupid”! I originally started to describe my own learnings about FP in general, and [Clojure] in particular, and soon found myself writing a kind of Clojure tutorial or introduction. It may not be as comprehensive as others out there, and I still don’t think of it as a tutorial — it’s more like a description of a process, and the documented evolution of a tool.
I wanted to use Clojure [“in anger”], and found out that I was learning new and interesting stuff quickly. I wanted to share what I’ve learned in the hope that others may find it useful.
Some of the stuff I have done and described here might not be the most optimal, but I see nothing obviously wrong with my approach. Maybe you do; if that is the case, tell me about it in the comments, or contact me otherwise. But please be nice and constructive, because…
…in [Part 0] I wrote about how some people may feel put off by the air of “smarter than thou” that sometimes floats around functional programming. I’m hoping to present the subject in a friendly way, because much of the techniques are not obvious to someone (like me) conditioned with a couple of decades of imperative, object-oriented programming. Not nearly as funny as [Learn You a Haskell For Great Good], and not as zany as [Clojure for the Brave and True] — just friendly, and hopefully lucid.
![xkcd 1270: Functional]
xkcd 1270: Functional. Licensed under Creative Commons Attribution-Non-Commercial License. This is a company blog, so it is kind of commercial by definition. Is that a problem?
In [Part 1] we played around with the Clojure REPL, and in [Part 2] we started making definitions and actually got some useful results. In this third part we’re going to take a look at Clojure functions and how to use them, and create our own — because that’s what functional programming is all about.
Functional programming without feeling stupid, part 2: Definitions
In this installment of “Functional programming without feeling stupid” I would like to show you how to define things in Clojure. Values and function applications are all well and good, but if we can’t give them symbolic names, we need to keep repeating them over and over.
Before we start naming things, let’s have a look at how Clojure integrates with Java. I’m assuming you are still in the REPL, or have started it again with
Track 1: “If anyone should ask / We are mated”
As it happens, Clojure’s core library is lean and focused on manipulating the data structures of the language, so many things are deferred to the underlying Java machinery as a rule. For example, mathematical computation is typically done using the static methods in the
As you can see, this is a function application like we have already seen in Part 1, but this time the function we are using is the
sqrt static method in the
Java 7 acquired Unicode character names, and they are accessed through
getName method in the
java.lang.Character class. This is no mean feat, since there are over 110,000 characters in the Unicode standard, and each of them has a name (although some of them are algorithmically generated). To find out the canonical character name of a Unicode character, such as the euro currency symbol, you would use the
getName static method:
Hey, what’s wrong? Well, if you look up the documentation of
java.lang.Character.getName, you will find out that it takes an
int value as an argument, not a character. You can actually do this check from inside the REPL:
The REPL doesn’t seem to do much, but you should now have a new web browser window or tab open, with the JavaDoc of the java.lang.Character class loaded up. That’s what the REPL meant when it said
when it started up. The
getName method does need an
int value, so let’s try something else:
All right! How about another one:
Well, some say that Clojure is the new C.