トップ 一覧 Farm 検索 ヘルプ RSS ログイン

GaucheMiniCodeの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{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が追加されます。