67
67
/* INV: l is a proper list */
68
68
for (; CONSP(l); l = CDR(l))
69
if (string_eq(x, CAR(l)))
69
if (ecl_string_eq(x, CAR(l)))
75
Make_package(n, ns, ul) makes a package with name n,
75
ecl_make_package(n, ns, ul) makes a package with name n,
76
76
which must be a string or a symbol,
77
77
and nicknames ns, which must be a list of strings or symbols,
78
78
and uses packages in list ul, which must be a list of packages
88
88
h->hash.lockable = 0;
89
89
h->hash.test = htt_pack;
90
90
h->hash.size = hsize;
91
h->hash.rehash_size = make_shortfloat(1.5f);
92
h->hash.threshold = make_shortfloat(0.75f);
91
h->hash.rehash_size = ecl_make_singlefloat(1.5f);
92
h->hash.threshold = ecl_make_singlefloat(0.75f);
93
93
h->hash.factor = 0.7;
94
94
h->hash.entries = 0;
95
95
h->hash.data = NULL; /* for GC sake */
113
113
if (cl_core.packages_to_be_created != OBJNULL) {
114
114
cl_object *p = &cl_core.packages_to_be_created;
115
115
for (x = *p; x != Cnil; ) {
116
if (equal(CAAR(x), name)) {
116
cl_object other_name = CAAR(x);
117
if (ecl_equal(other_name, name) ||
118
funcall(5, @'member', other_name, nicknames,
119
@':test', @'string=') != Cnil)
121
/* FIXME! We should also check the nicknames */
155
158
x->pack.uses = Cnil;
156
159
x->pack.usedby = Cnil;
157
160
x->pack.locked = FALSE;
158
for (; !endp(nicknames); nicknames = CDR(nicknames)) {
161
for (; !ecl_endp(nicknames); nicknames = CDR(nicknames)) {
159
162
cl_object nick = cl_string(CAR(nicknames));
160
163
if ((other = ecl_find_package_nolock(nick)) != Cnil) {
164
167
x->pack.nicknames = CONS(nick, x->pack.nicknames);
166
for (; !endp(use_list); use_list = CDR(use_list)) {
169
for (; !ecl_endp(use_list); use_list = CDR(use_list)) {
167
170
y = si_coerce_to_package(CAR(use_list));
168
171
x->pack.uses = CONS(y, x->pack.uses);
169
172
y->pack.usedby = CONS(x, y->pack.usedby);
197
200
x->pack.name = name;
198
201
x->pack.nicknames = Cnil;
199
202
assert_type_proper_list(nicknames);
200
for (; !endp(nicknames); nicknames = CDR(nicknames)) {
203
for (; !ecl_endp(nicknames); nicknames = CDR(nicknames)) {
201
204
cl_object nick = CAR(nicknames);
202
205
y = ecl_find_package_nolock(nick);
234
237
/* INV: cl_core.packages is a proper list */
235
238
for (l = cl_core.packages; CONSP(l); l = CDR(l)) {
237
if (string_eq(name, p->pack.name))
240
if (ecl_string_eq(name, p->pack.name))
239
242
if (member_string_eq(name, p->pack.nicknames))
245
#ifdef ECL_RELATIVE_PACKAGE_NAMES
246
/* Note that this function may actually be called _before_ symbols are set up
248
if (ecl_booted && SYM_VAL(@'si::*relative-package-names*') != Cnil) {
249
return si_find_relative_package(1, name);
258
current_package(void)
268
ecl_current_package(void)
262
x = symbol_value(@'*package*');
272
x = ecl_symbol_value(@'*package*');
263
273
if (type_of(x) != t_package) {
264
274
ECL_SETQ(@'*package*', cl_core.user_package);
265
275
FEerror("The value of *PACKAGE*, ~S, was not a package",
272
Intern(st, p) interns string st in package p.
282
Ecl_Intern(st, p) interns string st in package p.
275
_intern(const char *s, cl_object p)
285
_ecl_intern(const char *s, cl_object p)
278
288
cl_object str = make_constant_base_string(s);
279
return intern(str, p, &intern_flag);
289
return ecl_intern(str, p, &intern_flag);
283
intern(cl_object name, cl_object p, int *intern_flag)
293
ecl_intern(cl_object name, cl_object p, int *intern_flag)
297
name = ecl_check_type_string(@'intern', name);
287
298
#ifdef ECL_UNICODE
288
name = si_copy_to_simple_base_string(name);
290
assert_type_base_string(name);
299
if (ecl_fits_in_base_string(name)) {
300
name = si_copy_to_simple_base_string(name);
292
303
p = si_coerce_to_package(p);
295
s = gethash_safe(name, p->pack.external, OBJNULL);
306
s = ecl_gethash_safe(name, p->pack.external, OBJNULL);
296
307
if (s != OBJNULL) {
297
308
*intern_flag = EXTERNAL;
300
311
/* Keyword package has no intern section nor can it be used */
301
312
if (p == cl_core.keyword_package) goto INTERN;
302
s = gethash_safe(name, p->pack.internal, OBJNULL);
313
s = ecl_gethash_safe(name, p->pack.internal, OBJNULL);
303
314
if (s != OBJNULL) {
304
315
*intern_flag = INTERNAL;
307
318
for (ul=p->pack.uses; CONSP(ul); ul = CDR(ul)) {
308
s = gethash_safe(name, CAR(ul)->pack.external, OBJNULL);
319
s = ecl_gethash_safe(name, CAR(ul)->pack.external, OBJNULL);
309
320
if (s != OBJNULL) {
310
321
*intern_flag = INHERITED;
318
329
"Ignore lock and proceed", p, 2, name, p);
319
330
goto TRY_AGAIN_LABEL;
321
s = make_symbol(name);
332
s = cl_make_symbol(name);
322
333
s->symbol.hpack = p;
323
334
*intern_flag = 0;
324
335
if (p == cl_core.keyword_package) {
325
336
s->symbol.stype = stp_constant;
327
sethash(name, p->pack.external, s);
338
ecl_sethash(name, p->pack.external, s);
329
sethash(name, p->pack.internal, s);
340
ecl_sethash(name, p->pack.internal, s);
332
343
PACKAGE_UNLOCK(p);
345
assert_type_base_string(name);
346
s = gethash_safe(name, p->pack.external, OBJNULL);
356
name = ecl_check_type_string(@'find-symbol', name);
358
if (ecl_fits_in_base_string(name)) {
359
name = si_copy_to_simple_base_string(name);
362
s = ecl_gethash_safe(name, p->pack.external, OBJNULL);
347
363
if (s != OBJNULL) {
348
364
*intern_flag = EXTERNAL;
351
367
if (p == cl_core.keyword_package)
353
s = gethash_safe(name, p->pack.internal, OBJNULL);
369
s = ecl_gethash_safe(name, p->pack.internal, OBJNULL);
354
370
if (s != OBJNULL) {
355
371
*intern_flag = INTERNAL;
358
374
for (ul=p->pack.uses; CONSP(ul); ul = CDR(ul)) {
359
s = gethash_safe(name, CAR(ul)->pack.external, OBJNULL);
375
s = ecl_gethash_safe(name, CAR(ul)->pack.external, OBJNULL);
360
376
if (s != OBJNULL) {
361
377
*intern_flag = INHERITED;
384
unintern(cl_object s, cl_object p)
400
ecl_unintern(cl_object s, cl_object p)
386
402
cl_object x, y, l, hash;
387
403
bool output = FALSE;
389
assert_type_symbol(s);
405
s = ecl_check_cl_type(@'unintern', s, t_symbol);
390
407
p = si_coerce_to_package(p);
394
411
hash = p->pack.internal;
395
x = gethash_safe(s->symbol.name, hash, OBJNULL);
412
x = ecl_gethash_safe(s->symbol.name, hash, OBJNULL);
398
415
hash = p->pack.external;
399
x = gethash_safe(s->symbol.name, hash, OBJNULL);
416
x = ecl_gethash_safe(s->symbol.name, hash, OBJNULL);
406
423
"Ignore lock and proceed", p, 2, s, p);
407
424
goto TRY_AGAIN_LABEL;
409
if (!member_eq(s, p->pack.shadowings))
426
if (!ecl_member_eq(s, p->pack.shadowings))
412
429
for (l = p->pack.uses; CONSP(l); l = CDR(l)) {
413
y = gethash_safe(s->symbol.name, CAR(l)->pack.external, OBJNULL);
430
y = ecl_gethash_safe(s->symbol.name, CAR(l)->pack.external, OBJNULL);
414
431
if (y != OBJNULL) {
415
432
if (x == OBJNULL)
426
443
p->pack.shadowings = ecl_remove_eq(s, p->pack.shadowings);
428
remhash(s->symbol.name, hash);
445
ecl_remhash(s->symbol.name, hash);
429
446
if (s->symbol.hpack == p)
430
447
s->symbol.hpack = Cnil;
440
457
cl_object x, l, hash = OBJNULL;
443
assert_type_symbol(s);
460
s = ecl_check_cl_type(@'export', s, t_symbol);
444
461
p = si_coerce_to_package(p);
446
463
if (p->pack.locked)
467
484
for (l = p->pack.usedby; CONSP(l); l = CDR(l)) {
468
485
x = ecl_find_symbol_nolock(s->symbol.name, CAR(l), &intern_flag);
469
486
if (intern_flag && s != x &&
470
!member_eq(x, CAR(l)->pack.shadowings)) {
487
!ecl_member_eq(x, CAR(l)->pack.shadowings)) {
471
488
PACKAGE_UNLOCK(p);
472
489
FEpackage_error("Cannot export the symbol ~S~%"
478
495
if (hash != OBJNULL)
479
remhash(s->symbol.name, hash);
480
sethash(s->symbol.name, p->pack.external, s);
496
ecl_remhash(s->symbol.name, hash);
497
ecl_sethash(s->symbol.name, p->pack.external, s);
482
499
PACKAGE_UNLOCK(p);
508
525
if (Null(p->pack.name)) {
511
for (list = p->pack.uses; !endp(list); list = CDR(list))
512
unuse_package(CAR(list), p);
513
for (list = p->pack.usedby; !endp(list); list = CDR(list))
514
unuse_package(p, CAR(list));
528
for (list = p->pack.uses; !ecl_endp(list); list = CDR(list))
529
ecl_unuse_package(CAR(list), p);
530
for (list = p->pack.usedby; !ecl_endp(list); list = CDR(list))
531
ecl_unuse_package(p, CAR(list));
516
533
for (hash = p->pack.internal, i = 0; i < hash->hash.size; i++)
517
534
if (hash->hash.data[i].key != OBJNULL) {
547
assert_type_symbol(s);
564
s = ecl_check_cl_type(@'unexport', s, t_symbol);
548
565
p = si_coerce_to_package(p);
549
566
if (p == cl_core.keyword_package)
550
567
FEpackage_error("Cannot unexport a symbol from the keyword package.",
564
581
ignored in unexport */
567
remhash(s->symbol.name, p->pack.external);
568
sethash(s->symbol.name, p->pack.internal, s);
584
ecl_remhash(s->symbol.name, p->pack.external);
585
ecl_sethash(s->symbol.name, p->pack.internal, s);
570
587
PACKAGE_UNLOCK(p);
579
assert_type_symbol(s);
596
s = ecl_check_cl_type(@'import', s, t_symbol);
580
597
p = si_coerce_to_package(p);
581
598
if (p->pack.locked)
582
599
CEpackage_error("Cannot import symbol ~S into locked package ~S.",
595
612
if (intern_flag == INTERNAL || intern_flag == EXTERNAL)
598
sethash(s->symbol.name, p->pack.internal, s);
615
ecl_sethash(s->symbol.name, p->pack.internal, s);
599
616
if (Null(s->symbol.hpack))
600
617
s->symbol.hpack = p;
606
shadowing_import(cl_object s, cl_object p)
623
ecl_shadowing_import(cl_object s, cl_object p)
611
assert_type_symbol(s);
628
s = ecl_check_cl_type(@'shadowing-import', s, t_symbol);
612
629
p = si_coerce_to_package(p);
613
630
if (p->pack.locked)
614
631
CEpackage_error("Cannot shadowing-import symbol ~S into locked package ~S.",
618
635
x = ecl_find_symbol_nolock(s->symbol.name, p, &intern_flag);
619
636
if (intern_flag && intern_flag != INHERITED) {
621
if (!member_eq(x, p->pack.shadowings))
638
if (!ecl_member_eq(x, p->pack.shadowings))
622
639
p->pack.shadowings
623
640
= CONS(x, p->pack.shadowings);
626
if(member_eq(x, p->pack.shadowings))
643
if(ecl_member_eq(x, p->pack.shadowings))
627
644
p->pack.shadowings = ecl_remove_eq(x, p->pack.shadowings);
628
645
if (intern_flag == INTERNAL)
629
remhash(x->symbol.name, p->pack.internal);
646
ecl_remhash(x->symbol.name, p->pack.internal);
631
remhash(x->symbol.name, p->pack.external);
648
ecl_remhash(x->symbol.name, p->pack.external);
632
649
if (x->symbol.hpack == p)
633
650
x->symbol.hpack = Cnil;
635
652
p->pack.shadowings = CONS(s, p->pack.shadowings);
636
sethash(s->symbol.name, p->pack.internal, s);
653
ecl_sethash(s->symbol.name, p->pack.internal, s);
638
655
PACKAGE_UNLOCK(p);
642
shadow(cl_object s, cl_object p)
659
ecl_shadow(cl_object s, cl_object p)
654
671
x = ecl_find_symbol_nolock(s, p, &intern_flag);
655
672
if (intern_flag != INTERNAL && intern_flag != EXTERNAL) {
657
sethash(x->symbol.name, p->pack.internal, x);
673
x = cl_make_symbol(s);
674
ecl_sethash(x->symbol.name, p->pack.internal, x);
658
675
x->symbol.hpack = p;
660
677
p->pack.shadowings = CONS(x, p->pack.shadowings);
680
697
FEpackage_error("Cannot use in keyword package.", cl_core.keyword_package, 0);
683
if (member_eq(x, p->pack.uses))
700
if (ecl_member_eq(x, p->pack.uses))
692
709
cl_object here = hash_entries[i].value;
693
710
cl_object there = ecl_find_symbol_nolock(here->symbol.name, p, &intern_flag);
694
711
if (intern_flag && here != there
695
&& ! member_eq(there, p->pack.shadowings)) {
712
&& ! ecl_member_eq(there, p->pack.shadowings)) {
696
713
PACKAGE_UNLOCK(x);
697
714
PACKAGE_UNLOCK(p);
698
715
FEpackage_error("Cannot use ~S~%"
711
unuse_package(cl_object x, cl_object p)
728
ecl_unuse_package(cl_object x, cl_object p)
713
730
x = si_coerce_to_package(x);
714
731
p = si_coerce_to_package(p);
727
744
@(defun make_package (pack_name &key nicknames (use CONS(cl_core.lisp_package, Cnil)))
729
/* INV: make_package() performs type checking */
730
@(return make_package(pack_name, nicknames, use))
746
/* INV: ecl_make_package() performs type checking */
747
@(return ecl_make_package(pack_name, nicknames, use))
762
779
@(defun rename_package (pack new_name &o new_nicknames)
764
/* INV: rename_package() type checks and coerces pack to package */
765
@(return rename_package(pack, new_name, new_nicknames))
781
/* INV: ecl_rename_package() type checks and coerces pack to package */
782
@(return ecl_rename_package(pack, new_name, new_nicknames))
797
814
return cl_copy_list(cl_core.packages);
800
@(defun intern (strng &optional (p current_package()) &aux sym)
817
@(defun intern (strng &optional (p ecl_current_package()) &aux sym)
803
sym = intern(strng, p, &intern_flag);
820
sym = ecl_intern(strng, p, &intern_flag);
804
821
if (intern_flag == INTERNAL)
805
822
@(return sym @':internal')
806
823
if (intern_flag == EXTERNAL)
824
841
@(return Cnil Cnil)
827
@(defun unintern (symbl &optional (p current_package()))
844
@(defun unintern (symbl &optional (p ecl_current_package()))
829
@(return (unintern(symbl, p) ? Ct : Cnil))
846
@(return (ecl_unintern(symbl, p) ? Ct : Cnil))
832
@(defun export (symbols &o (pack current_package()))
849
@(defun export (symbols &o (pack ecl_current_package()))
844
861
pack = si_coerce_to_package(pack);
845
for (l = symbols; !endp(l); l = CDR(l))
862
for (l = symbols; !ecl_endp(l); l = CDR(l))
846
863
cl_export2(CAR(l), pack);
850
assert_type_symbol(symbols);
867
symbols = ecl_type_error(@'export',"argument",symbols,
868
cl_list(3,@'or',@'symbol',@'list'));
856
@(defun unexport (symbols &o (pack current_package()))
874
@(defun unexport (symbols &o (pack ecl_current_package()))
868
886
pack = si_coerce_to_package(pack);
869
for (l = symbols; !endp(l); l = CDR(l))
887
for (l = symbols; !ecl_endp(l); l = CDR(l))
870
888
cl_unexport2(CAR(l), pack);
874
assert_type_symbol(symbols);
892
symbols = ecl_type_error(@'unexport',"argument",symbols,
893
cl_list(3,@'or',@'symbol',@'list'));
880
@(defun import (symbols &o (pack current_package()))
899
@(defun import (symbols &o (pack ecl_current_package()))
892
911
pack = si_coerce_to_package(pack);
893
for (l = symbols; !endp(l); l = CDR(l))
912
for (l = symbols; !ecl_endp(l); l = CDR(l))
894
913
cl_import2(CAR(l), pack);
898
assert_type_symbol(symbols);
917
symbols = ecl_type_error(@'import',"argument",symbols,
918
cl_list(3,@'or',@'symbol',@'list'));
904
@(defun shadowing_import (symbols &o (pack current_package()))
924
@(defun shadowing_import (symbols &o (pack ecl_current_package()))
910
930
if (Null(symbols))
912
shadowing_import(symbols, pack);
932
ecl_shadowing_import(symbols, pack);
916
936
pack = si_coerce_to_package(pack);
917
for (l = symbols; !endp(l); l = CDR(l))
918
shadowing_import(CAR(l), pack);
937
for (l = symbols; !ecl_endp(l); l = CDR(l))
938
ecl_shadowing_import(CAR(l), pack);
922
assert_type_symbol(symbols);
942
symbols = ecl_type_error(@'shadowing-import',"argument",symbols,
943
cl_list(3,@'or',@'symbol',@'list'));
928
@(defun shadow (symbols &o (pack current_package()))
949
@(defun shadow (symbols &o (pack ecl_current_package()))
932
953
switch (type_of(symbols)) {
933
957
case t_base_string:
935
959
case t_character:
936
960
/* Arguments to SHADOW may be: string designators ... */
937
961
if (Null(symbols))
939
shadow(symbols, pack);
963
ecl_shadow(symbols, pack);
942
966
/* ... or lists of string designators */
943
967
pack = si_coerce_to_package(pack);
944
for (l = symbols; !endp(l); l = CDR(l))
945
shadow(CAR(l), pack);
968
for (l = symbols; !ecl_endp(l); l = CDR(l))
969
ecl_shadow(CAR(l), pack);
948
assert_type_base_string(symbols);
972
symbols = ecl_type_error(@'shadow',"",symbols,
973
cl_list(3,@'or',@'symbol',@'list'));
954
@(defun use_package (pack &o (pa current_package()))
979
@(defun use_package (pack &o (pa ecl_current_package()))
962
987
case t_character:
963
988
case t_base_string:
965
use_package(pack, pa);
990
ecl_use_package(pack, pa);
969
994
pa = si_coerce_to_package(pa);
970
for (l = pack; !endp(l); l = CDR(l))
971
use_package(CAR(l), pa);
995
for (l = pack; !ecl_endp(l); l = CDR(l))
996
ecl_use_package(CAR(l), pa);
989
1014
case t_character:
990
1015
case t_base_string:
992
unuse_package(pack, pa);
1017
ecl_unuse_package(pack, pa);
996
1021
pa = si_coerce_to_package(pa);
997
for (l = pack; !endp(l); l = CDR(l))
998
unuse_package(CAR(l), pa);
1022
for (l = pack; !ecl_endp(l); l = CDR(l))
1023
ecl_unuse_package(CAR(l), pa);