From 25efc68b17ddc50c1c9da6bd6472cc2502c10308 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Tue, 5 Mar 2019 14:36:14 -0500 Subject: [PATCH] Make `sql-null` a transparent struct. This allows it to cooperate better with Typed Racket, particularly regarding the `Any` type. The guard and use of `#:authentic` also check that it's still a singleton in all cases. --- .../collects/db/private/generic/sql-data.rkt | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/racket/collects/db/private/generic/sql-data.rkt b/racket/collects/db/private/generic/sql-data.rkt index 54deac771f..f54093caa5 100644 --- a/racket/collects/db/private/generic/sql-data.rkt +++ b/racket/collects/db/private/generic/sql-data.rkt @@ -11,15 +11,23 @@ ;; NULL (define-values (sql-null sql-null?) - (let () + (let ([created? #false]) (struct sql-null () - ;; must deserialize to singleton, so can't just use serializable-struct - #:property prop:serializable - (make-serialize-info (lambda _ '#()) - #'deserialize-info:sql-null-v0 - #f - (or (current-load-relative-directory) - (current-directory)))) + #:transparent + #:authentic + #:guard (lambda (n) + (when created? + (error 'sql-null "cannot create new instances of sql-null")) + (set! created? #true) + (values)) + #:property prop:custom-write (lambda (v p w?) (write-string "#" p)) + ;; must deserialize to singleton, so can't just use serializable-struct + #:property prop:serializable + (make-serialize-info (lambda _ '#()) + #'deserialize-info:sql-null-v0 + #f + (or (current-load-relative-directory) + (current-directory)))) (values (sql-null) sql-null?))) (define (sql-null->false x)