dure with the same arity as PROC that returns the `not'
of PROC's result."
  (lambda args
    (not (apply proc args))))

(define (const value)
  "Return a procedure that accepts any number of arguments and returns
VALUE."
  (lambda _
    value))

(define (and=> value procedure)
  "When VALUE is #f, return #f.  Otherwise, return (PROC VALUE)."
  (and value (procedure value)))

(define call/cc call-with-current-continuation)

(define-syntax false-if-exception
  (syntax-rules ()
    ((false-if-exception expr)
     (catch #t
       (lambda () expr)
       (lambda args #f)))
    ((false-if-exception expr #:warning template arg ...)
     (catch #t
       (lambda () expr)
       (lambda (key . args)
         (for-each (lambda (s)
                     (if (not (string-null? s))
                         (format (current-warning-port) ";;; ~a\n" s)))
                   (string-split
                    (call-with-output-string
                     (lambda (port)
                       (format port template arg ...)
                       (print-exception port #f key args)))
                    #\newline))
         #f)))))

