# Coerce #f and pointer in typed racket

**URL:** <https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580>\
**Category:** Questions & Answers\
**Tags:** typed-racket\
**Created:** [December 8, 2023, 4:02pm UTC](https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580 "2023-12-08T16:02:28Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mode89](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/mode89/32/1582_2.png) [@mode89](https://racket.discourse.group/u/mode89)\
**Post date:** [December 8, 2023, 4:02pm UTC](https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580/1 "2023-12-08T16:02:28Z")

</div>

There is a function [`glfwCreateWindow`](https://github.com/kstrafe/rkt-glfw/blob/e52613f60f25aeac7f035b1f11a79401a770af35/main.rkt#L307). The last two arguments of this function are of type [`_pointer`](https://docs.racket-lang.org/foreign/Pointer_Types.html#%28def._%28%28quote._~23~25foreign%29.__pointer%29%29). How to properly import and annotate this function in `typed/racket`?

Here is what I'm doing right now:

```scheme
(require/typed ffi/unsafe
  [#:opaque Pointer cpointer?])

(require/typed glfw3
  [glfwCreateWindow (-> Integer Integer String Pointer Pointer Pointer)])

(glfwCreateWindow 640 480 "My Window" #f #f)

```

But the type checker gives an error telling that it expects `Pointer` but given `False`. Even though `(cpointer? #f)` is true.

---

<div class="post-metadata">

**Author:** ![shhyou](https://avatars.discourse-cdn.com/v4/letter/s/ccd318/32.png) [@shhyou](https://racket.discourse.group/u/shhyou)\
**Post date:** [December 8, 2023, 5:11pm UTC](https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580/2 "2023-12-08T17:11:53Z")

</div>

From my limited understanding of Typed Racket, you need to give it a chance to check whether `(cpointer? #f)` is true. So maybe something like

```racket
Welcome to DrRacket, version 8.11.1.4 [cs].
Language: typed/racket, with debugging [custom]; memory limit: 256 MB.
> (require/typed racket/bool
    [false Pointer])
> false
- : Pointer
#f

```

or

```racket
> (cast #f Pointer)
- : Pointer
#f

```

---

<div class="post-metadata">

**Author:** ![samth](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/samth/32/3_2.png) [@samth](https://racket.discourse.group/u/samth)\
**Post date:** [December 8, 2023, 5:46pm UTC](https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580/3 "2023-12-08T17:46:56Z")

</div>

What an `#:opaque` type means is that the only ways to construct it are to import it or to test a value with the specified predicate. So you can do something like this:

```scheme
(glfwCreateWindow 640 480 "My Window" (assert #f cpointer?) (assert #f cpointer?))

```

Or you can change the type of glfwCreateWindow to explicitly include `#f`:

```scheme
(require/typed glfw3
  [glfwCreateWindow (-> Integer Integer String (U Pointer #f) (U Pointer #f) Pointer)])

```

---

<div class="post-metadata">

**Author:** ![mode89](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/mode89/32/1582_2.png) [@mode89](https://racket.discourse.group/u/mode89)\
**Post date:** [December 10, 2023, 2:39am UTC](https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580/4 "2023-12-10T02:39:16Z")

</div>

Thank you guys for quick response 🙂

All of three suggestions fixed compilation, but there is still a run-time warning:

```plaintext
cpointer?: contract violation
  any-wrap/c: Unable to protect opaque value passed as `Any`
  value: #<cpointer>
  This warning will become an error in a future release.
  in: the 1st argument of
      a part of the or/c of
      (or/c
       struct-predicate-procedure?/c
       (-> Any boolean?))
  contract from: (interface for cpointer?)

```

caused by

```scheme
(require/typed ffi/unsafe
  [#:opaque Pointer cpointer?])

```

---

<div class="post-metadata">

**Author:** ![mode89](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/mode89/32/1582_2.png) [@mode89](https://racket.discourse.group/u/mode89)\
**Post date:** [December 10, 2023, 3:19am UTC](https://racket.discourse.group/t/coerce-f-and-pointer-in-typed-racket/2580/5 "2023-12-10T03:19:50Z")

</div>

[This](https://groups.google.com/g/racket-users/c/jtmVDFCGL28/m/a7yZZjwBBgAJ) and [this](https://github.com/racket/typed-racket/issues/456#issuecomment-260007903) gave me an idea of why I'm having this warning.

The final working version of my code is:

```scheme
(require typed/racket/unsafe)

(unsafe-require/typed ffi/unsafe
  [#:opaque Pointer cpointer?])

(require/typed glfw3
  [glfwCreateWindow (-> Integer Integer String Pointer Pointer Pointer)])

(glfwCreateWindow 640 480 "My Window" (assert #f cpointer?) (assert #f cpointer?))

```

Thank you all for helping 🙂
