On Sat, May 27, 2017 at 03:34:54PM +1200, Evan Hanson wrote:
> Yeah, let's leave it at that. It's easy enough to convert property lists
> to something else as needed. I'm also not too worried about breaking
> changes here, so I've applied your patch as-is and updated the
> `condition->list` procedure to use the same plist representation.

I just noticed that you forgot to update its type in types.db.
The old type was

(chicken.condition#condition->list (#(procedure #:clean #:enforce)
 chicken.condition#condition->list
 ((struct condition))
 (list-of (pair symbol *))))

The (list-of (pair symbol *)) result type is wrong in two ways:
- the list structure has changed from "alist" to "plist", as we discussed
- exception "kind"s are not necessarily symbols

The new type therefore is:

(chicken.condition#condition->list (#(procedure #:clean #:enforce)
 chicken.condition#condition->list
 ((struct condition))
 (list-of pair)))

I chose (list-of pair) instead of just "list", because we know the
kind is always at the head of the "plist", so it's never null.

Given my observation that we incorrectly use "symbol" as the type
of kinds and properties, I went ahead and changed the other types
as well, by changing "symbol" to "*".  The patch is also for master,
given that it's so simple and the situation applies there as well.
In master, the return type of condition->list is also simply
(list-of pair), because only the structure of the cdr of these
pairs differs between master and chicken-5 (and that can be null).

Cheers,
Peter
From 033a2550a582e119095224a62e42373db2d73b64 Mon Sep 17 00:00:00 2001
From: Peter Bex <pe...@more-magic.net>
Date: Sat, 27 May 2017 15:56:29 +0200
Subject: [PATCH] Improve type declarations for condition-manipulation
 procedures

Condition kinds and properties do not have to be symbols: they can be
any type of object.  The only constraint according to SRFI-12 is that
they must be comparable using eqv?, so all type declarations that
assume they're symbols are wrong, strictly speaking.
---
 types.db | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/types.db b/types.db
index 3f38974..004d531 100644
--- a/types.db
+++ b/types.db
@@ -950,9 +950,9 @@
 (chicken.condition#abort (procedure chicken.condition#abort (*) noreturn))
 (chicken.condition#condition (#(procedure #:clean #:enforce) chicken.condition#condition (list #!rest list) (struct condition)))
 (chicken.condition#condition? (#(procedure #:pure #:predicate (struct condition)) chicken.condition#condition? (*) boolean))
-(chicken.condition#condition->list (#(procedure #:clean #:enforce) chicken.condition#condition->list ((struct condition)) (list-of (pair symbol *))))
-(chicken.condition#condition-predicate (#(procedure #:clean #:enforce) chicken.condition#condition-predicate (symbol) (procedure ((struct condition)) boolean)))
-(chicken.condition#condition-property-accessor (#(procedure #:clean #:enforce) chicken.condition#condition-property-accessor (symbol symbol #!optional *) (procedure ((struct condition)) *)))
+(chicken.condition#condition->list (#(procedure #:clean #:enforce) chicken.condition#condition->list ((struct condition)) (list-of pair)))
+(chicken.condition#condition-predicate (#(procedure #:clean #:enforce) chicken.condition#condition-predicate (*) (procedure ((struct condition)) boolean)))
+(chicken.condition#condition-property-accessor (#(procedure #:clean #:enforce) chicken.condition#condition-property-accessor (* * #!optional *) (procedure ((struct condition)) *)))
 
 (chicken.condition#current-exception-handler
  (#(procedure #:clean #:enforce) chicken.condition#current-exception-handler (#!optional (procedure (*) noreturn) boolean boolean) procedure)
@@ -961,9 +961,9 @@
 		  #(tmp1))))
  (() ##sys#current-exception-handler))
 (chicken.condition#get-call-chain (#(procedure #:clean #:enforce) chicken.condition#get-call-chain (#!optional fixnum (struct thread)) (list-of vector)))
-(chicken.condition#get-condition-property (#(procedure #:clean #:enforce) chicken.condition#get-condition-property ((struct condition) symbol symbol #!optional *) *))
+(chicken.condition#get-condition-property (#(procedure #:clean #:enforce) chicken.condition#get-condition-property ((struct condition) * * #!optional *) *))
 (chicken.condition#make-composite-condition (#(procedure #:clean #:enforce) chicken.condition#make-composite-condition (#!rest (struct condition)) (struct condition)))
-(chicken.condition#make-property-condition (#(procedure #:clean #:enforce) chicken.condition#make-property-condition (symbol #!rest *) (struct condition)))
+(chicken.condition#make-property-condition (#(procedure #:clean #:enforce) chicken.condition#make-property-condition (* #!rest *) (struct condition)))
 (chicken.condition#with-exception-handler (#(procedure #:enforce) chicken.condition#with-exception-handler ((procedure (*) . *) (procedure () . *)) . *))
 (chicken.condition#signal (procedure chicken.condition#signal (*) . *))
 
-- 
2.1.4

From 08ac60f3f58d15353adca6e9ce27e5374bb15626 Mon Sep 17 00:00:00 2001
From: Peter Bex <pe...@more-magic.net>
Date: Sat, 27 May 2017 15:59:51 +0200
Subject: [PATCH] Improve type declarations for condition-manipulation
 procedures

Condition kinds and properties do not have to be symbols: they can be
any type of object.  The only constraint according to SRFI-12 is that
they must be comparable using eqv?, so all type declarations that
assume they're symbols are wrong, strictly speaking.
---
 types.db | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/types.db b/types.db
index cc080fa..d142e64 100644
--- a/types.db
+++ b/types.db
@@ -774,12 +774,12 @@
 (chicken-home (#(procedure #:clean) chicken-home () string))
 (chicken-version (#(procedure #:pure) chicken-version (#!optional *) string))
 (command-line-arguments (#(procedure #:clean) command-line-arguments (#!optional (list-of string)) (list-of string)))
-(condition-predicate (#(procedure #:clean #:enforce) condition-predicate (symbol) (procedure ((struct condition)) boolean)))
-(condition-property-accessor (#(procedure #:clean #:enforce) condition-property-accessor (symbol symbol #!optional *) (procedure ((struct condition)) *)))
+(condition-predicate (#(procedure #:clean #:enforce) condition-predicate (*) (procedure ((struct condition)) boolean)))
+(condition-property-accessor (#(procedure #:clean #:enforce) condition-property-accessor (* * #!optional *) (procedure ((struct condition)) *)))
 
 (condition? (#(procedure #:pure #:predicate (struct condition)) condition? (*) boolean))
 
-(condition->list (#(procedure #:clean #:enforce) condition->list ((struct condition)) (list-of (pair symbol *))))
+(condition->list (#(procedure #:clean #:enforce) condition->list ((struct condition)) (list-of pair)))
 (continuation-capture (#(procedure #:enforce) continuation-capture ((procedure ((struct continuation)) . *)) *))
 (continuation-graft (#(procedure #:clean #:enforce) continuation-graft ((struct continuation) (procedure () . *)) *))
 (continuation-return (#(procedure #:enforce) continuation-return ((struct continuation) #!rest) . *)) ;XXX make return type more specific?
@@ -984,7 +984,7 @@
      ((symbol symbol *) (##core#inline "C_i_getprop" #(1) #(2) #(3))))
 
 (get-call-chain (#(procedure #:clean #:enforce) get-call-chain (#!optional fixnum (struct thread)) (list-of vector)))
-(get-condition-property (#(procedure #:clean #:enforce) get-condition-property ((struct condition) symbol symbol #!optional *) *))
+(get-condition-property (#(procedure #:clean #:enforce) get-condition-property ((struct condition) * * #!optional *) *))
 (get-environment-variable (#(procedure #:clean #:enforce) get-environment-variable (string) *))
 (get-keyword (#(procedure #:clean #:enforce) get-keyword (symbol list #!optional *) *))
 (get-output-string (#(procedure #:clean #:enforce) get-output-string (output-port) string))
@@ -1019,7 +1019,7 @@
 
 (make-composite-condition (#(procedure #:clean #:enforce) make-composite-condition (#!rest (struct condition)) (struct condition)))
 (make-parameter (#(procedure #:clean #:enforce) make-parameter (* #!optional procedure) procedure))
-(make-property-condition (#(procedure #:clean #:enforce) make-property-condition (symbol #!rest *) (struct condition)))
+(make-property-condition (#(procedure #:clean #:enforce) make-property-condition (* #!rest *) (struct condition)))
 (maximum-flonum float)
 (memory-statistics (#(procedure #:clean) memory-statistics () (vector-of fixnum)))
 (minimum-flonum float)
-- 
2.1.4

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Chicken-hackers mailing list
Chicken-hackers@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-hackers

Reply via email to