From unknown Mon Aug 18 11:32:49 2025 X-Loop: help-debbugs@gnu.org Subject: bug#14922: guard expression doesn't catch everything Resent-From: =?UTF-8?Q?G=C3=B6ran?= Weinholt Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Sun, 21 Jul 2013 09:30:04 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 14922 X-GNU-PR-Package: guile X-GNU-PR-Keywords: To: 14922@debbugs.gnu.org X-Debbugs-Original-To: bug-guile@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.137439898726954 (code B ref -1); Sun, 21 Jul 2013 09:30:04 +0000 Received: (at submit) by debbugs.gnu.org; 21 Jul 2013 09:29:47 +0000 Received: from localhost ([127.0.0.1]:40632 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V0pxa-00070d-RN for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:47 -0400 Received: from eggs.gnu.org ([208.118.235.92]:56308) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V0pxX-000707-Iy for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V0pxR-0001Qg-Ag for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:38 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-99.2 required=5.0 tests=BAYES_50,T_DKIM_INVALID, USER_IN_WHITELIST autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:60659) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0pxR-0001Qc-72 for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58029) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0pxQ-0000V1-4G for bug-guile@gnu.org; Sun, 21 Jul 2013 05:29:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V0pxO-0001Q2-OL for bug-guile@gnu.org; Sun, 21 Jul 2013 05:29:36 -0400 Received: from iustitia.weinholt.se ([2a02:28f0:0:a::7dce:e5a8]:52913) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0pxO-0001P1-DK for bug-guile@gnu.org; Sun, 21 Jul 2013 05:29:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=weinholt.se; s=iustitia2012; h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From; bh=uaQbBABNOUIFhpCNDYCxaGl3AjyZJhq5n+hkm55Jl4I=; b=jnDTGSlUTALiKbluC52njNOz2H+CM2hCj7c/fZE9DWQSqaLZWmfJVAmPswp4bBhNRE+PXV63KFta+wpVOMy8p3K37EMhGoEzTdOR4NC6Nm5yCHClh6yKdmraYXhXWDDLd+r4xGYxRGvoCHx0cb11lhe4fR+zuEz18wtYAxWx48qi3JC47VNpjaz5cFM4V2aEiXl5yPa+JDol2Wxi42Y3dfVO8OdTJSk8ok0Fhrr193gdNq2JbSmgT3JckNauLSeDlMrb2VgL6VcQipBc7h8Rpsz7HAo5/K19+N6SMn5eoCVZmaw4XVpzQwE4zYd3kBFvANu0MjQqJuqkKf/FCOFJow==; Received: from uucp by iustitia.weinholt.se with local-bsmtp (Exim 4.72) (envelope-from ) id 1V0pxG-0004ey-R1; Sun, 21 Jul 2013 11:29:26 +0200 Received: from weinholt by industria with local (Exim 4.80) (envelope-from ) id 1V0pwz-0001gv-E4; Sun, 21 Jul 2013 11:29:09 +0200 X-Hashcash: 1:20:130721:bug-guile@gnu.org::wwz3cVu0cY8t/3qs:000000000000000000000000000000000000000000001jQr From: =?UTF-8?Q?G=C3=B6ran?= Weinholt Date: Sun, 21 Jul 2013 11:29:03 +0200 Message-ID: <87d2qcqn1c.fsf@industria.weinholt.se> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.4 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -3.3 (---) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello schemers, the guard expression from (rnrs) would be a lot more useful if it managed to catch all exceptions. As it is now, some errors will bypass the guard: scheme@(guile-user)> (import (rnrs)) scheme@(guile-user)> (guard (exn (else #f)) (fx+ #f #f)) $1 =3D #f scheme@(guile-user)> (guard (exn (else #f)) (fx+)) ;;; :3:0: warning: possibly wrong number of arguments to `fx+' rnrs/arithmetic/fixnums.scm:153:2: In procedure fx+: rnrs/arithmetic/fixnums.scm:153:2: Wrong number of arguments to # The background is that I'm working on a program that intentionally calls procedures with bad arguments, and it needs to determine if the procedure accepted the arguments or not. Ideally the object raised would be a proper and correct R6RS condition object, but I suspect that most of the existing Guile code doesn't raise conditions like that. I think it would be a step forward if guard at least caught the exception, even if the condition object might not be very useful. Tested with Guile 2.0.9.40-824b-dirty. Regards, =2D-=20 G=C3=B6ran Weinholt "Bring me back // to a story left untold // so we can write the ending." -- Aly & Fila feat. Jwaydan - We Control The Sunlight --=-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBCgAGBQJR66nfAAoJEOM+YaLpuMOiVJUP/imwUxAO3TP5hxhjWgB2+Ge0 OpxRVBkh9ipLuFwzWZ006rROSg9eqNtGlVGuLf+s75p8ynQYY319ON04eTb8p4Fy ofODi9FHmQ7yOebjMvhBDedDEpzmGdbF7EcXRvTuqOvLa1i6kaWZpRmtNuzVBBA3 OZFp/MW//sKnUNlmsSHLBUIuJm6Kv3351aeYHNkDdi1A6q2Humj8HkvB82fmCDbO wdVziZdCXLzFo9/C9msuQPHTG/t3ukFYSbSmuNrr8BmN8G66owcRblHHzPgn5MLZ vph8UgBhQ6Y1ufZb8qQTE7Z0KoCHMTs+UwwJePWb9ySiidoDhPXJH4IduyJKM0Xv XmHfUInS8BKL9n44jIJMtI77dYHR3piZNez4N3sRkwWIQePTl+558XkCGkUYaMoj mBNx4xySIZ5FTn4H9aMZak6EjHAKBvEk1PiaEH0SR0CqxlCUGJitGjhmh5dMrL4H 9j61Aw9MAtEnJw5wAjOYRp/QuvS3TC28ziDjNDWO1ggTMmMo8Owst54kgQWc0tus L7m2dYnoaB/w/FlgCMYbYAx4agiWpO+4l/84d5MaXGnLaGEzRU0Uywp3kmD4YM3S f/BpNXLRboU534YxXNnNDd+I7RScsgcXFkcfl/ZaxpqFsKbG5vAmhRCb+us4ykPq Pg/9aIKApg9Y9ADfK7yS =vAKc -----END PGP SIGNATURE----- --=-=-=-- From unknown Mon Aug 18 11:32:49 2025 X-Loop: help-debbugs@gnu.org Subject: bug#14922: Improving R6RS exception handling in Guile References: <87d2qcqn1c.fsf@industria.weinholt.se> In-Reply-To: <87d2qcqn1c.fsf@industria.weinholt.se> Resent-From: Mark H Weaver Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Sat, 10 Aug 2013 17:09:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 14922 X-GNU-PR-Package: guile X-GNU-PR-Keywords: To: guile-devel@gnu.org Cc: Andreas Rottmann , =?UTF-8?Q?G=C3=B6ran?= Weinholt , 14922@debbugs.gnu.org Received: via spool by 14922-submit@debbugs.gnu.org id=B14922.137615450825148 (code B ref 14922); Sat, 10 Aug 2013 17:09:02 +0000 Received: (at 14922) by debbugs.gnu.org; 10 Aug 2013 17:08:28 +0000 Received: from localhost ([127.0.0.1]:51985 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V8CeR-0006XX-Fx for submit@debbugs.gnu.org; Sat, 10 Aug 2013 13:08:28 -0400 Received: from world.peace.net ([96.39.62.75]:53126 ident=hope7) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V8CeN-0006XJ-IG for 14922@debbugs.gnu.org; Sat, 10 Aug 2013 13:08:24 -0400 Received: from c-98-217-64-74.hsd1.ma.comcast.net ([98.217.64.74] helo=tines.lan) by world.peace.net with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1V8Ce0-0007I3-Ix; Sat, 10 Aug 2013 13:08:01 -0400 From: Mark H Weaver Date: Sat, 10 Aug 2013 13:07:50 -0400 Message-ID: <87txixqxsp.fsf@tines.lan> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello all, I've cooked up a patch to help improve R6RS exception handling in Guile. As noted by G=C3=B6ran Weinholt in , the R6RS exception handlers in Guile are currently unable to catch native Guile exceptions. To fix this, the basic approach of this patch is to convert native Guile exceptions into R6RS conditions within the R6RS exception handlers. It's almost that simple, but there's one twist: if an R6RS exception handler chooses not to handle a given exception, it will call 'raise' again on the condition object, and here we must arrange to throw the original Guile exception again. We must do this because there's a lot of Guile code out there that can only handle native Guile exceptions, and which should not be broken by an R6RS exception handler somewhere in the middle of the call stack. We cope with this by including a special &guile condition object in the compound condition that is produced by conversion. Whenever 'raise' is applied to such a condition, it will use the native Guile 'throw' with the original KEY and ARGS stored in the &guile condition object. Still to do: Modify the core Guile routines where needed (especially I/O) to include enough information in exceptions to generate the standard R6RS condition objects. I'd be grateful for any feedback. Regards, Mark --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Convert-guile-exceptions-to-R6RS-conditions-in-R6RS-.patch Content-Description: [PATCH] Convert guile exceptions to R6RS conditions in R6RS exception handlers >From 6b2a6f3f91fc8078053727e45ee3e40515274bc3 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Fri, 9 Aug 2013 18:27:20 -0400 Subject: [PATCH] Convert guile exceptions to R6RS conditions in R6RS exception handlers. * module/rnrs/exceptions.scm (&guile): New condition type. (guile-condition-converters): New variable. (convert-guile-condition, default-guile-condition-converter, set-guile-condition-converter!, guile-common-conditions, guile-lexical-violation-converter, guile-syntax-violation-converter, guile-assertion-violation-converter, guile-system-error-converter, guile-undefined-violation-converter, guile-error-converter, guile-implementation-restriction-converter): New procedures. (with-exception-handler): Catch all exceptions, not just R6RS exceptions. Convert native Guile exceptions to R6RS conditions, preserving the original Guile exception information in the &guile condition object. (raise, raise-continuable): If the condition includes a &guile condition, use 'throw' to throw the original native guile exception instead of raising an R6RS exception. * test-suite/tests/r6rs-exceptions.test ("guile condition conversions"): Add tests. --- module/rnrs/exceptions.scm | 158 +++++++++++++++++++++++++++++---- test-suite/tests/r6rs-exceptions.test | 56 +++++++++++- 2 files changed, 198 insertions(+), 16 deletions(-) diff --git a/module/rnrs/exceptions.scm b/module/rnrs/exceptions.scm index 95d01df..21aa391 100644 --- a/module/rnrs/exceptions.scm +++ b/module/rnrs/exceptions.scm @@ -1,6 +1,6 @@ ;;; exceptions.scm --- The R6RS exceptions library -;; Copyright (C) 2010, 2011 Free Software Foundation, Inc. +;; Copyright (C) 2010, 2011, 2013 Free Software Foundation, Inc. ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -29,14 +29,61 @@ newline display filter + acons + assv-ref + throw set-exception-printer! with-throw-handler *unspecified* @@)) - (define raise (@@ (rnrs records procedural) r6rs-raise)) - (define raise-continuable + ;; When a native guile exception is caught by an R6RS exception + ;; handler, we convert it to an R6RS compound condition that includes + ;; not only the standard condition objects expected by R6RS code, but + ;; also a special &guile condition that preserves the original KEY and + ;; ARGS passed to the native Guile catch handler. + + (define-condition-type &guile &condition + make-guile-condition guile-condition? + (key guile-condition-key) + (args guile-condition-args)) + + (define (default-guile-condition-converter key args) + (condition (make-serious-condition) + (guile-common-conditions key args))) + + (define (guile-common-conditions key args) + (apply (case-lambda + ((subr msg margs . _) + (condition (make-who-condition subr) + (make-message-condition msg) + (make-irritants-condition margs))) + (_ (make-irritants-condition args))) + args)) + + (define (convert-guile-condition key args) + (let ((converter (assv-ref guile-condition-converters key))) + (condition (or (and converter (converter key args)) + (default-guile-condition-converter key args)) + ;; Preserve the original KEY and ARGS in the R6RS + ;; condition object. + (make-guile-condition key args)))) + + ;; If an R6RS exception handler chooses not to handle a given + ;; condition, it will re-raise the condition to pass it on to the next + ;; handler. If the condition was converted from a native Guile + ;; exception, we must re-raise using the native Guile facilities and + ;; the original exception KEY and ARGS. We arrange for this in + ;; 'raise' so that native Guile exception handlers will continue to + ;; work when mixed with R6RS code. + + (define (raise obj) + (if (guile-condition? obj) + (apply throw (guile-condition-key obj) (guile-condition-args obj)) + ((@@ (rnrs records procedural) r6rs-raise) obj))) + (define raise-continuable (@@ (rnrs records procedural) r6rs-raise-continuable)) + (define raise-object-wrapper? (@@ (rnrs records procedural) raise-object-wrapper?)) (define raise-object-wrapper-obj @@ -45,19 +92,22 @@ (@@ (rnrs records procedural) raise-object-wrapper-continuation)) (define (with-exception-handler handler thunk) - (with-throw-handler 'r6rs:exception + (with-throw-handler #t thunk (lambda (key . args) - (if (and (not (null? args)) - (raise-object-wrapper? (car args))) - (let* ((cargs (car args)) - (obj (raise-object-wrapper-obj cargs)) - (continuation (raise-object-wrapper-continuation cargs)) - (handler-return (handler obj))) - (if continuation - (continuation handler-return) - (raise (make-non-continuable-violation)))) - *unspecified*)))) + (cond ((not (eq? key 'r6rs:exception)) + (let ((obj (convert-guile-condition key args))) + (handler obj) + (raise (make-non-continuable-violation)))) + ((and (not (null? args)) + (raise-object-wrapper? (car args))) + (let* ((cargs (car args)) + (obj (raise-object-wrapper-obj cargs)) + (continuation (raise-object-wrapper-continuation cargs)) + (handler-return (handler obj))) + (if continuation + (continuation handler-return) + (raise (make-non-continuable-violation))))))))) (define-syntax guard0 (syntax-rules () @@ -143,4 +193,82 @@ (set-exception-printer! 'r6rs:exception exception-printer) -) + ;; Guile condition converters + ;; + ;; Each converter is a procedure (converter KEY ARGS) that returns + ;; either an R6RS condition or #f. If #f is returned, + ;; 'default-guile-condition-converter' will be used. + + (define (guile-syntax-violation-converter key args) + (apply (case-lambda + ((who what where form subform . extra) + (condition (make-syntax-violation form subform) + (make-who-condition who) + (make-message-condition what))) + (_ #f)) + args)) + + (define (guile-lexical-violation-converter key args) + (condition (make-lexical-violation) (guile-common-conditions key args))) + + (define (guile-assertion-violation-converter key args) + (condition (make-assertion-violation) (guile-common-conditions key args))) + + (define (guile-undefined-violation-converter key args) + (condition (make-undefined-violation) (guile-common-conditions key args))) + + (define (guile-implementation-restriction-converter key args) + (condition (make-implementation-restriction-violation) + (guile-common-conditions key args))) + + (define (guile-error-converter key args) + (condition (make-error) (guile-common-conditions key args))) + + (define (guile-system-error-converter key args) + (apply (case-lambda + ((subr msg msg-args errno . rest) + ;; XXX TODO we should return a more specific error + ;; (usually an I/O error) as expected by R6RS programs. + ;; Unfortunately this often requires the 'filename' (or + ;; other?) which is not currently provided by the native + ;; Guile exceptions. + (condition (make-error) (guile-common-conditions key args))) + (_ (guile-error-converter key args))) + args)) + + ;; TODO: Arrange to have the needed information included in native + ;; Guile I/O exceptions, and arrange here to convert them to the + ;; proper conditions. Remove the earlier exception conversion + ;; mechanism: search for 'with-throw-handler' in the 'rnrs' + ;; tree, e.g. 'with-i/o-filename-conditions' and + ;; 'with-i/o-port-error' in (rnrs io ports). + + ;; XXX TODO: How should we handle the 'misc-error' and 'signal' native + ;; Guile exceptions? + + ;; XXX TODO: Should we handle the 'quit exception specially? + + ;; An alist mapping native Guile exception keys to converters. + (define guile-condition-converters + `((read-error . ,guile-lexical-violation-converter) + (syntax-error . ,guile-syntax-violation-converter) + (unbound-variable . ,guile-undefined-violation-converter) + (wrong-number-of-args . ,guile-assertion-violation-converter) + (wrong-type-arg . ,guile-assertion-violation-converter) + (keyword-argument-error . ,guile-assertion-violation-converter) + (out-of-range . ,guile-assertion-violation-converter) + (regular-expression-syntax . ,guile-assertion-violation-converter) + (program-error . ,guile-assertion-violation-converter) + (goops-error . ,guile-assertion-violation-converter) + (null-pointer-error . ,guile-assertion-violation-converter) + (system-error . ,guile-system-error-converter) + (host-not-found . ,guile-error-converter) + (getaddrinfo-error . ,guile-error-converter) + (no-data . ,guile-error-converter) + (no-recovery . ,guile-error-converter) + (try-again . ,guile-error-converter) + (stack-overflow . ,guile-implementation-restriction-converter))) + + (define (set-guile-condition-converter! key proc) + (set! guile-condition-converters + (acons key proc guile-condition-converters)))) diff --git a/test-suite/tests/r6rs-exceptions.test b/test-suite/tests/r6rs-exceptions.test index 54a4ddb..c6daa0f 100644 --- a/test-suite/tests/r6rs-exceptions.test +++ b/test-suite/tests/r6rs-exceptions.test @@ -1,6 +1,6 @@ ;;; r6rs-exceptions.test --- Test suite for R6RS (rnrs exceptions) -;; Copyright (C) 2010 Free Software Foundation, Inc. +;; Copyright (C) 2010, 2013 Free Software Foundation, Inc. ;; ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -20,6 +20,7 @@ (define-module (test-suite test-rnrs-exceptions) :use-module ((rnrs conditions) :version (6)) :use-module ((rnrs exceptions) :version (6)) + :use-module (system foreign) :use-module (test-suite lib)) (with-test-prefix "with-exception-handler" @@ -96,3 +97,56 @@ (pass-if "guard with cond => syntax" (guard (condition (condition => error?)) (raise (make-error))))) + +(with-test-prefix "guile condition conversions" + + (define-syntax-rule (pass-if-condition name expected-condition? body ...) + (pass-if name + (guard (obj ((expected-condition? obj) #t) + (else #f)) + body ... #f))) + + (pass-if "rethrown native guile exceptions" + (catch #t + (lambda () + (guard (obj ((syntax-violation? obj) #f)) + (vector-ref '#(0 1) 2) + #f)) + (lambda (key . args) + (eq? key 'out-of-range)))) + + (pass-if-condition "syntax-error" + syntax-violation? + (eval '(let) (current-module))) + + (pass-if-condition "unbound-variable" + undefined-violation? + variable-that-does-not-exist) + + (pass-if-condition "out-of-range" + assertion-violation? + (vector-ref '#(0 1) 2)) + + (pass-if-condition "wrong-number-of-args" + assertion-violation? + ((lambda () #f) 'unwanted-argument)) + + (pass-if-condition "wrong-type-arg" + assertion-violation? + (vector-ref '#(0 1) 'invalid-index)) + + (pass-if-condition "keyword-argument-error" + assertion-violation? + ((lambda* (#:key a) #f) #:unwanted-keyword 'val)) + + (pass-if-condition "regular-expression-syntax" + assertion-violation? + (make-regexp "[missing-close-square-bracket")) + + (pass-if-condition "null-pointer-error" + assertion-violation? + (dereference-pointer (make-pointer 0))) + + (pass-if-condition "read-error" + lexical-violation? + (read (open-input-string "(missing-close-paren")))) -- 1.7.10.4 --=-=-=-- From unknown Mon Aug 18 11:32:49 2025 X-Loop: help-debbugs@gnu.org Subject: bug#14922: Improving R6RS exception handling in Guile Resent-From: =?UTF-8?Q?G=C3=B6ran?= Weinholt Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Thu, 15 Aug 2013 11:15:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 14922 X-GNU-PR-Package: guile X-GNU-PR-Keywords: To: Mark H Weaver Cc: Andreas Rottmann , guile-devel@gnu.org, 14922@debbugs.gnu.org Received: via spool by 14922-submit@debbugs.gnu.org id=B14922.137656526622255 (code B ref 14922); Thu, 15 Aug 2013 11:15:03 +0000 Received: (at 14922) by debbugs.gnu.org; 15 Aug 2013 11:14:26 +0000 Received: from localhost ([127.0.0.1]:59896 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V9vVW-0005mq-IG for submit@debbugs.gnu.org; Thu, 15 Aug 2013 07:14:26 -0400 Received: from iustitia.weinholt.se ([46.16.232.230]:48528) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V9vVP-0005mS-FZ for 14922@debbugs.gnu.org; Thu, 15 Aug 2013 07:14:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=weinholt.se; s=iustitia2012; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date:References:Subject:Cc:To:From; bh=NiKnnV9hbuHaIeuSjnZCzqOkeZ7Kd7fBSjCsq9dMWys=; b=mV35brKUrMWaBlKCxwAJn4ohqQYRZrd1w3YrKA9X2uiiaDYwGISASdkavOs37Lg5NHCMIdbxGk0T+99i+CFs6qs5MS/xNi/Phw/Gz9ta+OMIDL3JnM5NlcNq9+1/G4jGUUL+Js/eMAUYn8nBadrFxOd6gxDc7+vTsTWjlb2S5OiW/uet4p3cv+pinrcl1orqq9jToydssqZPE91y+qzGy1feDIuQPbOtgUC2RjSfoejse16ZNkXQZ8yt/5uX/uWAaUCNDADqj7926yjmZGb99Y1qGbPZrF+M+q9+4q3O3Q3ioGsLm/IFNxU7Nki+cN/7CtLJ8fPPXlnye31JAmHgNA==; Received: from uucp by iustitia.weinholt.se with local-bsmtp (Exim 4.72) (envelope-from ) id 1V9vVH-0006IT-0u; Thu, 15 Aug 2013 13:14:07 +0200 Received: from weinholt by industria with local (Exim 4.80) (envelope-from ) id 1V9v8F-0002Mo-TD; Thu, 15 Aug 2013 12:50:19 +0200 From: =?UTF-8?Q?G=C3=B6ran?= Weinholt References: <87txixqxsp.fsf@tines.lan> X-Hashcash: 1:20:130815:a.rottmann@gmx.at::YZoXW/j3MNC/biC+:000000000000000000000000000000000000000000000LU0 X-Hashcash: 1:20:130815:guile-devel@gnu.org::K8ntK2LWEWDgDyUm:0000000000000000000000000000000000000000001RDX X-Hashcash: 1:20:130815:mhw@netris.org::8TOKrrclAYchHh/d:0008GBA X-Hashcash: 1:20:130815:14922@debbugs.gnu.org::SqpqAUg/DXdhE566:00000000000000000000000000000000000000008eio Date: Thu, 15 Aug 2013 12:50:09 +0200 In-Reply-To: <87txixqxsp.fsf@tines.lan> (Mark H. Weaver's message of "Sat, 10 Aug 2013 13:07:50 -0400") Message-ID: <87pptf8bz2.fsf@industria.weinholt.se> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.4 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -2.8 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.8 (--) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Mark H Weaver writes: > Hello all, > > I've cooked up a patch to help improve R6RS exception handling in Guile. > > As noted by G=C3=B6ran Weinholt in , the R6RS > exception handlers in Guile are currently unable to catch native Guile > exceptions. To fix this, the basic approach of this patch is to convert > native Guile exceptions into R6RS conditions within the R6RS exception > handlers. [...] > I'd be grateful for any feedback. I think it's the right approach to take. I've tested the patch a little and it's an improvement over the current state of affairs. Regards, =2D-=20 G=C3=B6ran Weinholt "What's worse than clowns? Danish clowns." -- Mystery Science Theatre 3000 --=-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBCgAGBQJSDLJhAAoJEOM+YaLpuMOifikQAIUlK2cGAyNLHlka5jxl/LZb eKEKjACxRM2A0eI644FLoOyntB2FTo7qogZzdiqR+kCW4j6pdhC/G0ElSPwk/7eL 1IbezuN81TjZKvDlPLcePuzJ/pUlTJsGWpzTmrJ+ujIoNIhM5hkz0DEy+HAQNQDu 0sJMQ8sWkqpli7kEmImNa+X9/6Bb5xuL4DEHIfFv2eSXcqbqiMMOAbzuySWBeLQZ 7LIAmw5o7ziqs83W4t8/ihqohrm6wEmm1iDCrGoB8BGefhDBoFICVv5JCHWsmqOL 865TS05GdRuGsveFe5nFrYt1llI53CZ99IZUxLi3lU8lS97eDk4KtfEurpxmwjsU nAIfIEKSIY0pkux5IVFdxlwIbyW7ZDMmBZBEEtgFJODO/So2cT53GBQ2Sx0esoDT j6LlFSHcHr2xnwPCfyL/WK/q+HhNpV7UZ3gGXn+05/ru3itQ3BZEaaGFN0nIMxEi KnwQE/p6F6fht735buORq5Y6o7PBsEDUy3M+YGAcmuceIFb9JEH81CfFv5e5YQX5 v5C0Wfx6ITaTFmQ9Jy6g3bD05rEsnDFt+VCKq4oa82QG/omCgzUVGkiuldpSztRu uU7egOmMK3x9SlQ/vNsk98Ge6STPIApVTp5JlFbGtIlXIowxhYqA9YA0E/R5UdQU OqG5uKT9CHRCuvc8itE0 =Q2OW -----END PGP SIGNATURE----- --=-=-=-- From unknown Mon Aug 18 11:32:49 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: =?UTF-8?Q?G=C3=B6ran?= Weinholt Subject: bug#14922: closed (Re: Improving R6RS exception handling in Guile) Message-ID: References: <87y54m5j51.fsf@netris.org> <87d2qcqn1c.fsf@industria.weinholt.se> X-Gnu-PR-Message: they-closed 14922 X-Gnu-PR-Package: guile Reply-To: 14922@debbugs.gnu.org Date: Mon, 18 Nov 2013 06:18:03 +0000 Content-Type: multipart/mixed; boundary="----------=_1384755483-17543-1" This is a multi-part message in MIME format... ------------=_1384755483-17543-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #14922: guard expression doesn't catch everything which was filed against the guile package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 14922@debbugs.gnu.org. --=20 14922: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D14922 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1384755483-17543-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 14922-done) by debbugs.gnu.org; 18 Nov 2013 06:17:32 +0000 Received: from localhost ([127.0.0.1]:59360 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ViI9L-0004Y8-OK for submit@debbugs.gnu.org; Mon, 18 Nov 2013 01:17:32 -0500 Received: from world.peace.net ([96.39.62.75]:47037 ident=hope2) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ViI9I-0004Xu-0Q for 14922-done@debbugs.gnu.org; Mon, 18 Nov 2013 01:17:28 -0500 Received: from 209-6-91-212.c3-0.smr-ubr1.sbo-smr.ma.cable.rcn.com ([209.6.91.212] helo=yeeloong) by world.peace.net with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1ViI9B-0005Ic-2q; Mon, 18 Nov 2013 01:17:21 -0500 From: Mark H Weaver To: =?utf-8?Q?G=C3=B6ran?= Weinholt Subject: Re: Improving R6RS exception handling in Guile References: <87txixqxsp.fsf@tines.lan> <87pptf8bz2.fsf@industria.weinholt.se> Date: Mon, 18 Nov 2013 01:16:58 -0500 In-Reply-To: <87pptf8bz2.fsf@industria.weinholt.se> (=?utf-8?Q?=22G=C3=B6r?= =?utf-8?Q?an?= Weinholt"'s message of "Thu, 15 Aug 2013 12:50:09 +0200") Message-ID: <87y54m5j51.fsf@netris.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 14922-done Cc: 14922-done@debbugs.gnu.org, guile-devel@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Sorry for the long delay on this. G=C3=B6ran Weinholt writes: > Mark H Weaver writes: > >> Hello all, >> >> I've cooked up a patch to help improve R6RS exception handling in Guile. >> >> As noted by G=C3=B6ran Weinholt in , the R6RS >> exception handlers in Guile are currently unable to catch native Guile >> exceptions. To fix this, the basic approach of this patch is to convert >> native Guile exceptions into R6RS conditions within the R6RS exception >> handlers. > [...] >> I'd be grateful for any feedback. > > I think it's the right approach to take. I've tested the patch a little > and it's an improvement over the current state of affairs. I went ahead and pushed this patch to stable-2.0. We can work on incrementally improving it from there. I'm closing this bug . Thanks! Mark ------------=_1384755483-17543-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 21 Jul 2013 09:29:47 +0000 Received: from localhost ([127.0.0.1]:40632 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V0pxa-00070d-RN for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:47 -0400 Received: from eggs.gnu.org ([208.118.235.92]:56308) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V0pxX-000707-Iy for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V0pxR-0001Qg-Ag for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:38 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-99.2 required=5.0 tests=BAYES_50,T_DKIM_INVALID, USER_IN_WHITELIST autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:60659) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0pxR-0001Qc-72 for submit@debbugs.gnu.org; Sun, 21 Jul 2013 05:29:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58029) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0pxQ-0000V1-4G for bug-guile@gnu.org; Sun, 21 Jul 2013 05:29:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V0pxO-0001Q2-OL for bug-guile@gnu.org; Sun, 21 Jul 2013 05:29:36 -0400 Received: from iustitia.weinholt.se ([2a02:28f0:0:a::7dce:e5a8]:52913) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0pxO-0001P1-DK for bug-guile@gnu.org; Sun, 21 Jul 2013 05:29:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=weinholt.se; s=iustitia2012; h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From; bh=uaQbBABNOUIFhpCNDYCxaGl3AjyZJhq5n+hkm55Jl4I=; b=jnDTGSlUTALiKbluC52njNOz2H+CM2hCj7c/fZE9DWQSqaLZWmfJVAmPswp4bBhNRE+PXV63KFta+wpVOMy8p3K37EMhGoEzTdOR4NC6Nm5yCHClh6yKdmraYXhXWDDLd+r4xGYxRGvoCHx0cb11lhe4fR+zuEz18wtYAxWx48qi3JC47VNpjaz5cFM4V2aEiXl5yPa+JDol2Wxi42Y3dfVO8OdTJSk8ok0Fhrr193gdNq2JbSmgT3JckNauLSeDlMrb2VgL6VcQipBc7h8Rpsz7HAo5/K19+N6SMn5eoCVZmaw4XVpzQwE4zYd3kBFvANu0MjQqJuqkKf/FCOFJow==; Received: from uucp by iustitia.weinholt.se with local-bsmtp (Exim 4.72) (envelope-from ) id 1V0pxG-0004ey-R1; Sun, 21 Jul 2013 11:29:26 +0200 Received: from weinholt by industria with local (Exim 4.80) (envelope-from ) id 1V0pwz-0001gv-E4; Sun, 21 Jul 2013 11:29:09 +0200 X-Hashcash: 1:20:130721:bug-guile@gnu.org::wwz3cVu0cY8t/3qs:000000000000000000000000000000000000000000001jQr From: =?utf-8?Q?G=C3=B6ran?= Weinholt To: bug-guile@gnu.org Subject: guard expression doesn't catch everything Date: Sun, 21 Jul 2013 11:29:03 +0200 Message-ID: <87d2qcqn1c.fsf@industria.weinholt.se> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.4 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -3.3 (---) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello schemers, the guard expression from (rnrs) would be a lot more useful if it managed to catch all exceptions. As it is now, some errors will bypass the guard: scheme@(guile-user)> (import (rnrs)) scheme@(guile-user)> (guard (exn (else #f)) (fx+ #f #f)) $1 =3D #f scheme@(guile-user)> (guard (exn (else #f)) (fx+)) ;;; :3:0: warning: possibly wrong number of arguments to `fx+' rnrs/arithmetic/fixnums.scm:153:2: In procedure fx+: rnrs/arithmetic/fixnums.scm:153:2: Wrong number of arguments to # The background is that I'm working on a program that intentionally calls procedures with bad arguments, and it needs to determine if the procedure accepted the arguments or not. Ideally the object raised would be a proper and correct R6RS condition object, but I suspect that most of the existing Guile code doesn't raise conditions like that. I think it would be a step forward if guard at least caught the exception, even if the condition object might not be very useful. Tested with Guile 2.0.9.40-824b-dirty. Regards, =2D-=20 G=C3=B6ran Weinholt "Bring me back // to a story left untold // so we can write the ending." -- Aly & Fila feat. Jwaydan - We Control The Sunlight --=-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBCgAGBQJR66nfAAoJEOM+YaLpuMOiVJUP/imwUxAO3TP5hxhjWgB2+Ge0 OpxRVBkh9ipLuFwzWZ006rROSg9eqNtGlVGuLf+s75p8ynQYY319ON04eTb8p4Fy ofODi9FHmQ7yOebjMvhBDedDEpzmGdbF7EcXRvTuqOvLa1i6kaWZpRmtNuzVBBA3 OZFp/MW//sKnUNlmsSHLBUIuJm6Kv3351aeYHNkDdi1A6q2Humj8HkvB82fmCDbO wdVziZdCXLzFo9/C9msuQPHTG/t3ukFYSbSmuNrr8BmN8G66owcRblHHzPgn5MLZ vph8UgBhQ6Y1ufZb8qQTE7Z0KoCHMTs+UwwJePWb9ySiidoDhPXJH4IduyJKM0Xv XmHfUInS8BKL9n44jIJMtI77dYHR3piZNez4N3sRkwWIQePTl+558XkCGkUYaMoj mBNx4xySIZ5FTn4H9aMZak6EjHAKBvEk1PiaEH0SR0CqxlCUGJitGjhmh5dMrL4H 9j61Aw9MAtEnJw5wAjOYRp/QuvS3TC28ziDjNDWO1ggTMmMo8Owst54kgQWc0tus L7m2dYnoaB/w/FlgCMYbYAx4agiWpO+4l/84d5MaXGnLaGEzRU0Uywp3kmD4YM3S f/BpNXLRboU534YxXNnNDd+I7RScsgcXFkcfl/ZaxpqFsKbG5vAmhRCb+us4ykPq Pg/9aIKApg9Y9ADfK7yS =vAKc -----END PGP SIGNATURE----- --=-=-=-- ------------=_1384755483-17543-1--