@@ -425,20 +425,18 @@ def __init__(self, name: sym.Symbol, module: BasilispModule = None) -> None:
425
425
self ._meta : Optional [IPersistentMap ] = None
426
426
self ._lock = threading .Lock ()
427
427
428
- self ._aliases : Atom [NamespaceMap ] = Atom (lmap .Map .empty ())
429
- self ._imports : Atom [ModuleMap ] = Atom (
430
- lmap .map (
431
- dict (
432
- map (
433
- lambda s : (s , importlib .import_module (s .name )),
434
- Namespace .DEFAULT_IMPORTS .deref (),
435
- )
428
+ self ._aliases : NamespaceMap = lmap .Map .empty ()
429
+ self ._imports : ModuleMap = lmap .map (
430
+ dict (
431
+ map (
432
+ lambda s : (s , importlib .import_module (s .name )),
433
+ Namespace .DEFAULT_IMPORTS .deref (),
436
434
)
437
435
)
438
436
)
439
- self ._import_aliases : Atom [ AliasMap ] = Atom ( lmap .Map .empty () )
440
- self ._interns : Atom [ VarMap ] = Atom ( lmap .Map .empty () )
441
- self ._refers : Atom [ VarMap ] = Atom ( lmap .Map .empty () )
437
+ self ._import_aliases : AliasMap = lmap .Map .empty ()
438
+ self ._interns : VarMap = lmap .Map .empty ()
439
+ self ._refers : VarMap = lmap .Map .empty ()
442
440
443
441
@classmethod
444
442
def add_default_import (cls , module : str ):
@@ -470,129 +468,133 @@ def module(self, m: BasilispModule):
470
468
def aliases (self ) -> NamespaceMap :
471
469
"""A mapping between a symbolic alias and another Namespace. The
472
470
fully qualified name of a namespace is also an alias for itself."""
473
- return self ._aliases .deref ()
471
+ with self ._lock :
472
+ return self ._aliases
474
473
475
474
@property
476
475
def imports (self ) -> ModuleMap :
477
476
"""A mapping of names to Python modules imported into the current
478
477
namespace."""
479
- return self ._imports .deref ()
478
+ with self ._lock :
479
+ return self ._imports
480
480
481
481
@property
482
482
def import_aliases (self ) -> AliasMap :
483
483
"""A mapping of a symbolic alias and a Python module name."""
484
- return self ._import_aliases .deref ()
484
+ with self ._lock :
485
+ return self ._import_aliases
485
486
486
487
@property
487
488
def interns (self ) -> VarMap :
488
489
"""A mapping between a symbolic name and a Var. The Var may point to
489
490
code, data, or nothing, if it is unbound. Vars in `interns` are
490
491
interned in _this_ namespace."""
491
- return self ._interns .deref ()
492
+ with self ._lock :
493
+ return self ._interns
492
494
493
495
@property
494
496
def refers (self ) -> VarMap :
495
497
"""A mapping between a symbolic name and a Var. Vars in refers are
496
498
interned in another namespace and are only referred to without an
497
499
alias in this namespace."""
498
- return self ._refers .deref ()
500
+ with self ._lock :
501
+ return self ._refers
499
502
500
503
def __repr__ (self ):
501
504
return f"{ self ._name } "
502
505
503
506
def __hash__ (self ):
504
507
return hash (self ._name )
505
508
506
- def add_alias (self , alias : sym .Symbol , namespace : "Namespace" ) -> None :
507
- """Add a Symbol alias for the given Namespace."""
508
- self ._aliases .swap (lambda m : m .assoc (alias , namespace ))
509
+ def add_alias (self , namespace : "Namespace" , * aliases : sym .Symbol ) -> None :
510
+ """Add Symbol aliases for the given Namespace."""
511
+ with self ._lock :
512
+ new_m = self ._aliases
513
+ for alias in aliases :
514
+ new_m = new_m .assoc (alias , namespace )
515
+ self ._aliases = new_m
509
516
510
517
def get_alias (self , alias : sym .Symbol ) -> "Optional[Namespace]" :
511
518
"""Get the Namespace aliased by Symbol or None if it does not exist."""
512
- return self .aliases .val_at (alias , None )
519
+ with self ._lock :
520
+ return self ._aliases .val_at (alias , None )
513
521
514
522
def remove_alias (self , alias : sym .Symbol ) -> None :
515
523
"""Remove the Namespace aliased by Symbol. Return None."""
516
- self ._aliases .swap (lambda m : m .dissoc (alias ))
524
+ with self ._lock :
525
+ self ._aliases = self ._aliases .dissoc (alias )
517
526
518
527
def intern (self , sym : sym .Symbol , var : Var , force : bool = False ) -> Var :
519
528
"""Intern the Var given in this namespace mapped by the given Symbol.
520
529
If the Symbol already maps to a Var, this method _will not overwrite_
521
530
the existing Var mapping unless the force keyword argument is given
522
531
and is True."""
523
- m : lmap .Map = self ._interns .swap (Namespace ._intern , sym , var , force = force )
524
- return m .val_at (sym )
525
-
526
- @staticmethod
527
- def _intern (
528
- m : lmap .Map , sym : sym .Symbol , new_var : Var , force : bool = False
529
- ) -> lmap .Map :
530
- """Swap function used by intern to atomically intern a new variable in
531
- the symbol mapping for this Namespace."""
532
- var = m .val_at (sym , None )
533
- if var is None or force :
534
- return m .assoc (sym , new_var )
535
- return m
532
+ with self ._lock :
533
+ old_var = self ._interns .val_at (sym , None )
534
+ if old_var is None or force :
535
+ self ._interns = self ._interns .assoc (sym , var )
536
+ return self ._interns .val_at (sym )
536
537
537
538
def unmap (self , sym : sym .Symbol ) -> None :
538
- self ._interns .swap (lambda m : m .dissoc (sym ))
539
+ with self ._lock :
540
+ self ._interns = self ._interns .dissoc (sym )
539
541
540
542
def find (self , sym : sym .Symbol ) -> Optional [Var ]:
541
543
"""Find Vars mapped by the given Symbol input or None if no Vars are
542
544
mapped by that Symbol."""
543
- v = self .interns .val_at (sym , None )
544
- if v is None :
545
- return self .refers .val_at (sym , None )
546
- return v
545
+ with self ._lock :
546
+ v = self ._interns .val_at (sym , None )
547
+ if v is None :
548
+ return self ._refers .val_at (sym , None )
549
+ return v
547
550
548
551
def add_import (self , sym : sym .Symbol , module : Module , * aliases : sym .Symbol ) -> None :
549
552
"""Add the Symbol as an imported Symbol in this Namespace. If aliases are given,
550
553
the aliases will be applied to the """
551
- self ._imports . swap ( lambda m : m . assoc ( sym , module ))
552
- if aliases :
553
- self . _import_aliases . swap (
554
- lambda m : m . assoc (
555
- * itertools . chain . from_iterable ([( alias , sym ) for alias in aliases ])
556
- )
557
- )
554
+ with self ._lock :
555
+ self . _imports = self . _imports . assoc ( sym , module )
556
+ if aliases :
557
+ m = self . _import_aliases
558
+ for alias in aliases :
559
+ m = m . assoc ( alias , sym )
560
+ self . _import_aliases = m
558
561
559
562
def get_import (self , sym : sym .Symbol ) -> Optional [BasilispModule ]:
560
563
"""Return the module if a moduled named by sym has been imported into
561
564
this Namespace, None otherwise.
562
565
563
566
First try to resolve a module directly with the given name. If no module
564
567
can be resolved, attempt to resolve the module using import aliases."""
565
- mod = self .imports .val_at (sym , None )
566
- if mod is None :
567
- alias = self .import_aliases .get (sym , None )
568
- if alias is None :
569
- return None
570
- return self .imports .val_at (alias , None )
571
- return mod
568
+ with self ._lock :
569
+ mod = self ._imports .val_at (sym , None )
570
+ if mod is None :
571
+ alias = self ._import_aliases .get (sym , None )
572
+ if alias is None :
573
+ return None
574
+ return self ._imports .val_at (alias , None )
575
+ return mod
572
576
573
577
def add_refer (self , sym : sym .Symbol , var : Var ) -> None :
574
578
"""Refer var in this namespace under the name sym."""
575
579
if not var .is_private :
576
- self ._refers .swap (lambda s : s .assoc (sym , var ))
580
+ with self ._lock :
581
+ self ._refers = self ._refers .assoc (sym , var )
577
582
578
583
def get_refer (self , sym : sym .Symbol ) -> Optional [Var ]:
579
584
"""Get the Var referred by Symbol or None if it does not exist."""
580
- return self .refers .val_at (sym , None )
585
+ with self ._lock :
586
+ return self ._refers .val_at (sym , None )
581
587
582
- @classmethod
583
- def __refer_all (cls , refers : lmap .Map , other_ns_interns : lmap .Map ) -> lmap .Map :
584
- """Refer all _public_ interns from another namespace."""
585
- final_refers = refers
586
- for entry in other_ns_interns :
587
- s : sym .Symbol = entry .key
588
- var : Var = entry .value
589
- if not var .is_private :
590
- final_refers = final_refers .assoc (s , var )
591
- return final_refers
592
-
593
- def refer_all (self , other_ns : "Namespace" ):
588
+ def refer_all (self , other_ns : "Namespace" ) -> None :
594
589
"""Refer all the Vars in the other namespace."""
595
- self ._refers .swap (Namespace .__refer_all , other_ns .interns )
590
+ with self ._lock :
591
+ final_refers = self ._refers
592
+ for entry in other_ns .interns :
593
+ s : sym .Symbol = entry .key
594
+ var : Var = entry .value
595
+ if not var .is_private :
596
+ final_refers = final_refers .assoc (s , var )
597
+ self ._refers = final_refers
596
598
597
599
@classmethod
598
600
def ns_cache (cls ) -> lmap .Map :
0 commit comments