[Openmcl-devel] Defining objc classes causes the class name to be declared static

Ron Garret ron at flownet.com
Mon Oct 14 15:25:12 UTC 2013


I understand the design rationale.  Ironically, the reason I discovered this, and the reason it was a problem, is that I had my own code attempting to produce the exact same behavior, except that I was defining a symbol macro rather than using defglobal.  (You might want to consider that if you want to fix this in a backwards-compatible way.  If it's a symbol macro it's a little less obtrusive because you can still bind the symbol lexically.)

I have since decided that binding the naked class name is a Bad Idea [1], and my own code now defines a symbol macro that uses the old Dylan lexical convention of wrapping class names in <angle-brakcets>, so for me it's a moot point.

But if I may make a suggestion: in cases where a less-than-optimal design is being maintained for reasons of backward compatibility, one can make everyone happy by defining a parameter like *automatically-bind-objc-classes*.  That also makes it possible to gracefully deprecate that (mis)feature some day.

rg

----

[1] The reason it's a Bad Idea is that it masks the following error:

(def-objc-class foo ...)

(let ((foo ...)) (some-code-that-uses foo) (some-other-code-that-uses foo))

Now you decide you want to change "foo" to "baz" in the second line, but you miss an occurrence and end up with:

(let ((baz ...)) (some-code-that-uses baz) (some-other-code-that-uses foo))

Now instead of an undeclared free variable warning you get a very weird runtime error.

rg

On Oct 13, 2013, at 11:12 PM, Gary Byers wrote:

> It's intentional and it's been this way for many years.
> 
> It's similar enough to what ObjC does that you can translate
> 
> [someMessage classname]
> 
> into
> 
> (#/someMessage classname) ; instead of (#/someMessage (find-class 'classname))
> 
> If "classname" would also be a good variable/argument name (e.g., "view"),
> then declaring the symbol to be static effectively makes use of the same
> name as an argument or local variable awkward.
> 
> Whatever convenience the first point offers is obviously offset by the second.
> If I was sure that no code anywhere was taking advantage of that behavior I
> wouldn't be at all hesitant about changing it. but I'm not sure of that and
> I am hesitant.
> 
> On Sun, 13 Oct 2013, Ron Garret wrote:
> 
>> Is this a feature or a bug? My vote goes to bug, but it's a damned peculiar bug:
>> 
>> Welcome to Clozure Common Lisp Version 1.10-dev-r15900M-trunk  (DarwinX8664)!
>> ? (defclass foo2 (ns:ns-object) () (:metaclass ns:+ns-object))
>> #<OBJC:OBJC-CLASS FOO2 (#x20D42FA0)>
>> ? foo2
>> #<OBJC:OBJC-CLASS FOO2 (#x20D42FA0)>
>> 
>> rg
>> 
>> _______________________________________________
>> Openmcl-devel mailing list
>> Openmcl-devel at clozure.com
>> http://clozure.com/mailman/listinfo/openmcl-devel
>> 
>> 




More information about the Openmcl-devel mailing list