こんにちは、小黒と申します。
Scheme はおもしろいですね。特に再帰がこんなに便利なものだとは、Scheme を使うまで知りませんでした。
GaucheFest:15thでgca.el (拙作のGaucheのコードを書くときのためのユーティリティ集)に単体テストケース作成の支援機能を追加しました(あとバグフィックスも)。詳しくは→GaucheFest:koguro
LL RingのLL Gongでc-wrapperのデモを行いました。関係者の皆様お疲れさまでした。
ちなみに、ここ2週間のc-wrapperの更新は、Ruby, Perl, Python対策のためのアップデートでした。今後は、
とかいった点の対応を行おうかと考えています。
あと、会場でびさんにgdchartがc-wrapperで使えないと教えてもらいました。ヘッダファイルを見るとGDCPIE_BGColorなどといった変数を呼出側で宣言しておかなくてはならない作りになっている(ライブラリが呼出側の変数を参照するようになっている)ので現状使えないのは仕方ないのですが、ちょっと悔しかったりします。実行時にシンボルテーブルへシンボルを追加する方法が分かれば何とか対応できるかもしれないので、そこら辺を調べてみます。
c-wrapperとは、C言語で書かれたライブラリ用のFFIです(skimuさんのggcに含まれるlang.toolをベースにlibffiを組み合わせたものです)。特徴として、ヘッダファイルをパーズして動的に定義を行うことができます。このライブラリを使うと、以下のようなコードが書けます。
(use c-wrapper) (c-load-library "libc.so") (c-include "stdio.h") (fprintf stdout "Hello, world") (fflush stdout)
ヘッダファイルから、関数定義、グローバル変数定義、型定義(typedefやstruct, union)、定数定義(#defineやenum)を読み取ることができますので、運がよければstubを書かずにいろいろなライブラリで遊べます。自分の環境ではImageMagick, esound, gtk(1.2ですが...), mecabで使えることは確認しています。
まだ荒削りなところが多々ありますが、いろいろ試してみてください。
--- lib/c-wrapper.scm.orig 2006-03-18 23:39:49.000000000 +0900
+++ lib/c-wrapper.scm 2006-03-22 22:54:40.000000000 +0900
@@ -85,10 +85,17 @@
(else
(loop dlname libdir installed? (read-line in))))))))
+(define LIBRARY-PATHS
+ (remove string-null?
+ ((cut string-split <> ":")
+ (sys-getenv (match (gauche-architecture)
+ ([? #/apple-darwin/] "DYLD_LIBRARY_PATH")
+ (_ "LD_LIBRARY_PATH"))))))
+
(define (find-library lib search-paths)
(let ((paths (if (string-scan lib "/")
'(".")
- (append search-paths SYS-LIBRARY-PATHS))))
+ (append search-paths LIBRARY-PATHS SYS-LIBRARY-PATHS))))
(or (find-file-in-paths lib :paths paths :pred file-is-readable?)
(and (not (path-extension lib))
(or (and-let* ((lafile (find-file-in-paths
--- c-types.scm.org Sat Mar 25 21:02:50 2006 +++ c-types.scm Tue Mar 28 23:04:43 2006 @@ -232,7 +232,7 @@ (define (null-ptr? obj) (and (is-a? obj <c-basic-ptr>) - (equal? (buffer-of obj) %null-ptr-uvector))) + (equal? (buffer-of obj) (%null-ptr-uvector)))) ;; ;; pointer
サーバアプリを作るときに「マルチスレッドにしたいけどプログラムが面倒だな」とよく思うので、協調的なスレッドライブラリを作ってみました(cthreads-0.2.tgz)。特徴は以下の通りです。
欠点としては、
び(2007/03/06 06:03:47 PST): 久々にちょっと試してみようと思ったら、テストが通らなくなっていました。
--- cthreads-0.1.orig/cthreads.scm 2006-02-10 22:51:21.000000000 +0900
+++ cthreads-0.1/cthreads.scm 2007-03-06 21:57:43.000000000 +0900
@@ -351,11 +351,11 @@
((and (not condition-variable) (not timeout))
#t)
((and condition-variable
- (eq (slot-ref condition-variable 'signal) 'notify))
+ (eq? (slot-ref condition-variable 'signal) 'notify))
(slot-set! condition-variable 'signal #f)
#t)
((and condition-variable
- (eq (slot-ref condition-variable 'signal) 'broadcast))
+ (eq? (slot-ref condition-variable 'signal) 'broadcast))
#t)
((and tlimit
(time<? tlimit (current-time)))
diff -urN cthreads-0.1.orig/thread-test.scm cthreads-0.1/thread-test.scm
--- cthreads-0.1.orig/thread-test.scm 2006-02-10 22:18:29.000000000 +0900
+++ cthreads-0.1/thread-test.scm 2007-03-06 21:52:27.000000000 +0900
@@ -347,7 +347,7 @@
(port-test-testers 160 8 20 #t)
(call-with-output-file "test.out"
(lambda (outp) (port-test-kick-threads generators outp))
- :bufferling 'line)
+ :buffering :line)
(call-with-input-file "test.out" confirmer)))
koguro(2007/03/09 20:28:51 PST): パッチありがとうございます。cthreads-0.2.tgzを公開しました。
マクロの勉強をかねて、プロファイラを書いてみました。Gauche:プロファイラ
みなさんどんな風に Scheme のソースを書かれているのでしょうか。 他の人のソースを参考にしているのですが、どこかに明文化されたものがあるとうれしいです。(C みたいに K&R とか whitesmith とかいろいろ流派があるのでしょうか)
閉じ括弧の位置ですが、私は「(baz) こそがこの関数の戻り値」と考えるときは前者、「func とは単に処理を繋げたもの」と思っているときは後者を使います。
(define (func)
(foo)
(bar)
(baz))
(define (func)
(foo)
(bar)
(baz)
)
→ Scheme:コーディングスタイル に移って広げてみましょう Shiro。