On Wed, Dec 30, 2009 at 7:18 AM, Peter Olsen pcolsen@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. 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.
In addition to what Erik said, if you need you own OR to be effective only in your package, you can use your-package:or instead of common-lisp:or to name your macro, for example:
(defpackage :my-package (:use :common-lisp) (:shadow #:or) (:export ...))
then, start your source files with
(in-package :my-package)
and in one of them put
(defmacro or ...) ;the symbol is my-package:or, not common-lisp:or
Of course, this way your macro will only get used by your own code (and code that imports the symbol OR from your package); it won't affect other libraries or the system itself, so it's not equivalent to Erik's advice. This solution has the advantage of being portable Common Lisp.
hth, Alessio