tamuraです。
Lisp Meet Up presented by Shibuya.lisp #26 に行ってきましたので、まとめたメモを公開いたします。
今回はClojureの回となっております。


Clojureのチャットボットフレームワーク

by athos0220さん

いろいろある?チャットボットフレームワーク

  • Hubot
    • GitHub製
  • Ruboty
    • Rubyで作られている


  • 背景
    • ChatOpsがはやっている
    • 実行結果もbotがつぶやいてくれる

フレームワークのアーキテクチャ

  • ロボット
    • アダプターとスクリプトの仲介
    • (でかい)
  • アダプター
    • 個別チャットサービスの差異の吸収
  • スクリプト
    • どのメッセージにどう反応するか記述
 [adapter] <-> [robot] <-> [script]
parabora

今回作ったClojure製のチャットボットフレームワーク

複数アダプターの並列実行

  • アダプターは基本的にイベントループで動く
    • 複数動かすにはマルチスレッドで実行
    • アダプターから別のアダプターへメッセージを流すことも可能に
  • core.asyncで複数のスレッドからのメッセージを直列化

リロード可能なアダプター/スクリプト

  • アダプター/スクリプトへの変更を反映させるためにリロードさせたい
  • ファイルのリロードの前後で正しい順で行う
    • スレッドの起動/停止
    • チャットサービスへの接続/切断
  • Componentライブラリ
    • 整合性のとれたリロードの実現を支援するシンプルなライブラリ

関数ベースで記述できるスクリプト

  • スクリプトは基本的に関数で書く
  • ミドルウェアで機能を拡張する

Typed Clojure

by にだーさん

Clojureの良し悪し

  • 関数言語らしい文法
  • シーケンスをベースにした
  • 動的型付け
    • 実行時エラー

Typed Clojure

  • Clojureに漸進的型付けを実現
  • 実行時の挙動には影響しない
  • Lintのように使える
  • 現在は core.typed になっている
  • Leiningenで導入できる

例 数値を受け取って数値を返す

(ann plus [Num -> Num])
(defn plus [x] (+ x 1))

(check-ns)

※チェックに通らないとすごい怒り方をする

例 複数の型を取りうる型を記述できる

(ann plus2 [(t/U Num String) ->String])
(defn plus2 [x]
  (if (string? x)
      (str x 1)
      (str (+ x 1))))

メリットデメリット

  • 利点
    • プログラムの信頼性の向上
    • assertと違い実行時にコストを消費しない


  • 欠点
    • 型を書くコストが大きい
    • 外部ライブラリも型記述が必要

Clojure開発環境Nightcodeについて

by haijuさん

  • gameライブラリ play-cljの作者
  • 初心者向けのClojure開発環境
  • 使っている人があまりいない

  • なにぶん情報がないのでわからないことが多い


感想

TypedClojureに一番興味を覚えました。
Lispはあまり大人数では組まないことが多いと思うのですが、仕事で使うとなると誰がそのコードを使うかわからないので、そういう時に役に立つんではないかと思ったりします。
SIerがClojureの方向を向いてくれると仕事でも使えるのではないかと思います。