Re: ASDF, readtables and with-operation

Gary King <[email protected]>
Newsgroups gmane.lisp.cclan.general
Message-ID <[email protected]>
Hi Richard,

Thanks for the thoughtful explanation and the code. I think that my  
readtable issues ended up being a "red herring" and I was definitely  
throwing thoughtless code at it in the hopes of making it just go  
away! <smile>

thanks again,

On Jan 17, 2007, at 3:26 PM, Richard M Kreuter wrote:

> The following message is a courtesy copy of an article
> that has been posted to gmane.lisp.cclan.general as well.
>
> Gary King <[email protected]> writes:
>
>> I'm working with code that plays some tricks on the readtable.
>> Occasionally, this causes compilation of other systems to fail
>> because the altered readtable generally mucks things up. At the risk
>> of violating "you aren't going to need it", here is a suggested
>> patch.
>
> Assuming you haven't hosed the readtable too badly, can't you say
>
> (let ((*readtable* (copy-readtable nil)))
>   (asdf:oos ... ...))
>
> ?
>
> If someone wants to use a non-standard readtable by default when
> operating on asdf systems, this proposal would prevent that.  (Support
> for doing strange things with the readtable is limited in most
> implementations, but I don't think that asdf ought to constrain things
> this way.)
>
> Additionally, note that OPERATE is /not/ invoked recursively to
> perform dependent operations on dependent systems.  So the
> START-OPERATION and STOP-OPERATION functions you propose will only get
> called for an operation/system pair when these are explicitly
> OPERATE'd on, but not when the operation is performed on the system as
> part because of operation or system dependencies.
>
> That said, there are a couple systems in the wild from which you can
> generalize a technique for simulating auxiliary methods to be run
> before and around whole systems (either for side-effects, or for
> bindings).  The recipe is to specialize the auxiliary method on the
> subclass of cl-source-file of which the system's files are instances,
> and to stash whatever information you need in the system itself.  (To
> make this the site-wide default, unforuntately, requires either
> editing all your .asds, editing asdf.lisp, or using a MOP to add
> superclasses to asdf's standard classes.)
>
> Here, I think, is one way to simulate rebinding the readtable around
> system compilation and loading.  It adds a readtable slot to system
> instances, and rebinds readtable to the system's readtable during
> compilation and loading of the system's files.  (I've not tested this
> code, but I've got similar code to rearrange the package namespace
> around operations):
>
> --
> (defpackage :not-asdf
>   (:use :cl :asdf))
>
> (in-package :not-asdf)
>
> (defclass readtable-rebinding-mixin () ())
>
> (defclass readtable-holder ()
>   ((readtable :initarg :readtable :accessor readtable-of)))
>
> (defun component-system (component)
>   (if (typep component 'system)
>       component
>       (component-system (component-parent component))))
>
> (defmethod perform :around ((op compile-op) (comp readtable- 
> rebinding-mixin))
>   (let* ((component-system (component-system comp))
>          (*readtable* (if (and (typep component-system 'readtable- 
> holder)
>                                (slot-boundp component-system  
> 'readtable))
>                           (readtable-of component-system)
>                           *readtable*)))
>     (call-next-method)))
>
> (defmethod perform :around ((op load-op) (comp readtable-rebinding- 
> mixin))
>   (let* ((component-system (component-system comp))
>          (*readtable* (if (and (typep component-system 'readtable- 
> aware-system)
>                                (slot-boundp component-system  
> 'readtable))
>                           (readtable-of component-system)
>                           *readtable*)))
>     (call-next-method)))
>
> ;; If you're not interested in redefining asdf:system and
> ;; asdf:cl-source-file but want this behavior to be the site-wide
> ;; default, compose all the extension classes you like into named
> ;; classes, and then change your systems' .asd file to use those
> ;; classes, e.g.,
>
> (defclass local-cl-source-file
>      (readtable-rebinding-mixin ... cl-source-file)
>   ())
>
> (defclass local-system (readtable-holder ... system)
>   ())
>
> (defsystem <system-name>
>   :class local-system
>   :default-component-class local-cl-source-file
>   ...)
> --
>
> Hope that helps,
> RmK

--
Gary Warren King, metabang.com
Cell: (413) 885 9127
Fax: (206) 338-4052
gwkkwg on Skype * garethsan on AIM





-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.