(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Clojure

Clojure ワークショップやります

japanclojurians.doorkeeper.jp参加者募集中ですよ。

Clojure Focus で Reader Conditionals について発表してきた

目次に「まとめ」って書いてるのに「まとめ」のページ作ってなかったのが今日のハイライト。 だいたい参考にしたのは仕様とか設計とかのページ。ここ以外のブログ記事とかみても結局同じこと書いてあるので略。 Reader Conditionals - Clojure Design - Cloj…

assoc と update どっち使う?

Clojure 1.7 から導入された update 関数。 update-in はあるけど、むしろ今までなんで update がなかったんだろうと思ったりする今日このごろです。まぁともあれどういうものかというと普通にドキュメント引けば分かりますが、 update-in で指定するキーワ…

マクロ書いて、これ IFn にキャスト出来ないんだけどってエラーになったとき

たまに馬鹿やります。あやぴーです。 (defmacro foo [] (map inc (range 10))) (foo) ;; java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn こんな感じで上のようなマクロを定義するとエラー吐くけど、よく考えたら当たり前…

どうやってベクターのネストを削除したらいい?

How to remove nested clojure vectorstackoverflow.com久しぶりにこういうの書く*1。さて、質問ですが ([[AA ww me bl qw 100] [AA ee rr aa aa 100] [AA qq rr aa aa 90]] [[CC ww me bl qw 100] [CC ee rr aa aa 67]]) このようなデータ構造を持っている…

Boot を Leiningen プロジェクトの中で使う

一緒にお仕事している Clojure デキルマンに Boot を闇ツール扱いされる今日この頃です。日本ではあまり使っている人が多くない*1 Boot ですが、あやぴー的にはかなり気に入っています。ちなみに先日バージョン 2.0.0 がリリースされています。まぁ、 Boot いい…

Clojure を始めたいけど、周りに Clojure 使ってる人いないし聞ける人いないからなーと思っている人たちへ

「 Clojure が素晴らしい言語であるのはなんとなくわかった。興味はあるんだけど、何処に実際に使っている人たちいるの?」とか「ちょっと分からないところがあるから聞いてみたいんだけど、 QA サイトに投稿するほどじゃないんだよなー」という人たちが一定…

Clojure の開発環境をよりシンプルへ ~ inf-clojure 実践的な設定編?

一ヶ月くらい前に inf-clojure 導入記事を書いたのに、それ以来何も触れてなかったのでそろそろまた書いてみる。Clojure の開発環境をよりシンプルへ ~ inf-clojure 導入編 - (define -ayalog '())一ヶ月くらい前に書いたってことはつまりあれから一ヶ月くら…

第 3 回かわいい Kotlin 勉強会で LT してきたよ #jkug

だいたい Kotlin の話してきました(嘘です、ごめんなさい)。Twitter の TL 見ていると「殴り込み」とか「天下一 JVM 武闘会」とか言われてました。まじすまんかった。第3回かわいいKotlin勉強会 #jkugtogetter.com 話した内容とか タイトルはハッカーと画家…

Clojure の開発で gtags を使う

えっと Emacs/Cider ユーザーにはあまり関係ないですね。あと他のエディタや IDE で定義ジャンプ出来る人はいらないと思う。僕はこの前から inf-clojure を使っているので、これが欲しかった。あと例えば他のエディタや IDE で defxxxx なマクロを使っている…

Clojure で依存関係の解決に潜むワナ?

お仕事中に盛大にハマって、最終的に一緒にやってる Clojure チョットデキルマンに助けてもらった。Clojure のライブラリを Leiningen や Boot に含める場合、次のような表記を用いる。 [group-id/name version] Leiningen や Boot はこれを group-id/name でひとつ…

あるディレクトリ以下のファイルを全てフォーマットし直したい

僕は普段 Emacs を使っている。しかし、最近 Cursive*1 を使うこともある。 それで何が困るかというと Cursive はちょっとイケてないので、ちゃんと Clojure(Script)? をフォーマットすることができない*2。 Clojure のスタイルガイドだと例えば with-* マク…

#渋谷Java 第十一回で Clojure 用の IDEA プラグインである Cursive の紹介してきた。

第十一回 #渋谷java (2015/05/30 14:00〜)何をとち狂ったのかセッション枠という 20 分話せる枠をもらってしまったので話してきた。元々は Clojure 入門みたいな話をしようと思ったんだけど、やっぱり入門以前にエディタとか IDE で「自分たちが普段使ってい…

ClojureScript の中で JSON を Clojure のデータ形式にするときにマップのキーをキーワードにする

メモ。JSON オブジェクトを受け取って js->clj に突っ込むだけだと、 JSON のキーがそのまま文字列で来るので :keywordize-keys オプションをつけてあげる必要がある。 (ns example.core (:import [goog.net XhrIo])) (defn callback [reply] (let [v (js->c…

Boot の sift タスクであるディレクトリ以下のファイルを全て移動させる。

どうやるのかなーって思ったけど、簡単だった。 (sift :move {#"css/(.*)" "assets/$1"}) 後方参照ですね。 参考 Improve sift :move when dealing with multiple files · Issue #144 · boot-clj/boot

(Boolean. false) の Clojure での扱い

(Boolean. false) in ClojureLisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot にあるように Clojure の中で false として扱われるのは nil と false それ自身だけ。驚くことに全くもってその通りで、 (Boolean. false) は false じゃないん…

あなたの Slack にも Clojure bot どうですか?

こんな感じです。 Clojure bot を導入してみる 使うのはこれです。verma/clj-slackbot便利なことに README に Deploy to Heroku というボタンがあるので押してしまって Heroku のデプロイ画面に行きましょう。 (ログインしてなければログイン画面が出るので…

(println (iterate inc 0)) は何故出力されるのか

(println (iterate inc 0)): why does this even start printing?質問者の (println (iterate inc 0)) を実行したときの期待値は、何も表示されることなく延々とスタックを貯め続けることだったみたいですが、そうではなくてこのコードは次のように延々と出…

リロードしたくないファイルをリロードできないようにする

だいたいこういうのをファイルの頭に書けばよいです。 (require '[clojure.tools.namespace.repl :as ns-tools]) (ns-tools/disable-reload!) ついでに言うと、ネームスペースをリロードしただけでも死ぬことがあるので ns フォームの中で require しないで…

Boot で Leiningen のような Checkout dependencies を実現する

これは Leiningen 同様 Boot のデフォルトタスクで実現出来るのですが、ちょこっと手間があるので解説。 Leiningen の Checkout Dependencies については前に触れたのでそちらを参照ください。Clojure における幾つかの実践的なデバッグ方法 - (define -ayal…

Boot の REPL 上では Clojure の compile 関数は動かない

タイトルまま。 例えばこういう build.boot を書いているとする。 ;; build.boot (set-env! :resource-paths #{"src"} :dependencies '[[org.clojure/clojure "1.6.0"]]) さらにこういうファイルを書いているとする。 ;; bar.clj (ns foo.bar) (gen-class :n…

Boot で alembic てきな依存関係の動的解消(?)ぽいことをやる

最近 Boot を本格運用し始めて色々と質問されて調べたりする機会が出来たのでちょこちょこノウハウというか Tips 的な何かを書いていきたい。 alembic とは pallet/alembicgithub.comまぁ Clojure やってる人なら使っている人も多いと思いますが、実行中の R…

defn- のような def- を定義したけど、 private にならないという話

ML で読んでほえーと思った。Why (defn- ...) but (def ^:private? ...)元の質問者は def フォームは ^:dynamic? になるの?って聞いてますが、何故かというと彼の書いたマクロ def- が綺麗に動かなかったからです。 こういう感じ。 (defmacro def- "Why (def…

Clojure のこの関数だけ読み込みたくない!!

最近 Clojure で書かれたコード読みまくってるんですけど、まぁ知らないテクニックとか色々あるわけでして。そんな中で知ったひとつのテクニックがこれ。例えば、 Clojure そのものの compile 関数は使いたくないけど、このネームスペースに compile 関数と…

1 ヶ月間 Clojure を書き続けて感じたこと

まえがき 日本で Clojure を使い始めた 1 人の Clojure プログラマとして、この 1 ヶ月で感じたこととか Clojure をとりまく環境とか書いておきたいなと思う。 日本では流行ってない? 2010 ~ 2011 年頃、空前の Clojure ブームがあったらしい。原因は「 Prog…

Boot を使いはじめる(インストールから基本的な使い方まで)

一個前の記事で言及している Boot についてです。 boot-clj/bootgithub.comああ、ロゴが可愛いですね。本当に。さて、さくさくっと 1 週間くらい触ってきて知見もそこそこにたまってきたので公開します。 目次 思いの外チュートリアルが長くなったので… イン…

Clojure の Boot というビルドツールについて

めちゃくちゃ可愛いロゴが気になる Clojure のビルドツール Boot について色々と調べたので書き残しておく。だらだら書いてたら長くなってしまったので Boot のインストール記事を分けた -> Boot を使いはじめる(インストールから基本的な使い方まで) - (def…

gen-class を使ったときにどうやってインスタンスを取得したらいい?

How do I get the instance of the class when using gen-class毎日 StackOverflow は見てるんですが、まさか @tnoda_ さんが回答者として出てくるとは思わなかった。gen-class 使って出来るクラスのインスタンスメソッドの中で "this" にアクセスしたいんだ…

Clojure の開発環境をよりシンプルへ ~ inf-clojure 導入編

最近、自宅の ThinkPad X220 で Cider-mode を起動すると segfault が起こるようになった。一度起こるとマシンを再起動するまで JVM が起動できなくなってしまう*1。まぁそういうきっかけがありつつ、開発しているときに Cider を起動するだけで 30 秒程待つ…

どうやって数字を分割する?

How to split a number in Clojure?質問者 Geem7n は効率的でない書き方なら出来るんだけど、効率の良い数字を分割する方法を知りたいとのこと。 (->> (str 942) seq (map str) (map read-string)) ;=> (9 4 2) ;; and (defn digits [n] ;YUK!! (cons (str (…

関数リストを適用する方法

Apply a list of function to parameter, clojurestackoverflow.com以下のように関数のリストを作って map で適用しようとすると 5 のリストが返ってきてしまう。 (def ops '(+ - * /)) (map #(% 2 5) ops) ;=> (5 5 5 5) なんで関数呼び出ししてるはずなの…

lein new <template> your-app-name の template に指定出来る template の一覧を作った

Clojure を始めてからいくつかの GitHub リポジトリをみていると「 lein-template あるから lein new foobar your-app-name ってすればいいよ」みたいなのを稀によく見かける。けど、 leiningen がデフォルトで提供しているテンプレートの数ってそんなに多く…

暗黙の引数 &form を使って既に束縛がある場合には何もしない defn を定義してみる。

昨日まで読んでいた Mastering Clojure Macros の中で &env と &form に触れているところがあった。まぁ正直何に使ったらいいのか分からなかったし、 &env と &form を参照できたとして「で?」である。これらが何の為にあるのか、というのはどうもこの辺を読…

Mastering Clojure Macros を読んだ

読んだ。On Lisp と LET OVER LAMBDA 読んでたら必要ないかなーとは思うけど、実際の Clojure の著名ライブラリとかで使われているテクニックを本に沿って知ることができるのでそういう意味では良い本かと思います。僕の場合 On Lisp, LOL の内容をあんまり…

"~" の代わりに何を使えばホームパスを指せる?

How to substitute path to home for "~"?stackoverflow.comSystem/getproperty でユーザーホームを取得して ~ を置換するようなマクロ書けばいいよ、とのこと。(後で少しこの記事は綺麗にすると思う)

Clojure の REPL を綺麗にする Ultra

venantius/ultragithub.com実際綺麗になるんですけど、 Emacs の上でしか REPL 起動しないので意味なかった…。

どのようにすればプログラムでレコードを定義できる?

How can I programmatically generate record definitions?stackoverflow.comこれ、答えはすっと出て朝から回答しようと思ったけど、電車に乗ってる間に先を越されてしょぼんしています。 ただ、僕よりずっといい答えが書かれているのでさくっと書いてみます…

Clojure における幾つかの実践的なデバッグ方法

まえがき だいたい 2 週間くらい Clojure を書いているとライブラリのバグを綺麗に踏み抜いたりマクロの沼に引きずりこまれたりと、まぁやたらとデバッグする機会があります。それで先日からライブラリを clone して書きなおして lein install して…などして…

どうやって lazy なエラトステネスの篩を実装したらいいの?

How to make this sieve function lazy?先日僕も似たような実装しようとしてハマったのを思い出しました。 回答には「本物のエラトステネスの篩 *1」という論文があるので参考にするといいと書いてあります。 また、それについての綺麗な実装もあるので参照…

Clojure で循環参照するような関数定義

Circular definition in Clojure (defn f1 [] (lazy-seq (cons 0 (f2)))) (defn f2 [] (lazy-seq (cons 1 (f3)))) (defn f3 [] (lazy-seq (cons 2 (f1)))) こうすると f1 の評価タイミングで f2 が存在しないのでコンパイラがエラーを吐くんだけどどうしたら…

Clojure 自身のビルドの仕方、そしてそれ自身を使う方法。

ちょっとコード追いかけながら Clojure の実装がイケてないのかなーって思って Clojure の実装そのものを調べたりしたいことってありますよね。 そういうときのために Clojure それそのものをビルドして使う方法です。 Clojure 自身のビルドの仕方 git clone…

Leiningen で自動生成されるライセンスを更新するプラグイン

xsc/lein-licenseちょっと便利。profiles.clj に [lein-license "0.1.2"]を :plugins のとこに追加するだけ。プロジェクトの下で lein license update mit とかすれば自動的にライセンス部分で必要な部分を全部書き換えてくれる。欲を言えば profiles.clj の…

1,000,000 回 assoc! を transient な map に行ったけど、 8 個しか値が入っていないのは何故?

Why inserting 1000 000 values in a transient map in Clojure yields a map with 8 items in it?興味深かった。ベクターに対して同様のことを行った場合は期待通りに動くけど、マップに対してだと動かないという例。 (count (let [m (transient [])] (doti…

Clojure 使いの為の便利なドキュメント集

mbuczko/awesome-clojureだいたいこの辺を読むといいよ!とのこと。 もし何か欠けていたら PR から誰でも追加出来るようです。

Clojure で分割した行の全ての空行を保持したいんだけど…

Clojure split lines with all empty lines kept文字列中の最後の空行を Clojure だとどうやって残したらいいの?という質問。 user=> (require 'clojure.string) nil user=> (clojure.string/split-lines "a\n\nb\n") ["a" "" "b"] user=> (clojure.string/s…

何故 do ステートメントがグルーピングするのに必要なの?

Clojure - why is the "do" statement necessary for grouping?まぁそうなるよね、という例。 (defn x [] (if true (do (println "a") (println "b")))) => (x) a b nil do を使えば正常に動くけど、 do を抜かすと… (defn x [] (if true ((println "a") (pr…

(gensym) はユニークになるのに、 `(symb#) はユニークにならないのは何故?

(gensym) is always unique, `(symb#) is not -- why?初見だと僕も見事に引っかかった。 (defmacro indirection [name & body] `(do (def name# ~@body) (defn ~name [] name#))) このマクロは一度しか展開されないので、実行する度にいちいち展開されて nam…

Clojure での素因数分解プログラム

Javaでの素因数分解プログラム - 徒然なる情報系日記これ読んでたら Clojure で実装したくなったのでやってみた*1。最終的なコードはこれ。 (ns prime-factorization.core (:gen-class)) (def prime-numbers ((fn f [x] (cons x (lazy-seq (f (first (drop-w…

Web Development with Clojure を読んだ

読みました。結論から言うと、今現時点 (2015/4/12) でもまぁ役に立つ Clojure で Web 開発をするための入門書だと思います。 本の概要 目次 1. Getting Your Feet Wet 2. Clojure Web Stack 3. Liberator Services 4. Database Access 5. Picture Gallery 6…

Cider-debug という視覚的、対話的な Clojure のためのデバッガについて。

デバッグについてです。例えば Ruby 界隈だと pry で、 Java な人たちは高性能 IDE に標準装備されているデバッガあるいはプラグインなどを利用していることでしょう。Clojure も最近はデバッガが cider に標準装備されているようです。ちょっとまだこなれて…