SDL_ttfのバインディングを追加しました
example/sdl-ttf-demo.scmの表示です :)
MySQLのバインディングを追加しました
やっぱりハッシュテーブルだけだとキツイです・・・
で、餅は餅屋ということでMySQL 5.1 C APIのバインディングを追加しました。
$ ypsilon Ypsilon 0.9.6-trunk/r443 Copyright (c) 2009 Y.Fujita, LittleWing Company Limited. > (import (ypsilon mysql)) > (define NULL 0) > (define user "root") > (define passwd "...") > (define mysql (mysql_init NULL)) > (if (zero? (mysql_real_connect mysql "localhost" user passwd "mysql" 0 NULL 0)) (display (mysql_error mysql)) (display (mysql_stat mysql))) Uptime: 52318 Threads: 1 Questions: 7 Slow queries: 0 Opens: 12 Flush tables: 1 ... > (mysql_close mysql)
このままだと使いにくいので何か考えたいですね :)
SDL on Mac OSX
id:kazuya_aさんにSDLをMac OSXで使う方法を教えて頂きました :D
ypsilon+SDL+Mac OSX!
SDLMain.mをスタティックリンクしなくても良いというのは素晴らしいですね!
Digamma - Tracing JIT Compiler for Ypsilon
ネイティブコード生成についていろいろと考えていましたが、Tracing JITと呼ばれるものを試してみることにしました。
Tracing JITでポイントとなるのはインタープリタとコンパイル済みのコードの切り替えに起因するオーバヘッドかと思います。またYpsilonではConcurrent GCの性能を落としてはいけないという制約がありますのでなかなか難しいです。
でも、面白いことにConcurrent GCとTraicing JITが上手くかみ合うとネイティブコンパイラの性能を越えるケースも出てくるようです。
まず、Ikarusより速くなるという特別なケースを紹介しましょう。
(define map-1 (lambda (proc lst) (if (null? lst) '() (cons (proc (car lst)) (map-1 proc (cdr lst)))))) (define minus (lambda (x) (- x))) (define lst (make-list 1000000 1)) (define sink #f) (time (set! sink (map-1 minus lst)))
結果は・・・
Linux ubuntu-core2 2.6.27-11-generic #1 SMP Thu Jan 29 19:24:39 UTC 2009 i686 GNU/Linux Ikarus 5 collections 269 ms elapsed cpu time, including 168 ms collecting 273 ms elapsed real time, including 168 ms collecting 20558328 bytes allocated Ypsilon 0.9.6-trunk/r417 0.303697 real 0.536033 user 0.000000 sys Ypsilon 0.9.6-trunk/r417 + Digamma(Tracing JIT) 0.211938 real 0.416026 user 0.000000 sys (*1)
これはmap-1だけをコンパイルしてminusはインタープリタで実行した場合の結果です。minusが1000000回ほど実行されることを考えれば、何かを間違えていると思えるような結果ですね :D(念のため繰り返しますが、これはあくまで特別なケースですよ!)
続きを読むFFIに可変引数(variadic arguments)のサポートを追加しました
こんな風に使えます :D
> (import (ypsilon ffi)) > (define libc (load-shared-object "libc.so.6")) > (define printf (c-function libc "libc" int printf (char* ...))) > (printf "test %d %f %s %e\n" 100 100.0 "こんにちは" 0.0001) test 100 100.000000 こんにちは 1.000000e-04