A few years ago, I made a simple web app in Flask to deal with some text processing problems from my daily work. It has two main features:
- Feature #1: generating
compile_commands.json for GNU Makefile projects written in C/C++ using the output of the make command. Because, unlike CMake, the make command can't generate it.
- Feature #2: extract text using Python regex. It's handy when I feel like sed/awk/grep's line-oriented processing isn't enough for the task at hand.
BTW, I'm improving my English by watching YouTube videos every single day; If you're also learning English, or any languages, LanguagePuppy can definitely help you. It's a Chrome extension I developed using Clojure. Check it out:
[Read More]
Constructing Clojure Maps Conditionally
Posted on 2025-01-05
(Last modified on 2025-02-20)
| 1 minutes
| 190 words
I was wondering how to construct a multi-key map conditionally while I was coding in Clojure. Ideally, I would like to build it "in one pass" like {:bar 2 (when true :baz 3)}, but from what I had collected from Blue Sky, it seemed that's impossible, or it's just not an idiomatic way to program like that in Clojure. (Or, is this just a side effect of writing too much imperative code?)
[Read More]
Getting Started with Cider for Clojure Programming
Posted on 2024-12-22
| 2 minutes
| 303 words
Here is the outline for my cider tutorial on YouTube, covering basic things you need to know to get started with cider, and starting exploring the fun of clojure programming with the REPL-driven programming approach.
Jack In to a REPL
-
C-c M-j (cider-jack-in-clj)
- start a nREPL and jack in.
It works in a project or with a sole .clj file.
-
M-x cider-connect-clj
- run the command and then fill in hostname and port.
It could be useful in some cases. e.g. on Windows, I can start the nREPL manually and then connect to it separately.
Evaluate Things
-
C-M-x (cider-eval-defun-at-point)
- evaluate current top-level form.
-
C-x C-e (cider-eval-last-sexp)
- evaluate the preceding form.
-
C-c C-k (cider-load-buffer)
- evaluate/load the current buffer.
-
C-c C-p (cider-pprint-eval-last-sexp)
- Pprint the result in a dedicated buffer.
Great thing to do when the result is too large to fit in the echo area.
Note: I prefer to use the same key bindings as for Elisp, given that
cider might bind a few keys to a single command!
[Read More]
A Few Quick Notes About babashka/fs
Posted on 2024-12-07
(Last modified on 2024-12-19)
| 1 minutes
| 149 words
Recently I've used babashka/fs a little bit, here are some quick notes for it:
- Path vs File.
Use Path whenever possible, according to this SO answer to "Java: Path vs File".
This is actually Java related.
- It's ok to use a
path as a key for a clojure map.
At my first try, I somehow came to the conclusion that it's not ok, while I was refactoring the live reload for clay. And later I found that it's totally fine to use it as a key. 😞
- Use fs/path to construct file/directory paths, for example,
(fs/path "/tmp" "foo" "bar" "baz.clj") will result in a path object for /tmp/foo/bar/baz.clj on linux.
If you're coming from Python, it might remind you of os.path.join(path, *paths).
- Use
fs/createdirs for mkdir -p, though its name is a bit misleading, I first thought it's for creating a few dirs.
fs/with-temp-dir is convenient for creating tests.