2008-03-30
Amazon.comでのSICPの評価
SICP |
Amazon.comでのSICPのページを見たら、Peter Norvig 先生がベストレビューだった。本人かどうかわからないけどpaul grahamもレビューを書いている。他にも有名人がいるかと見てみたけど、LokiのAndrei Alexandrescuくらいしかわからなかった。
それにしても本当に星5個と1個ではっきりわかれてるな。1個の人は「退屈」とか『不親切」とかのコメントが多い。理解できないと評価もよくなりようがないよね。
Gauche-gd で図形言語
SICP |
ImageMagickのインストールにつまづいてしまったので、gdを試してみた。無事にインストールできて、SICPの図形言語ができました。
#!/usr/local/bin/gosh (use graphics.gd) (load "./pict-lang.scm") ;; gd interface (define *im* #f) (define (screen w h . rest) (let-optionals* rest ((r 255) (g 255) (b 255)) (set! *im* (gd-image-create w h)) (gd-image-color-transparent *im* (color r g b)) (gd-image-interlace *im* 1))) (define (outimg) (current-gd-image-format (if (memq 'png *gd-features*) 'png 'gif)) (write *im*)) (define (color r g b) (gd-image-color-allocate *im* r g b)) (define (line col x0 y0 x1 y1) (gd-image-line *im* x0 y0 x1 y1 col)) ;; test painter (define wave (let ((p01 (make-vect 0.42 1.00)) (p02 (make-vect 0.58 1.00)) (p03 (make-vect 0.00 0.80)) (p04 (make-vect 0.35 0.80)) (p05 (make-vect 0.65 0.80)) (p06 (make-vect 0.00 0.60)) (p07 (make-vect 0.30 0.60)) (p08 (make-vect 0.40 0.60)) (p09 (make-vect 0.60 0.60)) (p10 (make-vect 0.70 0.60)) (p11 (make-vect 0.20 0.55)) (p12 (make-vect 0.30 0.55)) (p13 (make-vect 0.35 0.50)) (p14 (make-vect 0.65 0.50)) (p15 (make-vect 0.20 0.45)) (p16 (make-vect 1.00 0.40)) (p17 (make-vect 0.50 0.20)) (p18 (make-vect 1.00 0.20)) (p19 (make-vect 0.25 0.00)) (p20 (make-vect 0.40 0.00)) (p21 (make-vect 0.60 0.00)) (p22 (make-vect 0.75 0.00))) (segments->painter (list (make-segment p01 p04) (make-segment p04 p08) (make-segment p08 p07) (make-segment p07 p11) (make-segment p11 p03) (make-segment p06 p15) (make-segment p15 p12) (make-segment p12 p13) (make-segment p13 p19) (make-segment p20 p17) (make-segment p17 p21) (make-segment p22 p14) (make-segment p14 p18) (make-segment p16 p10) (make-segment p10 p09) (make-segment p09 p05) (make-segment p05 p02))))) (define wave2 (beside wave (flip-vert wave))) (define wave4 (below wave2 wave2)) (define (rotate4 painter) (let ((half (beside painter (rotate90 painter)))) (below half (rotate180 half)))) (define (divide-x painter n) (if (> n 0) (let ((sub (divide-x painter (- n 1)))) (below (beside (rotate270 sub) (rotate180 painter)) (beside painter (rotate90 sub)))) painter)) (define test-painter ; (square-limit wave 4) ; (rotate4 (flip-vert (flip-horiz (corner-split wave 4)))) (divide-x wave 5) ) (define-constant WIDTH 256) (define-constant HEIGHT 256) (define (draw-line v0 v1) (let ((x0 (floor->exact (xcor-vect v0))) (y0 (floor->exact (- HEIGHT (ycor-vect v0)))) (x1 (floor->exact (xcor-vect v1))) (y1 (floor->exact (- HEIGHT (ycor-vect v1))))) (line (color 0 0 0) x0 y0 x1 y1))) ;; Entry point (define (main args) (screen WIDTH HEIGHT) (let ((frame (make-frame (make-vect 0 0) (make-vect WIDTH 0) (make-vect 0 HEIGHT)))) (test-painter frame)) (outimg) 0)
ImageMagick
SICPの図形言語がやりたくて、なにか画像処理のパッケージを使いたい。ImageMagickというのがいろいろできそうでよさげ。Gauche-bindingもある。
でやってみようとしたんだけど、インストールに失敗する。
$ ./auto checking build system type... i686-pc-cygwin checking host system type... i686-pc-cygwin checking target system type... i686-pc-cygwin checking for gosh... /usr/local/bin/gosh checking for gauche-config... /usr/local/bin/gauche-config checking for gauche-package... /usr/local/bin/gauche-package checking for gauche-install... /usr/local/bin/gauche-install checking for gauche-cesconv... /usr/local/bin/gauche-cesconv checking for a BSD-compatible install... /usr/bin/install -c configure: creating ./config.status config.status: creating Makefile config.status: executing im_head_n_tail commands config.status: generating im_head.c and im_tail.c gcc -g -O2 -I/usr/local/lib/gauche/0.8.12/include -fomit-frame-pointer -march=i686 -DUSE_I686_PREFETCH -fpic -c -o im_head.o im_head.c im_head.c:1: warning: -fpic ignored for target (all code is position independent) gcc -g -O2 -I/usr/local/lib/gauche/0.8.12/include -fomit-frame-pointer -march=i686 -DUSE_I686_PREFETCH -fpic -c -o im.o im.c im.c:1: warning: -fpic ignored for target (all code is position independent) im.c:121: error: initializer element is not constant im.c:121: error: (near initialization for `Scm_ImageInfoClass.cpa') im.c:173: error: initializer element is not constant im.c:173: error: (near initialization for `Scm_ExceptionInfoClass.cpa') im.c: In function `Scm_ExceptionInfoClass_reason_SET': im.c:211: warning: assignment discards qualifiers from pointer target type im.c: In function `Scm_ExceptionInfoClass_description_SET': im.c:224: warning: assignment discards qualifiers from pointer target type im.c: At top level: im.c:282: error: initializer element is not constant im.c:282: error: (near initialization for `Scm_ImageClass.cpa') make: *** [im.o] Error 1
わからん。とりあえずCから使えるかテストする。
Cから使う
ImageMagick: MagickCore, Low-level C API for ImageMagick
- MagickCore-config がない→無視
gcc core.c -lmagick
- リンクエラー
$ gcc core.c -lmagick core.c:(.text+0x70): undefined reference to `_MagickCoreGenesis' core.c:(.text+0x1d2): undefined reference to `_MagickCoreTerminus' collect2: ld returned 1 exit status
- ImageMagick • View topic - undefined symbol: MagickCoreGenesis
- InitializeMagick(), DestroyMagick() を使えとのこと
- できました
Gaucheバインディングのインストールに失敗した行を見てみる
im.c:121: error: initializer element is not constant im.c:121: error: (near initialization for `Scm_ImageInfoClass.cpa')
im.c:121: SCM_DEFINE_BUILTIN_CLASS(Scm_ImageInfoClass, NULL, NULL, NULL, NULL, SCM_CLASS_DEFAULT_CPL);
- SCM_CLASS_DEFAULT_CPL の定義で、
SCM_EXTERN ScmClass *Scm_DefaultCPL[];
- のSCM_EXTERN が、Cygwin だと
# define SCM_EXTERN extern __declspec(dllimport)
- となって、これが定数にはならないからだめぽい。
- でもそれだとCygwinで拡張ライブラリが使えないことになっちゃうぞ?
- 宣言時には CPA に NULL を与えておいて、実行時に値をセットするよう書き換え
// 宣言時 //SCM_DEFINE_BUILTIN_CLASS(Scm_ImageInfoClass, NULL, NULL, NULL, NULL, SCM_CLASS_DEFAULT_CPL); SCM_DEFINE_BUILTIN_CLASS(Scm_ImageInfoClass, NULL, NULL, NULL, NULL, NULL); // 初期化関数内 Scm_ImageInfoClass.cpa = SCM_CLASS_DEFAULT_CPL;
- リンクエラー
gcc -Wl,--export-all-symbols -Wl,--enable-auto-import -shared -o im.so im_head.o im.o im_tail.o im-lib.o -L/usr/local/lib/gauche/0.8.12/i686-pc-cygwin -lgauche -lm -lpthread -lMagick im.o: In function `im_im_write_image_to_uvector': /cygdrive/c/temp/gauche-imagemagick-1.9/im.c:629: undefined reference to `_Scm_U8VectorClass' /cygdrive/c/temp/gauche-imagemagick-1.9/im.c:629: undefined reference to `__imp__Scm_MakeUVectorFull' im.o: In function `im_im_uvector_discard': /cygdrive/c/temp/gauche-imagemagick-1.9/im.c:641: undefined reference to `_Scm_U8VectorClass' collect2: ld returned 1 exit status
- uvectorがないらしい
Liliam2012/02/15 18:39I was looking everywhere and this pppoed up like nothing!
dkonohlix2012/02/16 17:57V3oJQu <a href="http://rzczofnepdgc.com/">rzczofnepdgc</a>
uftqorob2012/02/17 00:43scCwcf , [url=http://wtqgzbbvxrxg.com/]wtqgzbbvxrxg[/url], [link=http://ltdndbdxyrpl.com/]ltdndbdxyrpl[/link], http://gedbptbgtjkb.com/
uxinkjf2012/02/18 02:11eOKr6V <a href="http://mvrnsqzfymwr.com/">mvrnsqzfymwr</a>
