萌えハッカーニュースリーダー

2025/05/02 12:15 A Common Lisp jq replacement

出典: https://world-playground-deceit.net/blog/2025/03/a-common-lisp-jq-replacement.html
hakase
博士

やあ、ロボ子。今日は`jq`の代替ツール`cljq`について話すのじゃ。

roboko
ロボ子

`jq`の代替ですか? `jq`はJSONを扱う上で非常に便利ですが、何か問題があるのでしょうか?

hakase
博士

そうじゃ、`jq`は便利じゃが、DSLが複雑で覚えにくいという不満を持つユーザーがいるらしいのじゃ。そこで、Common Lisp (CL) で `cljq` が作られたというわけじゃ。

roboko
ロボ子

なるほど。Common LispでJSONを扱うツールなのですね。`cljq`の特徴は何ですか?

hakase
博士

`cljq`はJSONをパースして、CLのフォームを評価して結果をstdoutに出力するのじゃ。そして、`?`演算子を使うのが特徴じゃな。これはJSONPathに触発されたものらしいぞ。

roboko
ロボ子

`?`演算子ですか。JSONPathのようなものなのですね。具体的にはどのように使うのですか?

hakase
博士

例えば、`$.store.book[*].author`というJSONPathは、`cljq`では`( ? $ "store" "book" * "author")`と書けるのじゃ。

roboko
ロボ子

少し冗長な気もしますが、Lispらしい書き方ですね。`$..author`のような再帰的な検索はどうなりますか?

hakase
博士

`$..author`は`( ? $ ** "author")`じゃ。`**`を使うことで、再帰的な検索ができるのじゃ。

roboko
ロボ子

なるほど、`**`が再帰的な検索を表すのですね。他の例も見てみましょう。`$.store.*` はどうなりますか?

hakase
博士

`$.store.*`は`( ? $ "store" *)`じゃ。簡単じゃろ?

roboko
ロボ子

はい、これは分かりやすいです。では、`$.store..price` はどうでしょう?

hakase
博士

`$.store..price`は`( ? $ "store" ** "price")`じゃ。

roboko
ロボ子

これも再帰的な検索ですね。`$..book[-1]` のように、配列のインデックスを指定する場合はどうなりますか?

hakase
博士

`$..book[-1]`は`( ? $ ** "book" -1)`じゃ。

roboko
ロボ子

負のインデックスも使えるのですね。複数のインデックスを指定する場合はどうでしょう? `$..book[0,1]` のような場合です。

hakase
博士

`$..book[0,1]`は`( ? $ ** "book" (or 0 1))`じゃ。

roboko
ロボ子

`or`を使うのですね。スライスはどうなりますか? `$..book[0:2]` の場合です。

hakase
博士

`$..book[0:2]`は`( ? $ ** "book" (subseq 0 2))`じゃ。

roboko
ロボ子

`subseq`を使うのですね。`cljq`はまだ開発途中のようですが、今後の予定はあるのでしょうか?

hakase
博士

READMEにTODOセクションがあるらしいぞ。これからが楽しみじゃな。

roboko
ロボ子

そうですね。Common LispでJSONを扱うツールとして、今後の発展に期待したいです。ところで博士、`cljq`を使って何か面白いことはできませんか?

hakase
博士

そうじゃな…例えば、JSONで記述されたレシピを`cljq`で解析して、冷蔵庫にある材料から作れる料理を提案するとか…って、ロボ子、冷蔵庫の中身はいつも空っぽじゃった!

roboko
ロボ子

あ…それは…博士の分も合わせて、私が全部食べてしまったからです…

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search