# Today's Qi meeting notes

**URL:** <https://racket.discourse.group/t/todays-qi-meeting-notes/2323>\
**Category:** General\
**Tags:** event, qi\
**Created:** [September 17, 2023, 5:25pm UTC](https://racket.discourse.group/t/todays-qi-meeting-notes/2323 "2023-09-17T17:25:43Z")\
**Posts on this page:** 1\
**Showing post:** 57

<div class="post-metadata">

**Author:** ![benknoble](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/benknoble/32/16_2.png) [@benknoble](https://racket.discourse.group/u/benknoble)\
**Post date:** [December 13, 2024, 2:59pm UTC](https://racket.discourse.group/t/todays-qi-meeting-notes/2323/57 "2024-12-13T14:59:43Z")

</div>

RE: bindings

I think one question that still isn't answered to me is how a macro like this would work in a world without `define-syntax` and with `for-lang`:

```scheme
(define (f x) x)

(define-syntax m
  (syntax-parser
    [(_ y) #'(f y)]))

```

(Both intentionally kept simple.)

If `f` can't be defined in the same module as `m`, it has to be "public" in some other module\[1\]. But worse, it means the module declaring `m` has to `require` the module declaring `f`… for what? Not `for-lang`: we don't intend to make `f` a macro. But not normally, either: we don't intend to call `f` in this module.\[2\]

And we probably don't intend to burden clients of the module defining `m` with the demand that they also require a module defining `f` despite never invoking `f` in the source text! (Worse, would this burden mean we're back to the days of "a macro's meaning after expansion depends on the runtime environment where it was expanded"?)

The ability to make the above example work as intended is one of the properties of macro hygiene as I see it: I as macro-author control what bindings I expand to in a predictable way that can't be subverted by my clients without going through my established protocol (if any).

But this is a bit of a tangent anyway 😅

* * *

1. It could be one that has a module path including `private`, our little convention for "don't poke around in here if you like stability," but that doesn't resolve other concerns. 

2. In the existing system, you _can_ require `f` from another module (_sans_ phase-shifting) and then expand to a use of it, so it's not that there's a problem doing this—it's more about the ability to do something else (like keep `f` private to anyone except `require/expose`). I think there are some subtleties for _negative_ phase shifts depending on how the macro is intended to be used which can get ugly, though.

---

_[View the full topic](https://racket.discourse.group/t/todays-qi-meeting-notes/2323)._
