{{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 :path "/home/www/wiliki/wiki.dbm" :rw-mode :read)) (define *fsdb* (dbm-open :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 :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 :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が追加されます。