LispとSchemeのねた。
Link
全部挙げるのは無理なので、このページで言及しそうなページのみ。
Lisp
Scheme
XMPPクライアントをまっさらのschemeで書くのに挫折したので、
かわりにloudmouth
をchickenから呼べるようにした。
マニュアルはないけど、C API
を移しかえただけなので、
サンプルのloudmouthのコードそのまま持ってくれば動く。
オウムがえしするだけならこんな感じ。
コールバックの形式だけは普通にforeign-lambdaできないので、
ヘルパーマクロを使って、
(lm:define-message-handler
presence-cb
(conn mes data)
(begin ここにコールバックの内容))
(lm:call-with-message-handler
presence-cb #f #f
(lambda (handler)
(lm:connection-register-message-handler
conn handler
*LM-MESSAGE-TYPE-PRESENCE*
*LM-HANDLER-PRIORITY-LAST*)))
みたいに書く。
コールバックの第一引数がvoid*なものだから、
データの移送はかなり面倒なことに。
これをscheme-objectにすると、gcされちゃう。
これを使ったtwitter->xmppボットは安定動作しているようなので、
モジュール部分だけ公開してみる。
CLだとcl-xmppなんてのがあって、
asdf-installで簡単インストールできたりしてちょっと羨ましかったり。
あんまりにもさみしいのでコメントをつけられるようにしてみた。
自前で書くのも面倒なので、
DISQUS
と言うサービスを使ってみることに。
friendfeedも公式に対応してるみたいなのでメンテも楽そうだ。
なかなかおしゃれな掲示板なのだが、
動作がかなり重い。新しいマシンが欲しくなるくらいだな、こりゃ。
chickenでスパムちゃんぷるーDNSBL
をチエックするeggを書いた。
呼出しは(spam-champuru? host)だけ。簡単。
(use spamchampuru)
(spam-champuru? "192.0.2.1")
=> #t
(spam-champuru? "example.com")
=> #f
ここまできたら、やっぱりSchemeでudpmsgを書かないと。
これは今書いた。CheckenかわいいよChecken。
(use udp)
(define ipmsg-version #x0001)
(define ipmsg-default-port #x0979)
(define ipmsg-sendmsg #x0020)
(define (format-msg num host user cmd extra)
(format "~a:~a:~a:~a:~a:~a" ipmsg-version num host user cmd extra))
(define (send-udpmsg host msg)
(let ((sock (udp-open-socket)))
(udp-bind! sock #f 0)
(udp-connect! sock host 2425)
(udp-send sock (format-msg (random 16777215) "myhost" "myname" ipmsg-sendmsg msg))
(udp-close-socket sock)))
って、3つの中で一番読みやすいな。
Gaucheの内部エンコーディングとWiLiKiのデータベースのエンコーディングをUTF-8に変更した。