- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{category プログラミング}}
{{category scheme}}
! [[ソケット関連|GaucheSampleSocket]]
! [[プログラムをリストに格納する|GaucheSampleParser]]
!!dbmとか
!dbm変換
gdbmで変換していたファイルがあったのですが、Gauche-0.7.2でサポートされた
fsdbmの方が都合よさげだったので、一括変換してみました。
#!/usr/local/bin/gosh
(use dbm)
(use dbm.gdbm)
(use dbm.fsdbm)
; open the database
(define *gdb* (dbm-open <gdbm>
:path "/home/www/wiliki/wiki.dbm" :rw-mode :read))
(define *fsdb* (dbm-open <fsdbm>
:path "/home/miyo/src/gauche/test" :rw-mode :write))
(dbm-for-each *gdb*
(lambda (key value)
(dbm-put! *fsdb* key value)))
(dbm-close *gdb*)
(dbm-close *fsdb*)
!!束縛とか
!letrec
再帰的に呼び出す関数を局所的に定義したいときは
letrecを使えばいい
;; @desc リストの要素の全ての組み合わせをリストにして返す
;; @param given-list リスト
(define (bisl.list.util.get-all-list-combinated given-list)
(cond ((= (length given-list) 1) given-list)
((= (length given-list) 2)
(list given-list (reverse given-list)))
(#t
(letrec ((f (lambda (a ll)
(if (null? (cdr ll)) ; リストの最終
(bisl.list.util.get-all-list-add-atom a (car ll))
(append
(bisl.list.util.get-all-list-add-atom a (car ll))
(f a (cdr ll)))))))
(f (car given-list)
(bisl.list.util.get-all-list-combinated
(cdr given-list)))))))
----
!!socketとか
!Socket通信 UDP
;; @desc UPL/UDP通信のためのソケットを開く
;; @param port ポート番号
;; @param addr ホスト名(文字列)
(define (fefe port hostname)
(socket-bind
(make-socket AF_INET SOCK_DGRAM)
(make <sockaddr-in> :host hostname :port port)))
!!続Socket通信 UDP
上のでは実はうまくいかない
きちんとfdを取得して、ポートを開く必要あり
(use srfi-1)
(use gauche.net)
(define (send-udp-packet sockaddr packet)
(let* ((socket (make-socket AF_INET SOCK_DGRAM)))
(socket-connect socket sockaddr)
(let* ((fd (socket-fd socket))
(port (open-output-fd-port fd)))
(for-each (lambda (x)
(write-byte x port))
packet)
(flush port))))
(define (main args)
(send-udp-packet
(make <sockaddr-in> :host "moss" :port 12345)
'(254 2 3 4 5 6)))
!socket-bind
上のコードの場合にはローカル側が適当なポートにbindされる。
なのでsocket-bindでローカルでbindすることが必要
----
!!list遊び
!slice
作ろうとおもってたら、組み込まれてました
(use util.list)
Function: slices list k &optional fill? padding
(slices '(a b c d e f g) 3)
=> ((a b c) (d e f) (g))
(slices '(a b c d e f g) 3 #t 'z)
=> ((a b c) (d e f) (g z z))
listを、それぞれの長さがkであるようなサブリスト(スライス)に分割します。 listの長さがkの整数倍でない場合は、最後のスライスは take*と同じ方法で扱われます。つまり、デフォルトではkより短いもの、あるいはfill?が真ならばpaddingが追加されます。