[racket] macro for broken abstraction?

From: George Neuner (gneuner2 at comcast.net)
Date: Tue Dec 9 14:19:22 EST 2014

Hi Alexander,

Your solution is a little more in the functional style than what I did 
(below).  Compared to mine it changes the semantics from a stand-alone 
statement to an expression returning a value, but that really is not a 
significant difference.  I do like that it encapsulates the definition 
of the error return variable.

Thanks,
George


(define-syntax with-database-connection
   (syntax-rules ()
     ((with-database-connection conn err body ...)
      ; -- start template
      (let/ec fail-network
        (with-handlers [
                        (exn:fail:network?
                         (lambda (e)
                           (set! err "database connection error")
                           (fail-network)))
                       ]
          (let [
                (conn (connect-database))
                (sql-cmd #f)
               ]
            (let/ec fail-sql
              (with-handlers [
                              (exn:fail:sql?
                               (lambda (e)
                                 (let [(info (exn:fail:sql-info e))]
                                   (set! err (cdr (assoc 'message info)))
                                   (fail-sql))))
                             ]

                (call-with-transaction conn
                  (lambda ()

                    body ...

                    )
                  #:isolation 'repeatable-read)

                )
              (disconnect conn))
            )))
      ; -- end template
      )))





On 12/8/2014 9:12 PM, Alexander D. Knauth wrote:
> Sorry I missed this:
>
> On Dec 8, 2014, at 6:45 PM, George Neuner <gneuner2 at comcast.net 
> <mailto:gneuner2 at comcast.net>> wrote:
>
>> and code in the  <body> needs to reference “db"
>
> (define (boiler-plate/f f)
>   (define err-msg #f)
>   (let/ec fail-network
>     (with-handlers ([exn:fail:network?
>                      (lambda (e)
>                        (set! err-msg "database connection error")
>  (fail-network err-msg))])
>       (let ([db (connect-database)])
>         (define (thunk)
>           (f db))
>         (let/ec fail-sql
>           (with-handlers ([exn:fail:sql?
>                            (lambda (e)
>                              (let ([info (exn:fail:sql-info e)])
>  (set! err-msg (cdr (assoc 'message info)))
>  (fail-sql err-msg)))])
>             (call-with-transaction db thunk #:isolation 'repeatable-read))
>           (disconnect db)
>           err-msg)))))
>
> (define-syntax-rule (boiler-plate db body ...)
>   (boiler-plate/f (λ (db) body ...)))
>
> (let ()
>   (define err-msg
>     (boiler-plate
>      db
>      < body ... >
>      ))
>   ; err-msg needed here
>   err-msg
>   )
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20141209/4c8024dd/attachment.html>

Posted on the users mailing list.