#はじめまして。
#c-wrapperを使ってPython.hを読み込む際のエラーに悩まされています。
#実行コード:
#(use c-wrapper)
(c-load-library "libpython2.6.so")
(c-include "python2.6/Python.h")
#/usr/include/python2.6/cobject.h:56: void (*destructor)(void *);
/usr/include/python2.6/cobject.h:56: syntax error (at token: RPAREN)
*** ERROR: syntax error
Stack Trace:
#0 (with-error-handler (lambda (e) (let ((e e)) (%guard-rec e e (else ...
[unknown location]
1 (with-error-handler (lambda (e) (let ((e e)) (%guard-rec e e (else ...
[unknown location]
2 (#:loop460 (cddr #:args459) #:G461)
[unknown location]
3 (parse-source include-dirs headers options)
At line 1158 of "/usr/local/share/gauche-0.9/site/lib/c-wrapper/c-parser.scm"
4 (with-error-handler (lambda (e) (let ((e e)) (%guard-rec e e (else ...
[unknown location]
#5 (c-parse (if (list? include-dirs) include-dirs (list include-dirs) ...
At line 105 of "/usr/local/share/gauche-0.9/site/lib/c-wrapper.scm"
6 (read-eval-print-loop (lambda () (rl-set-prompt-state! 'ps1) (read ...
At line 44 of "/usr/local/bin/gosh-rl"
#助言いただければ幸いです。
#環境は、Fedora11, Gauche0.9.1 [utf-8,pthreads], x86_64-unknown-linux-gnuです。
#ハワイは津波大丈夫ですか?
#今避難先から帰ってきました。ハワイでは港の船舶に被害が出ましたが、海岸線を越えて水が上がってくるようなことは無かったようです。
#そちらも地震があったんですか.
#tsunami じゃないかな?
#昨夜からハワイ全州の沿岸に津波警報/避難命令が出たんです。うちも避難地域なので、友人宅におじゃましてました。(友人宅もワイキキだけど、高層階なのでok)
#c-wrapperについてはちょっと確かめて返事します > rokujyouhitoma
#カリフォルニアにも津波が到着して船舶に多少被害がでてるみたい。朝からニュースはこれ一色。
#> rokujyouhitoma
#エラーの原因ですが、object.h で typedef void (*destructor)(PyObject *); としている箇所があって、destructor を 型の名前(TYPENAME)とc-wrapperが認識したためにシンタックスエラーが発生しました。
#うまい解決法がすぐに思いつかないのですが、どうしても使いたいという場合は、Python のヘッダファイルを一式コピーした上で、cobject.h 56行目の void (*destructor)(void *); のdestructorを別の名前に変更すると使えるようになると思います。ざっとgrepしてみたところ、ヘッダファイル内では PyCObject の destructor をその名前で参照している箇所はなさそうなので。
#さすがにad-hoc にルールを追加しただけじゃ、reduce/reduce conflict が発生するなあ。
#そうだlexerにad-hocな修正を入れれば一応使えるんだ。
#--- src/c-lex.c (revision 664)
+++ src/c-lex.c (working copy)
@@ -725,6 +725,8 @@
SCM_RETURN(Scm_Cons(SYM(U_identifier), sym));
} else if (SCM_EQ(last_token, SYM(U_struct)) || SCM_EQ(last_token, SYM(U_union))) {
SCM_RETURN(Scm_Cons(SYM(U_identifier), sym));
+ } else if (SCM_EQ(last_token, SCM_INTERN("*"))) {
+ SCM_RETURN(Scm_Cons(SYM(U_identifier), sym));
} else if (SCM_EQ(last_token, SYM(U_at_interface))) {
install_type(sym);
SCM_RETURN(Scm_Cons(SYM(U_identifier), sym));
#これでとりあえずは通ると思います。
#typedefの取り扱いは難しいなあ。