Trucler
This library defines a CLOS-based protocol to be used by Common Lisp
compilers for environment query and update. In addition, library authors
can use the trucler-native
interface to inspect native environments.
Trucler supports introspection for variables, functions, tags, blocks and
optimization policies.
Examples
Introspection at Macroexpansion Time
The following macro can be used to ensure the presence of a local symbol macro, and to see whether it has the expected expansion:
(eval-when (:compile-toplevel :load-toplevel :execute)
(defvar *client* (make-instance 'trucler-native:client)))
(defmacro assert-local-symbol-macro-description
(name &key (expansion nil expansion-p) &environment env)
(let ((description (trucler:describe-variable *client* env name)))
(check-type description trucler:local-symbol-macro-description)
(when expansion-p
(assert (equal expansion (trucler:expansion description))))
`(values)))
Introspection at Runtime
Trucler can also be used to inspect the runtime environment - here with an
example of querying the state of the variable *print-array*
.
(trucler:describe-variable
(make-instance 'trucler-native:client)
nil
'*print-array*)
; => #<trucler-native-sbcl::global-special-variable-description {100A7E5A23}>
Related Work
Trucler can be seen as a modern, extensible version of the protocol desicribed in section 8.5 of the second edition of Guy Steele’s book Common Lisp, the Language.