docs(developer-guide): correct the LIBREF/DS macro-scope note
The post-edit hook section claimed a `%let` "creates a new variable in the hook's own scope and is silently discarded" while `call symputx` updates the existing one. That is not how SAS resolves it: LIBREF and DS already exist in an enclosing symbol table (mpe_loader's local table), and a macro only gets a new local when the name is absent from every enclosing table, so both forms assign to the same variable. Reworded to state that, and to keep the practical advice (call symputx is explicit and does not depend on the enclosing scope still holding the name). Raised in review of #16.
This commit is contained in:
1 parent
8ed0f16004
commit
8a22e28a46
1 file changed
+2
-2
@@ -102,9 +102,9 @@ From that moment the changeset is an approval against `ORDERS.ORDERS`. The appro
|
||||
|
||||

|
||||
|
||||
### The detail that will bite you
|
||||
### Reassigning LIBREF and DS
|
||||
|
||||
Use `call symputx`, not `%let`. `LIBREF` and `DS` are not declared `%local` in `mpe_loader`, and the hook is included into that scope - so `call symputx` finds the existing variable and updates it, while a `%let` creates a new variable in the hook's own scope and is silently discarded. The hook runs, the log looks clean, and the changeset goes to the mirror anyway.
|
||||
`LIBREF` and `DS` are ordinary macro variables inside `mpe_loader`, which creates them with `%let` and then updates them from the staged row. A `%let libref=ORDERS;` reassigns them just as well as the `call symputx` above: both statements assign to the *existing* variable, because it lives in an enclosing symbol table (`mpe_loader`'s local table) and SAS only creates a new local when the name is absent from every enclosing table. `call symputx` is used above because it is explicit about which variable is being set, and because it does not depend on the enclosing scope still holding the name - a wrapper macro that declared `%local libref` would turn a bare `%let` into an assignment to that shadow instead.
|
||||
|
||||
### Other things to watch
|
||||
|
||||
|
||||
Reference in new issue
Block a user