(defprofile lagénorhynque
:id @lagenorhynque

新たなプログラミング言語に入門したら、早く実用的なアプリケーションを作ってみたくなるものです(ちなみに私 lagénorhynque🐬 は最近、Elixirに入門しました)。
コミュニティの発展とともにClojureの応用領域もますます拡大していますが、定番は何よりWeb開発ということで本記事では素早く最小構成的にREST APIを開発する方法を紹介します。
DuctやLuminusなどWebアプリ開発をスムーズにするための(マイクロ)フレームワークが有名なものだけでもいくつか存在しますが、今回はHTTPサーバ抽象と基本的なユーティリティを提供するRingとルーティング機能を提供するbidiによるミニマルな実装を考えます。
サンプルコードはPythonライブラリFlask-RESTfulのドキュメントQuickstartの例を参考にし、敢えて名前空間を分割せず1ファイルにまとめる構成にしています。
- Leiningen版: [minimal-api-lein](https://github.com/lagenorhynque/clojure-rest-api-quickstart/tree/maste
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
user> (defn counter [init] | |
(let [c (atom init)] | |
#(swap! c + %))) | |
#'user/counter | |
user> (def c1 (counter 0)) | |
#'user/c1 | |
user> (def c2 (counter 0)) | |
#'user/c2 | |
user> (c1 2) | |
2 |
(defprofile lagénorhynque
:id @lagenorhynque
:reading "/laʒenɔʁɛ̃k/"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns lousy-calculator | |
(:require [clojure.spec.alpha :as s])) | |
(s/def ::number-with-remark (s/tuple number? string?)) | |
(s/fdef add | |
:args (s/cat :x number? | |
:y number?) | |
:ret ::number-with-remark) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns generic-size) | |
(defprotocol Size | |
(size' [data] "Calculates the size (and not the length!) of a data structure")) | |
(extend-protocol Size | |
String | |
(size' [s] (count s)) | |
clojure.lang.IPersistentMap | |
(size' [m] (count m)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns worker) | |
(defn random [] | |
(inc (rand-int 100))) | |
(defn sleep [n] | |
(println (str "sleep(" n ") started.")) | |
(Thread/sleep n) | |
(println (str "sleep(" n ") ended.")) | |
(str "result-sleep(" n ")")) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<configuration scan="true" scanPeriod="1 seconds"> | |
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |
<encoder> | |
<pattern>%d{yyyyMMdd HH:mm:ss} %-5level %logger - %msg%n</pattern> | |
</encoder> | |
</appender> | |
<root level="DEBUG"> | |
<appender-ref ref="STDOUT"/> | |
</root> |
(defprofile lagénorhynque
:id @lagenorhynque
:reading "/laʒenɔʁɛ̃k/"