[トップ][ノート][編集履歴][一覧][最近の更新][->English]

Scheme

Category of Scheme

Schemeねた。Gaucheほか。

Link

Chicken/Scheme/loudmouth.egg

Category of Chicken
Category of 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で簡単インストールできたりしてちょっと羨ましかったり。

Scheme/Chicken/spamchampuru

Category of Scheme
Category of Chicken

chickenでスパムちゃんぷるーDNSBLをチエックするeggを書いた。

呼出しは(spam-champuru? host)だけ。簡単。

(use spamchampuru)
(spam-champuru? "192.0.2.1")
=> #t
(spam-champuru? "example.com")
=> #f

Programming/Scheme/Chicken/udpmsg

Category of Programming
Category of Scheme
Category of Chicken

ここまできたら、やっぱり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つの中で一番読みやすいな。