Gaucheのversionと、できれば日付もいれといて下さい。日付は[[$date]]で入れられます。
with-signal-handlers を呼ぶと、それまで SIG_IGN でなかったものが そうなってしまいます。 例えば、(info 'car) を kterm などで実行している gosh から呼ぶと、 その後 C-z によるサスペンドができなくなります (on NetBSD/amd64 at least)
sigHandlers.handlers[] の状態として、libgauche が扱わないシグナルについては nil であらわすことにしました。その状態を user に見せるかどうかは議論の 余地がありそうですが、ここでは見せることにしています。
enami (2010/08/26 19:48:04 PDT):
diff --git a/src/signal.c b/src/signal.c
index bb87a96..93ac0a1 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -581,5 +581,5 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
struct sigdesc *desc;
sigset_t sigset;
- int badproc = FALSE, sigactionfailed = FALSE;
+ int badproc = FALSE, sigactionfailed = FALSE, donthandle = FALSE;
if (SCM_INTP(sigs)) {
@@ -596,11 +596,4 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
}
- if (mask == NULL) {
- /* If no mask is specified, block singals in SIGS. */
- mask = make_sigset();
- mask->set = sigset;
- }
-
- (void)SCM_INTERNAL_MUTEX_LOCK(sigHandlers.mutex);
if (SCM_TRUEP(handler)) {
act.sa_handler = SIG_DFL;
@@ -610,7 +603,17 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
&& SCM_PROCEDURE_TAKE_NARG_P(handler, 1)) {
act.sa_handler = sig_handle;
+ } else if (SCM_NULLP(handler)) {
+ donthandle = TRUE;
} else {
badproc = TRUE;
}
+
+ if (mask == NULL && !donthandle) {
+ /* If no mask is specified, block singals in SIGS. */
+ mask = make_sigset();
+ mask->set = sigset;
+ }
+
+ (void)SCM_INTERNAL_MUTEX_LOCK(sigHandlers.mutex);
if (!badproc) {
sigfillset(&act.sa_mask); /* we should block all the signals */
@@ -619,5 +622,5 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
if (!sigismember(&sigset, desc->num)) continue;
if (!sigismember(&sigHandlers.masterSigset, desc->num)) continue;
- if (sigaction(desc->num, &act, NULL) != 0) {
+ if (!donthandle && sigaction(desc->num, &act, NULL) != 0) {
sigactionfailed = desc->num;
} else {
@@ -956,5 +959,5 @@ void Scm__InitSignal(void)
(void)SCM_INTERNAL_MUTEX_INIT(sigHandlers.mutex);
sigemptyset(&sigHandlers.masterSigset);
- for (i=0; i<NSIG; i++) sigHandlers.handlers[i] = SCM_FALSE;
+ for (i=0; i<NSIG; i++) sigHandlers.handlers[i] = SCM_NIL;
Scm_InitStaticClass(&Scm_SysSigsetClass, "<sys-sigset>",
齊藤 (2010/04/10 18:40:14 PDT): 以下のようなケースでコンパイルエラーになりました。
(define a 1) (let ((lv (lambda () (set! a 2)))) (dynamic-wind lv (lambda () 'hoge) lv))
*** ERROR: Compile Error: [internal error] stray local variable: "(stdin)":2:(let ((lv (lambda () (set! a 2)))) ( ... Stack Trace: _______________________________________
何故か before と after が違う場合 (↓) にはエラーにはなりませんでした。
(define a 1)
(let ((lv (lambda () (set! a 2)))
(lv2 (lambda () (set! a 2))))
(dynamic-wind lv (lambda () 'hoge) lv2))
teranishi (2010/03/22 06:19:09 PDT): 以下の実行例で、match-let*がエラーを返します。
gosh> (use util.match) #<undef> gosh> (match-let* ((x 1)) x) *** ERROR: Compile Error: unbound variable: match-let*. "(stdin)":2:(match-let* ((x 1)) x) Stack Trace: _______________________________________
libsrc/util/match.scm で match-let*. を定義し忘れているようです。
(2010/03/11 21:42:27 PST): 引数のtypoみたいです。
shibuya 2010/02/20 19:11:22 PST: リファレンスマニュアルの例を実行して、プロトコルアナライザでキャプチャしました。
(use rfc.http)
(call-with-output-file "page.html"
(lambda (out)
(http-get "www.schemers.org" "/"
:sink out :flusher (lambda _ #t))))
GET / HTTP/1.1 Host: www.schemers.org user-agent: gauche.http/0.9 flusher: #<closure (#f #f)> sink: #<oport page.html 0x5547b8>
teppey (2010/01/07 07:44:57 PST): partitionの部分です。
Index: doc/modsrfi.texi
===================================================================
--- doc/modsrfi.texi (revision 6993)
+++ doc/modsrfi.texi (working copy)
@@ -974,7 +974,7 @@
@var{list} by @var{pred}, and the second is the result of
removing elements of @var{list} by @var{pred}.
@c JP
-[SRFI-1] @code{filter} と @code{remove} は同時に、すなわち2つのリストを
+[SRFI-1] @code{filter} と @code{remove} を同時に、すなわち2つのリストを
返しますが、一つ目は @var{pred} により @var{list} の要素をフィルタリング
した結果で、二つ目は @var{pred} により @var{list} の要素を削除した結果
です。
teranishi (2009/12/25 16:00:18 PST): 以下の実行例で、peek-char の前後で port-tell の結果が異なります。
gosh> (call-with-input-string "abcd" (lambda (port) (print (port-tell port)) (peek-char port) (print (port-tell port)))) 0 1 #<undef>
teranishi (2009/12/15 06:45:47 PST): 以下の実行例で、同じフォーマット文字列でpack,unpackしているにもかかわらず元の値に戻りません。(文字コードはUTF-8)
gosh> (use binary.pack)
#<undef>
gosh> (unpack "AC" :from-string (pack "AC" '("1" 128) :to-string? #t))
("1" 194)
gosh> (unpack "A2C" :from-string (pack "A2C" '("" 33) :to-string? #t))
("" 32)
gosh> (unpack "A3C" :from-string (pack "A3C" '("a b" 33) :to-string? #t))
("a" 98)
gosh> (unpack "A3C" :from-string (pack "A3C" '("日" 33) :to-string? #t))
("日" 32)
nekoie (2009/11/26 16:13:20 PST): ./lib/gauche/procedure.scm と ./src/autoloads.scm の二箇所で、「~$」というシンボルをexport/autoloadしようとしているようですが、実体が存在していないようです。