<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Currently, async channels do not have contracts to check their contents. This is a problem for Typed Racket, and it prevents typed code from interacting with code that produces async channels.<div class=""><br class=""></div><div class="">I started looking into how to add contracts to the language, and it seems to use the chaperones/impersonator system, as I suspected. However, async channels obviously cannot be impersonated, so I needed to implement that as well.</div><div class=""><br class=""></div><div class="">I modified the async-channel struct to use generics to allow it to be impersonated or chaperoned, which I have exposed by implementing <font face="Courier" class="">chaperone-async-channel</font>. I then tried implementing <font face="Courier" class="">async-channel/c</font>. The internals of the contract system are a little beyond me, but I got a working solution by following the example of the box contracts.</div><div class=""><br class=""></div><div class="">My work thus far can be found here: <a href="https://github.com/lexi-lambda/racket/commit/84b9f3604891f3f2061fb28ed4800af8afa4751b" class="">https://github.com/lexi-lambda/racket/commit/84b9f3604891f3f2061fb28ed4800af8afa4751b</a></div><div class=""><br class=""></div><div class="">First of all, is this a correct approach? Have I done anything wrong, or should I have done anything differently? I didn’t find much documentation on the internals of either of these systems, so I mostly went about things as I found them.</div><div class=""><br class=""></div><div class="">Second, obviously, not everything is implemented here. Among the additional necessary changes are:</div><div class=""><br class=""></div><div class=""><ul class="MailOutline"><li class="">I need to implement support for impersonators and impersonator contracts (right now I’ve only bothered to do chaperones).</li><li class="">I need to implement <font face="Courier" class="">async-channel/c-first-order</font> and <font face="Courier" class="">async-channel/c-stronger</font>. I can probably figure out the latter, but I’m not even sure what the former is supposed to do.</li><li class="">I need to implement a <font face="Courier" class="">wrap-async-channel/c</font> macro for the export. I’m not sure how this works, either. From looking at <font face="Courier" class="">wrap-box/c</font>, it seems to add some syntax properties, but I’m not sure what they do or how they work.</li><li class="">Somehow, the blame information has to be correct. Is that what the wrap function does? Or do the async-channel functions need to be updated to assign blame?</li></ul><div class=""><br class=""></div></div><div class="">I’d really like to get this working, and I think I’m close, but I’m a little inexperienced. I’d appreciate any help, even if it’s just pointing me in the right direction.</div><div class=""><br class=""></div><div class="">Thanks!</div></body></html>