[armedbear-devel] How do I release ABCL's "package-lock"?

Olsen, Peter C. Peter.Olsen at jhuapl.edu
Wed Dec 30 18:53:42 UTC 2009


Eric,

Thanks very much for your response.

We're going to try both this approach and that suggested by Alessio.  We
appear to have some "package problems" ---  about which I as yet no nothing
more.  (I'm much more of a Schemer than a Lisper, so packages are still
something of a challenge.)

Again, thanks for your help and for your examples, from which I'm learning a
lot.

Peter


On 2009-12-30 05:58 , "Erik Huelsmann" <ehuels at gmail.com> wrote:

Hi Peter,

On Wed, Dec 30, 2009 at 7:18 AM, Peter Olsen <pcolsen at gmail.com> wrote:
> I'm writing to ask how to redefine the "or" macro in ABCL.
> I'm working on a project and there's one package in which I need "or" to
> mean something else than its usual definition.  I've tried simply to
> redefine it, but it doesn't work.  I understand that the Common Lisp spec
> requires special provision for that to be done --- such as the package-lock
> construct in SBCL.

Well, actually, ABCL doesn't have package locks, so this should be
easier in ABCL. Your approach was going in the right direction,
however, you've hit a little snag which is in the way: OR is a special
operator and a macro. The special operator makes the interpreter
perform better because it prevents object allocations.

> How can I do that in ABCL?  I want to be able to do this within the code,
> for example, with in a "let" so that I can bound its scope.
> Can anyone point me in the right direction?  My first --- failed ---
> experiment is below.

My comments below.

> A way that doesn't work.
> slipstream:~ pcolsen$ abcl
> Armed Bear Common Lisp 0.17.0
> Java 1.5.0_20 Apple Inc.
> Java HotSpot(TM) Client VM
> Low-level initialization completed in 1.476 seconds.
> Startup completed in 4.363 seconds.
> Type ":help" for a list of available commands.
> CL-USER(1): (or nil t)
> T
> CL-USER(2): (defmacro or (x) (+ 1 x))  ; My very own new "or"
> OR

Here, OR is still both a special operator and a macro. The special
operator has precedence on evaluation. The actual macro function gets
stored in the symbol-plist. If you execute

  (setf (symbol-function 'or) (get 'or 'sys::macroexpand-macro))

before running the defmacro, you're done. However: note that if you
trigger any part of the interpreter or compiler depending on the
behaviour of OR, you're in trouble: it'll see the incorrect version of
OR if it's within the scope of the specific block.

Another solution could be to rename the OR in your code to something
else, but I guess you thought of that.

> CL-USER(3): (or 3) ; Result should be 4
> 3
> CL-USER(4): (or nil nil) ; My "or" should take only one argument.
> NIL
> CL-USER(5): (or nil t)
> T
> CL-USER(6):  ;;; Redefinition didn't work.

Hope that helps; it works on my system, at least.

Bye,

Erik.
-- 
Peter Olsen, P.E., Ae.E.
Registered Professional Engineer, Maryland License 12283
The Johns Hopkins University Applied Physics Laboratory
11100 Johns Hopkins Road, M/S 17-214
Laurel, Maryland, 20723
Baltimore: 443-778-2577; Washington DC 240-228-2577
-- 
Be parsimonious with unsolicited packets (RFC 1958)






More information about the armedbear-devel mailing list