One problem I had with the development of rcd-template package to
interpolate snippets in the text is that I could not use the function
with lexical-binding true in the package.
But what I could do, is to isolate the function into a separate
package that uses global bindings.
Then if I wish to invoke the `rcd-template' function from other
functions with lexical-binding T, then I had to do 2 things:
- prefix the global variables, in this case I have prefixed it with
`::' separator, like `wrs::page' as that would appear in the
template where snippets like ⟦ (gethash "areas_name" wrs::area) ⟧
would then work. As if I don't prefix it, the chances to collide
with some other variables are there.
- I have to use `dlet' in those packages with lexical-binding T, as to
call `eval' function indirectly, that one from outside package
without lexical-binding T.
(defun wrs-generate-page (page-id)
(dlet ((wrs::page (rcd-db-table-id-hash "pages" page-id cf-db))
(wrs::area (rcd-db-table-id-hash "areas" (gethash "pages_area" wrs::page) cf-db))
(wrs::type (or (gethash "pages_pagetype" wrs::page) (gethash "areas_pagetype" wrs::area)))
IMHO, GNU Hyperbole could switch to lexical-binding T by using that
- isolate the `eval' functions in separate outside package, without
- use `dlet' when necessary to pass some information to indirectly
P.S. This may be presentation of a problem without a problem.
The work to convert Hyperbole code to use lexical binding has begun recently and Stefan, with all his experience, is leading that. It might have to wait for the next release after V8.0.0 though.