タグ

ブックマーク / athos.hatenablog.com (10)

  • 女子力botをもっとイケてるClojureっぽく - Homoiconic Days

    (このエントリは、しょぼちむアドベントカレンダー 15日目の記事です) はじめに Clojureアイドルことしょぼちむさんが先日開催されたClojure夜会で、Clojureで書かれた女子力botなるものについて発表していました。Clojure歴3週間とのことでしたが、そうとは思えないほどよく書けています。しかし、Clojureのidiomaticな書き方の中には、時間を書けて慣れていかないとなかなかすんなり書くことが難しいものもあります。 そこで、今回は女子力botを題材によりClojureっぽいイケてる書き方を紹介します。 書き換えてみよう 今回ピックアップする項目は以下のとおりです。 clojure-contribは使わないようにしよう シーケンス処理に持ち込もう *-in関数を使おう 状態をloopで持ち回そう 参照を公開しないようにしよう (ここで取り上げていないすべての変更を含

    女子力botをもっとイケてるClojureっぽく - Homoiconic Days
  • Nailgun/GroovyServを使ってClojureの起動を高速化する - Homoiconic Days

    JVM上で動作する言語(処理系)にはよくある話だけれど,Clojureの起動は遅い。下の結果は手元の環境で実行した場合の例。 $ repeat 5 time java clojure.main -e '(println "Hello, Clojure!")' Hello, Clojure! java clojure.main -e '(println "Hello, Clojure!")' 2.31s user 0.17s system 131% cpu 1.885 total Hello, Clojure! java clojure.main -e '(println "Hello, Clojure!")' 2.31s user 0.17s system 131% cpu 1.891 total Hello, Clojure! java clojure.main -e '(println

  • tools.traceで実行トレースをとる - Homoiconic Days

    (このエントリは Clojure Contrib Library Advent Calendar 7日目の記事です。) 概要 今回はtools.traceについてです。tools.traceは実行トレースをとるのに便利な関数/マクロを提供するライブラリです。標準でデバッグ機能が弱いClojure上での開発で,シンプルに関数呼び出しだけトレースしたいような場合に使えます。 インストール Leiningenを使用している場合は,project.cljの:dependenciesに [org.clojure/tools.trace "0.7.6"] と追加するだけで使えます。2013年12月現在では,0.7.6が最新の安定版です。 基的には,tools.traceは開発時に使用するライブラリなので,:devプロファイルの:dependenciesとして追加するのがいいでしょう。 使い方 too

    tools.traceで実行トレースをとる - Homoiconic Days
  • tools.macroを使ってLet Over Lambdaのパンドリックマクロを実装する - Homoiconic Days

    (このエントリは Clojure Contrib Library Advent Calendar 18日目の記事です。) はじめに 今回のネタはtools.macroです。 tools.macroは,ライブラリのREADMEによれば「マクロを書くためのツール」という位置づけで,現在提供している主要な機能はmacroletとsymbol-macroletです。これらは,Common Lispの同名の特殊形式と同じように,それぞれローカルマクロとシンボルマクロを定義するのに使うことができます。Clojureは,(少なくとも現時点では)ローカルマクロやシンボルマクロを言語としてサポートしていないため,そういった機能が必要な複雑なマクロを定義する場合等にはtools.macroのマクロを使うのが便利です。 インストール 2013年12月現在のtools.macroの最新版は0.1.2です。tool

    tools.macroを使ってLet Over Lambdaのパンドリックマクロを実装する - Homoiconic Days
  • Clojure Contrib ライブラリとは - Homoiconic Days

    今年も残すところ1ヶ月となり,恒例のアドベントカレンダーの季節がやってきました。このエントリは,Clojure Contrib Library Advent Calendar 2013 の第1日目の記事です。今回は,Contribライブラリの概要について説明します。 contribライブラリとは そもそもContribライブラリとは何かというと,多くの場面で共通して使える便利な機能を提供する,Clojureの「準標準」的な位置づけのライブラリです。 Contribライブラリは,多くの点で標準ライブラリと共通する部分をもちます。たとえば,Clojure自身と同様,Contribライブラリは github.com/clojure 上でホスティングされています。また,Clojureと同じライセンスおよびCA(Contributor Agreement)で開発されていて,後々標準ライブラリへ移行す

    Clojure Contrib ライブラリとは - Homoiconic Days
  • tools.loggingを使ってSLF4J+Logbackでログをとる - Homoiconic Days

    (このエントリは, Clojure Contrib Library Advent Calendar 9日目の記事です。) 概要 今日紹介するライブラリはtools.loggingです。tools.loggingは,Javaで実装されたいくつかのロギングライブラリを,共通したインタフェースでClojureから使えるようにするライブラリです。デフォルトでサポートされているロギングライブラリは以下のとおりです。 SLF4J commons-logging Log4J java.util.logging また,tools.loggingで定義されているプロトコルを実装することにより,それ以外のライブラリもtools.loggingから使用可能になります。 今回は,tools.loggingを使って,実際にSLF4JとLogbackでログを出力する方法を見てみます。 インストール・設定 tools.

    tools.loggingを使ってSLF4J+Logbackでログをとる - Homoiconic Days
  • 重箱の隅的Clojureのイケてないところ - Homoiconic Days

    この記事はClojure Advent Calendar 2011 4日目の記事です。 Clojureには,シーケンスや組み込みのイミュータブルなコレクション型,STMなどエレガントだといわれる様々な特徴がある。一方で,ときにプログラマを悩ませるような厄介な挙動や不自由さを感じる制約も結構あったりする。 今回は,僕がClojureを使い始めてから2年ちょっとの間に遭遇した,そういったClojureの"イケてない"部分のうち,現在の最新バージョン(v1.3.0)でも見られるものについてまとめてみた。 ネストしたloopをうまく扱えない ClojureはJVM上で実行されるため,(今のところ)末尾呼び出しが最適化されない。末尾再帰(ループ)を使いたい場合にはloop - recurを使う。たとえば,階乗を計算する関数factはloopを使って下のように定義できる。 (defn fact [n]

    重箱の隅的Clojureのイケてないところ - Homoiconic Days
  • Python風ジェネレータを限定継続で - Homoiconic Days

    ここでいろいろ議論されてる、call/ccを使ったジェネレータを勉強がてらに限定継続で書き直してみる。トリッキーな部分がなくなって、かなり素直に書ける。 (define (make-generator f) (let ((cont #f)) (lambda () (reset (if cont (cont #f) (f (lambda (v) (shift k (set! cont k) v)))))))) (define (fib-generator) (make-generator (lambda (yield) (let loop ((a 1) (b 1)) (yield a) (loop b (+ a b)))))) 動作は以下のとおり。 > (define fib (fib-generator)) > (list (fib) (fib) (fib) (fib) (fib)) (1

    Python風ジェネレータを限定継続で - Homoiconic Days
  • Gaucheでシェルスクリプト - Homoiconic Days

    最近、Let Over Lambda (LOL) というを読んでます。 Let Over Lambda 作者: Doug Hoyte出版社/メーカー: Lulu.Com発売日: 2008/04/30メディア: ペーパーバック購入: 1人 クリック: 14回この商品を含むブログ (6件) を見る LOLは、On Lispの発展(?)としてLispのマクロに関して書かれたです。まだ半分くらいしか読んでないですが、マクロってこんな使い方もできるのか!と発見も多く、非常に面白いです。 LOLの3章では defmacro/g! というマクロが登場するんですが、これがなかなか便利で楽しいマクロです。defmacro/g!は、普通のdefmacroと同じようにマクロを定義するマクロなんですが、defmacroとの違いはボディに現れる"g!"から始まるシンボルの扱い方にあります。 defmacro/g

    Gaucheでシェルスクリプト - Homoiconic Days
  • internal defineのすすめ - Homoiconic Days

    末尾再帰という考えを知って間もない頃、関数の内部で関数を定義することにまだ違和感を持っていたので、named letを知ってからしばらくは末尾再帰で書けるものは何でもnamed letで書いていた。 internal defineに馴れてnamed let狂いの時期が過ぎた頃からちょっと大きな(と言ってもたかが知れてて、まぁ200行とか300行とかの)プログラムが急に書けるようになったのを覚えている。 named letは簡単なループのようなものを書くときには便利だけど、少し処理が複雑になってくるとすぐに書きにくくなってくるように感じる。internal defineの(末尾再帰的な処理を書くときにnamed letに対して持つ)優位性は2つくらいのことに起因するんじゃないかと思う。 まず、初期値の設定を遅らせることができること。named letでは、 (define (sum n) (

    internal defineのすすめ - Homoiconic Days
  • 1