[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: SHADOWING-IMPORT doesn't



	From: jeff%aiva.edinburgh.ac.uk%nss.cs.ucl.ac.uk%ngp.utexas.edu@RELAY.CS.NET Dalton <jeff%aiva.edinburgh.ac.uk@nss.cs.ucl.ac.uk>
	Date: Wed, 16 Dec 87 20:03:23 GMT
	Message-Id: <16928.8712162003@aiva.ed.ac.uk>
	To: kcl <@sally.utexas.edu>
	Subject: SHADOWING-IMPORT doesn't

	SHADOWING-IMPORT does not work correctly when there is a conflicting
	symbol in the importing package:

	     KCl (Kyoto Common Lisp)  June 3, 1987

	     >(in-package "A")
	     #<"A" package>
 
	     A>(defun f () "A")			;F in A
	     F
 
	     A>(in-package "B")
	     #<"B" package>

	     B>(defun f () "B") 		;conflicting F in B
	     F

	     B>(shadowing-import 'a::f)		;should work without error

	     Error: Cannot shadowing-import the symbol A::F
	            to #<"B" package>,
	            because there is already a symbol with the same name
	            in the package.
	     Error signalled by SHADOWING-IMPORT.

	According to Steele, p. 179:

	     SHADOW and SHADOWING-IMPORT never signal a name-conflict error
	     [...]  SHADOWING-IMPORT does name-conflict checking to the extent
	     that it checks whether a distince existing symbol with the same
	     name is accessable; if so, it is shadowed by the new symbol, which
	     implies that it must be uninterned if it was directly present in
	     the package.

	What should happen in the example above is that B::F should be uninterned
	and the import should succeed.
 
	Jeff Dalton,                      JANET: J.Dalton@uk.ac.ed             
	AI Applications Institute,        ARPA:  J.Dalton%uk.ac.ed@nss.cs.ucl.ac.uk
	Edinburgh University.             UUCP:  ...!ukc!ed.ac.uk!J.Dalton


There was a bug in the definition of the C function shadowing_import
in file c/package.d.  To fix the bug, use the following definition.

shadowing_import(s, p)
object s, p;
{
	object x, *ip;

	x = find_symbol(s, p);
	if (intern_flag && intern_flag != INHERITED) {
		if (x == s) {
			if (!member_eq(x, p->p.p_shadowings))
				p->p.p_shadowings
				= make_cons(x, p->p.p_shadowings);
			return;
		}
		if(member_eq(x, p->p.p_shadowings))
			delete_eq(x, &p->p.p_shadowings);
		if (intern_flag == INTERNAL)
			delete_eq(x, &p->p.p_internal[pack_hash(x)]);
		else
			delete_eq(x, &p->p.p_external[pack_hash(x)]);
		if (x->s.s_hpack == p)
			x->s.s_hpack = Cnil;
		if ((enum stype)x->s.s_stype != stp_ordinary)
			uninterned_list = make_cons(x, uninterned_list);
	}
	ip = &p->p.p_internal[pack_hash(s)];
	*ip = make_cons(s, *ip);
	p->p.p_shadowings = make_cons(s, p->p.p_shadowings);
}

-- Taiichi