Re: Parsec parser library...
"David McClain (as dbm at refined-audiometrics dot com)" <[email protected]> Mon, 27 Jul 2026 08:29:58 -0700
| Newsgroups | gmane.lisp.lispworks.general |
|---|---|
| Message-ID | <[email protected]> |
And so.. .with TLET, we can now make Parseq thread-safe by changing just one line from using a LOL LET, to using a LOL TLET. > On Jul 27, 2026, at 08:28, David McClain <[email protected]> wrote: > > Looks like you are similar to mine: Keeping it looking like a LOL, although I do it with TLET, instead of the arg. > > I use a SYMBOL-MACROLET to keep the syntax looking like a lexical binding in use. > > THe one thing I ran into immediately was that you have to be sure that SMP is actually running, in order to use MP:PROCESS-PRIVATE-PROPERTY. I now look for that exceptional case, and resort to a LOL holding hash table, if needed. I apparently did need it for my number parsing while loading up my normal working image. > > > >> On Jul 27, 2026, at 07:24, Tim Bradshaw (as tfb at tfeb dot org) <[email protected]> wrote: >> >> On 27 Jul 2026, at 06:45, David McClain (as dbm at refined-audiometrics dot com) <[email protected]> wrote: >>> >>> So we need some kind of thread-local version of Let-Over-Lambda. >> >> For things like this I tend to use some variant of >> >> (defun make-tval (&optional (default nil)) >> (let ((table (make-hash-table :weak-kind :key))) >> (lambda (thread &optional (nv nil nvp)) >> (if nvp >> (setf (gethash thread table) nv) >> (gethash thread table default))))) >> >> (declaim (inline tval-value (setf tval-value))) >> >> (defun tval-value (tval &optional (thread *current-process*)) >> (funcall tval thread)) >> >> (defun (setf tval-value) (new tval &optional (thread *current-process*)) >> (funcall tval thread new)) >> >> Assuming hash-table access is thread-safe this is OK I think. And then you do something like. >> >> (let ((something (make-tval <default>))) >> (lambda (...) >> ... (tval-value something) ... (setf (tval-value something) ...) ...)) >> >> I like it that the solution is itself let over lambda. >> >> >> _______________________________________________ >> Lisp Hug - the mailing list for LispWorks users >> [email protected] >> http://www.lispworks.com/support/lisp-hug.html > _______________________________________________ Lisp Hug - the mailing list for LispWorks users [email protected] http://www.lispworks.com/support/lisp-hug.html