[plt-dev] `unsafe-fl' and unboxing
> ;;; (real->float x) -> inexact-real?
> ;;; x : real?
> ;;; Returns an inexact real (i.e., a float) given real x. Raises an
> error if x
> ;;; is not a real. This can be used to ensure a real value is a
> float, even in
> ;;; unsafe code.
> (define (real->float x)
> (if (real? x)
> (exact->inexact x)
> (error "expected real, given" x)))
>
> I'll use it to protect unsafe code. I'm sure it's more overhead than
> putting it in-line, but hopefully not too much. Putting a contract
> on it would probably not make much sense.
I feel a little dirty suggesting it, but you could also do:
(define-syntax-rule (real->float exp)
(let ([x exp])
(if (real? x)
(exact->inexact x)
(error "expected real, given" x))))
I'm not sure whether the mzscheme compiler obeys the Macro Writer's
Bill of Rights in optimizing the case where exp is just a variable
reference. If not, you could do the optimization yourself:
(define-syntax (real->float stx)
(syntax-case stx ()
[(_ x)
(identifier? #'x)
#'(if (real? x)
(exact->inexact x)
(error "expected real, given" x))]
[(_ exp)
#'(let ([x exp])
(real->float x))]))
Dave