Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion destroying CLOS objects
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Erik Naggum  
View profile  
 More options Oct 11 2000, 3:00 am
Newsgroups: comp.lang.lisp
From: Erik Naggum <e...@naggum.net>
Date: 2000/10/11
Subject: Re: destroying CLOS objects
* Tunc Simsek <sim...@robotics.eecs.berkeley.edu>
| I have a question regarding CLOS objects created with make-instance.
| Is it possible in any way to 'destroy' such an object.  For example,
| to say (delete-instance ...) or such that would effectively make
| that object disappear in a meaningful way (for example, all
| references to that object will refer to nil)

  I'll assume that you're _not_ an idiot and that it is inappropriate
  to answer your question with "you don't need this because we have a
  garbage collector in Common Lisp" as if you didn't know that.

  The problem you allude to is that of tracking down all references.
  This can't be done, so forget it.  (If you think it can, you didn't
  consider the value of "all" carefully enough, unless you actually
  are the garbage collector, but that's not what you're asking about.)

  So we don't track down any references at all.  Instead, we make the
  perfectly valid references we already have around the system point
  to the same object, but make it a different kind of object.  You can
  do that with change-class.  Except you can't turn a CLOS object into
  a system object like nil, but if all you're interested in is junking
  a bunch of data that otherwise would hang around forever because
  there might be some dangling reference somewhere you didn't think
  of, create some very empty class, (defclass nothingness () ()), and
  change instances into that class.

  Then there's the extremely valuable slot-makunbound which makes any
  references to slots of CLOS instances signal an error (or call the
  handler, to be more precise, which generally signals an error) unles
  sit has been bound anew.  This guarantees that you won't have any
  rogue referents at all.  However, this requires that you destroy
  objects that are tied to particular slots.  I find that this is
  often the case, but your mileage may vary.

| A second question (a follow-up on an earlier post) is regarding
| side-effects.  I've decided to make a package (say :foo) that
| has interned only what I believe to be side-effect free functions.
| Is there someway that I can ensure a form in, say package :goo,
| to use only those functions:
|
| (let ((*package* (find-package 'foo)))
|    ... stuff ...
|     ))
|
| in stuff use of :: should not be allowed, for example.

  This requires access to internals, and is generally not simple to
  accomplish, because intern is such a basic function.  However, if
  you are a supported Allegro CL user and promise not to use Presto,
  you can take a look at src:code;package.cl and locate intern*, then
  remove the #+notyet, and compile that one function.  After this fix,
  you get results like these:

(13) cl-user
(handler-case (intern "foobarzot" :cl)
  (excl:package-locked-error ()
    (format *debug-io* "~&~s: no can do.~%" '(intern "foobarzot" :cl))))
(intern "foobarzot" :cl): no can do.
=> nil

  The macro excl::without-package-locks allows its body forms to make
  changes to locked packages.

#:Erik
--
  I agree with everything you say, but I would
  attack to death your right to say it.
                                -- Tom Stoppard


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.