PSL Manual                    7 February 1983                   Identifiers
section 6.0                                                        page 6.1

                                 CHAPTER 6
                                 CHAPTER 6
                                 CHAPTER 6
                                IDENTIFIERS
                                IDENTIFIERS
                                IDENTIFIERS




     6.1. Introduction  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .     6.1
     6.2. Fields of Ids .  .  .  .  .  .  .  .  .  .  .  .  .  .  .     6.2
     6.3. Identifiers and the Id-Hash-Table  .  .  .  .  .  .  .  .     6.2
          6.3.1. Identifier Functions  .  .  .  .  .  .  .  .  .  .     6.3
          6.3.2. Find.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .     6.4
     6.4. Property List Functions.  .  .  .  .  .  .  .  .  .  .  .     6.5
          6.4.1. Functions for Flagging Ids  .  .  .  .  .  .  .  .     6.6
          6.4.2. Direct Access to the Property Cell.  .  .  .  .  .     6.7
     6.5. Value Cell Functions.  .  .  .  .  .  .  .  .  .  .  .  .     6.7
     6.6. Package System Functions  .  .  .  .  .  .  .  .  .  .  .    6.10
     6.7. System Global Variables, Switches and Other "Hooks"  .  .    6.13
          6.7.1. Introduction .  .  .  .  .  .  .  .  .  .  .  .  .    6.13
          6.7.2. Setting Switches.  .  .  .  .  .  .  .  .  .  .  .    6.14
          6.7.3. Special Global Variables .  .  .  .  .  .  .  .  .    6.15
          6.7.4. Special Put Indicators.  .  .  .  .  .  .  .  .  .    6.15
          6.7.5. Special Flag Indicators  .  .  .  .  .  .  .  .  .    6.16
          6.7.6. Displaying Information About Globals .  .  .  .  .    6.16




6.1. Introduction
6.1. Introduction
6.1. Introduction

                                   __________       __        __________
  In  PSL  variables  are  called  identifiers  or  ids.   An identifier is
implemented as a tagged data object (described in Chapter 4)  containing  a
                                                     __ _____
pointer  or  offset into a five item structure - the id space.  One item in
this  structure  is  called  the  print  name,  which   is   the   external
                      __
representation of the id.

                             __ ____ _____
  The  interpreter  uses  an id hash table to get from the print name of an
__________                     __ _____       __  _____            __  ____
identifier to its entry in the id space.  The id  space  and  the  id  hash
_____
table are described below.

  Sometimes  there  is  a  need  for  more  than one name space when one is
building a large system.  For  example,  one  may  wish  to  allow  several
programmers  to  each  produce  a  part of a system without having to worry
about name conflicts.  PSL provides a  package  system  for  this  purpose,
                                  __ ____ _____
giving the user a tree-structured id hash table.
Identifiers                   7 February 1983                    PSL Manual
page 6.2                                                        section 6.2

6.2. Fields of Ids
6.2. Fields of Ids
6.2. Fields of Ids

      __        ____         ____            ____
  An  id  is an item with an info field; the info field is an offset into a
        __ _____                                                     ____
special id space consisting of structures of 5 fields.  The fields  (items)
are:


_____ ____                                ______
print-name     The print name points at a string of characters which is the
                                                __________
               external  representation  of the identifier.  The syntax for
               __________
               identifiers  is  described  in  Section  12.5   on   reading
               functions.
________ ____
property-cell  One  may want to associate various flags and properties with
                  __________
               an identifier.  These can be stored on a  property-list  for
                   __
               an  id,  flags  by  name  and  properties by an (indicator .
                                                     __
               value) pair.  The property cell of an id contains a  pointer
               to  this  list.   Access is by means of functions defined in
               Section 6.4.
_____ ____                      __________
value-cell     The value of the identifier or a pointer to the value in the
               heap is stored in this field.  If no value exists, this cell
                                   __________
               contains an unbound identifier indicator.  These  cells  can
               be accessed by functions defined in this chapter.
                                                  _____
                                                  _____
                                                  _____
                                                  macro
________ ____                        ________     macro
function-cell  An  id  may  have  a  function  or macro associated with it.
                                         PutD   GetD        RemD
                                         PutD   GetD        RemD
               Access is by means of the PutD,  GetD,  and  RemD  functions
               defined in Section 10.1.2.
_______ ____
package-cell   PSL permits the use of a multiple package facility (multiple
               __  ____ _____
               id  hash table).  The package cell refers to the appropriate
               __ ____ _____
               id hash table.



6.3. Identifiers and the Id hash table
6.3. Identifiers and the Id hash table
6.3. Identifiers and the Id hash table

                                                          __________
  The method used by PSL to retrieve information about an identifier  makes
             __ ____ _____
use  of  the id hash table (corresponding to the Oblist, or Object list, in
                                                           __________
some versions of LISP).  A hash function is applied to the identifier  name
                          __ ____ _____
giving  a position in the id hash table.  The contents of the hash table at
                                      __ _____             __________
that point contain an offset into the id space.  For a new identifier,  the
                            __ _____
next  free  position in the id space is found and a pointer to it is placed
in the hash table entry.

                            __
  The process of putting an id into the hash  table  is  called  interning.
                                                         __
This  is  done  automatically by the LISP reader, so any id typed in at the
terminal is interned.  Interning can also be done by the  programmer  using
              Intern
              Intern              ______       __      __
the  function Intern to convert a string to an id.  An id may have an entry
       __ _____
in the id space without being interned.  In fact it  is  possible  to  have
         __
several  ids  with  the  same  print name, one interned and the others not.
                                                                   __
(The use of the package system allows one to have several interned ids with
the same print name.)

                                            __   _____
  Note  that  when  one  starts  PSL,  the  id   space   already   contains
                     __
approximately  2000  ids.    These include all of the ASCII characters, the
functions and globals described in this manual, plus system  functions  and
PSL Manual                    7 February 1983                   Identifiers
section 6.3                                                        page 6.3

globals.    If  a  user  uses  any  of these names for his own functions or
globals, there can be a conflict.  This is  another  reason  for  having  a
package  system.    A warning message appears if a user tries to redefine a
system function.

   ? Do you really want to redefine the system function 'name? (Y or N)

If the user answers "Y", his definition replaces  the  current  definition.
                                                    ________
(See  Chapter  10 for a description of the switch !*USERMODE which controls
the printing of this message.)

                                        __ ____ _____
  Basic PSL currently provides a single id hash table.   PSL  provides  all
the  "hooks"  to permit a package system to be loaded as an option; certain
functions are redefined in this process.  If the package system is  loaded,
                    __ ____ _____
a  tree-structured  id hash table can be created in which each level can be
                        __ ____ _____            __      ______
thought of as a smaller id hash table.  If a new id  or  string  is  to  be
interned,  it  is  searched  for in the tree according to a specified rule.
For more information see Section 6.6.

                            __
  Information on converting ids to other types  can  be  found  in  Chapter
12 and Section 4.3.


6.3.1. Identifier Functions
6.3.1. Identifier Functions
6.3.1. Identifier Functions

                                    __________          __ ____ _____
  The following functions deal with identifiers and the id hash table.


 GenSym
 GenSym    __                                                          ____
(GenSym ): id                                                          expr

                 __________
     Creates  an identifier which is not interned on the id hash table
                          Eq
                          Eq                        __
     and consequently not Eq to anything else.  The id is derived from
     a string of the form "G0000", which is incremented upon each call
        GenSym
        GenSym
     to GenSym.

       [??? Is this interned or recorded on the NIL package ???]
       [??? Is this interned or recorded on the NIL package ???]
       [??? Is this interned or recorded on the NIL package ???]

       [??? Can we change the GenSym string ???]
       [??? Can we change the GenSym string ???]
       [??? Can we change the GenSym string ???]


 InternGenSym
 InternGenSym    __                                                    ____
(InternGenSym ): id                                                    expr

                GenSym
                GenSym                         __
     Similar to GenSym but returns an interned id.


 StringGenSym
 StringGenSym    ______                                                ____
(StringGenSym ): string                                                expr

                GenSym
                GenSym                  ______
     Similar to GenSym but  returns  a  string  of  the  form  "L0000"
                   __
     instead of an id.
Identifiers                   7 February 1983                    PSL Manual
page 6.4                                                        section 6.3

 RemOb
 RemOb _ __   _ __                                                     ____
(RemOb U:id): U:id                                                     expr

        _
     If U is present on the current package search path it is removed.
                             _
     This  does  not  affect U having properties, flags, functions and
                _
     the like.  U is returned.


 InternP
 InternP _  __ ______    _______                                       ____
(InternP U:{id,string}): boolean                                       expr

                  _
     Returns T if U is interned in the current search path.


 MapObl
 MapObl _____ ________   _________                                     ____
(MapObl FNAME:function): Undefined                                     expr

     MapObl
     MapObl                  _____         __
     MapObl applies function FNAME to each id interned in the  current
     hash table.


6.3.2. Find
6.3.2. Find
6.3.2. Find

                          ______    __                              __ ____
  These  functions take a string or id as an argument, and scan the id hash
_____                      __
table to collect a list of ids with prefix or suffix matching the argument.
This is a loadable option (LOAD FIND).


 FindPrefix
 FindPrefix ___  __  ______    __ ____                                 ____
(FindPrefix KEY:{id, string}): id-list                                 expr

                   __ ____ _____         __                       ___
     Scans current id hash table for all ids whose prefix matches KEY.
     Returns all the identifiers found  as  an  alphabetically  sorted
     list.


 FindSuffix
 FindSuffix ___  __  ______    __ ____                                 ____
(FindSuffix KEY:{id, string}): id-list                                 expr

                   __ ____ _____         __                       ___
     Scans current id hash table for all ids whose suffix matches KEY.
     Returns  all  the  identifiers  found as an alphabetically sorted
     list.

   (Setq X (FindPrefix '!*)  % Finds all identifiers starting with *

   (Setq Y (FindSuffix "STRING")) % Finds all identifiers ending with S



6.4. Property List Functions
6.4. Property List Functions
6.4. Property List Functions

                          __________                       ____        ____
  The property cell of an identifier points to a "property list".  The list
                                __
is used to quickly associate an id name  with  a  set  of  entities;  those
                                                    __
entities  are called "flags" if their use gives the id a boolean value, and
                    __
"properties" if the id is to have an arbitrary attribute (an indicator with
a property).
PSL Manual                    7 February 1983                   Identifiers
section 6.4                                                        page 6.5

 Put
 Put _ __ ___ __ ____ ___   ___                                        ____
(Put U:id IND:id PROP:any): any                                        expr

                     ___                       ____
     The  indicator  IND  with  the  property  PROP  is  placed on the
                                                     Put
              ____        __ _                       Put
     property list of the id U.  If the  action  of  Put  occurs,  the
                ____                             _     ___         __
     value  of  PROP  is returned.  If either of U and IND are not ids
     the type mismatch error occurs and no property is placed.  

        (Put 'Jim 'Height 68)

     The above returns 68 and places (Height .  68)  on  the  property
                 __
     list of the id Jim.


 Get
 Get _ __ ___ __   ___                                                 ____
(Get U:id IND:id): any                                                 expr

                                                          ___
     Returns  the  property  associated  with  indicator  IND from the
              ____    _      _                           ___
     property list of U.  If U does not have  indicator  IND,  NIL  is
                                     Get                           Get
                                     Get                           Get
     returned.    (In  older  LISPs, Get could access functions.)  Get
                    _           __
     returns NIL if U is not an id.


         (Get 'Jim 'Height) returns 68


 DefList
 DefList _ ____ ___ __   ____                                          ____
(DefList U:list IND:id): list                                          expr

     _
     U is a  list  in  which  each  element  is  a  two-element  list:
      __ __ ____ ___            __      _                     ___
     (ID:ID PROP:ANY).    Each  id  in  U  has  the indicator IND with
                                                        Put
                                                        Put
     property PROP placed on its property list by  the  Put  function.
                     DefList
                     DefList        ____
     The  value  of  DefList  is  a list of the first elements of each
                             Put  DefList
                             Put  DefList
     two-element list.  Like Put, DefList may not be  used  to  define
     functions.  

        (DE DEFLIST (U IND)
              (COND ((NULL U) NIL)
                    (T (CONS(PROGN(PUT (CAAR U) IND (CADAR U))
                                  (CAAR U))
                            (DEFLIST (CDR U) IND)))))


 RemProp
 RemProp _ __ ___ __   ___                                             ____
(RemProp U:id IND:id): any                                             expr

                                         ___                   ____
     Removes the property with indicator IND from the property list of
     _
     U.    Returns  the  removed  property or NIL if there was no such
     indicator.


 RemPropL
 RemPropL _ __ ____ ___ __   ___                                       ____
(RemPropL U:id-list IND:id): NIL                                       expr

                     ___          __     _
     Remove property IND from all ids in U.
Identifiers                   7 February 1983                    PSL Manual
page 6.6                                                        section 6.4

6.4.1. Functions for Flagging Ids
6.4.1. Functions for Flagging Ids
6.4.1. Functions for Flagging Ids

                                                                    __
  In some LISPs, flags and indicators may clash.  In PSL, flags are ids and
               ____
properties are pairs on the prop-list, so no clash occurs.


 Flag
 Flag _ __ ____ _ __   ___                                             ____
(Flag U:id-list V:id): NIL                                             expr

     Flag                                                      Flag
     Flag               __    _      _                         Flag
     Flag  flags  each  id in U with V; that is, the effect of Flag is
                              FlagP
                   __ _    _  FlagP                              _
     that for each id X in U, FlagP(X, V) has the value T.  Both V and
                         _         __________
     all the elements of U must be identifiers or  the  type  mismatch
                            Flag
                            Flag          __ _
     error  occurs.   After Flagging, the id V appears on the property
                  __      _
     list of each id X in U.    However,  flags  cannot  be  accessed,
     placed  on,  or removed from property lists using normal property
                    Get  Put      RemProp
                    Get  Put      RemProp
     list functions Get, Put, and RemProp.   Note  that  if  an  error
                                Flag
                                Flag                   __     _
     occurs during execution of Flag, then some of the ids on U may be
                    _
     flagged  with  V,  and  others  may  not be.  The statement below
     causes the flag "Lose" to be placed on the property lists of  the
     __
     ids X and Y.

        (Flag '(X Y) 'Lose)


 FlagP
 FlagP _ __ _ __   _______                                             ____
(FlagP U:id V:id): boolean                                             expr

                     _                       _
     Returns  T  if  U has been flagged with V; otherwise returns NIL.
                           _    _           __
     Returns NIL if either U or V is not an id.


 RemFlag
 RemFlag _ __ ____ _ __   ___                                          ____
(RemFlag U:id-list V:id): NIL                                          expr

                      _                   ____
     Removes the flag V from the property list of each member  of  the
     ____ _        _                         _         __
     list U.  Both V and all the elements of U must be ids or the type
     mismatch error occurs.


 Flag1
 Flag1 _ __ _ ___   _________                                          ____
(Flag1 U:id V:any): Undefined                                          expr

               _                         __ _
     Puts flag V on the property list of id U.


 RemFlag1
 RemFlag1 _ __ _ ___   _________                                       ____
(RemFlag1 U:id V:any): Undefined                                       expr

                      _                           __ _
     Removes the flag V from the property list of id U.

  [??? Make Flag1 and RemFlag1 return single value. ???]
  [??? Make Flag1 and RemFlag1 return single value. ???]
  [??? Make Flag1 and RemFlag1 return single value. ???]
PSL Manual                    7 February 1983                   Identifiers
section 6.4                                                        page 6.7

6.4.2. Direct Access to the Property Cell
6.4.2. Direct Access to the Property Cell
6.4.2. Direct Access to the Property Cell

  Use  of the following functions can destroy the integrity of the property
____
list.  Since PSL uses properties at a low level, care should  be  taken  in
the use of these functions.


 Prop
 Prop _ __   ___                                                       ____
(Prop U:id): any                                                       expr

                          ____    _
     Returns the property list of U.


 SetProp
 SetProp _ __ _ ___   _ ___                                            ____
(SetProp U:id L:any): L:any                                            expr

                _                 ____    _
     Store item L as the property list of U.



6.5. Value Cell Functions
6.5. Value Cell Functions
6.5. Value Cell Functions

                                                          Eval
                                                          Eval
  The  contents of the value cell are usually accessed by Eval (Chapter 11)
   ValueCell                        Set    SetQ
   ValueCell                        Set    SetQ
or ValueCell (below) and changed by Set or SetQ.


 Set
 Set ___ __ _____ ___   ___                                            ____
(Set EXP:id VALUE:any): any                                            expr

     ___            __________
     EXP must be an identifier or a type mismatch error occurs.    The
                Set
                Set
     effect  of Set is replacement of the item bound to the identifier
        _____
     by VALUE.  If the identifier is not a LOCAL variable or  has  not
     been declared GLOBAL, it is automatically declared FLUID with the
     resulting warning message:  

     *** EXP declared FLUID 

     ___
     EXP must not evaluate to T or NIL or an error occurs:

     ***** Cannot change T or NIL 


 SetQ
 SetQ ________ __ _____ ___   ___                                     _____
(SetQ VARIABLE:id VALUE:any): any                                     fexpr

                                           ________
     The  value  of the current binding of VARIABLE is replaced by the
              _____
     value of VALUE.

        (SETQ X 1)

     is equivalent to 

        (SET 'X 1)

     SetQ
     SetQ
     SetQ  now  conforms  to  the  Common  LISP   standard,   allowing
     sequential assignment: 
Identifiers                   7 February 1983                    PSL Manual
page 6.8                                                        section 6.5

         (SETQ A 1 B 2)
            ==> (SETQ A 1)
                (SETQ B 2)


 DeSetQ
 DeSetQ _ ___ _ ___   _ ___                                           _____
(DeSetQ U:any V:any): V:any                                           macro

                                                                DeSetQ
                                                                DeSetQ
     This  is  a function in "USEFUL" (Load USEFUL; in RLISP).  DeSetQ
                        SetQ
                        SetQ
     is a destructuring SetQ.  That is, the first argument is a  piece
                                                         SetQ
        ____                 ____          __            SetQ
     of list structure whose atoms are all ids.  Each is SetQ'd to the
     corresponding part of the second argument.  For instance 

        (DeSetQ (a (b) . c) '((1) (2) (3) 4))

     SetQ
     SetQ
     SetQ's a to (1), b to 2, and c to ((3) 4).


 PSetQ
 PSetQ  ________ __ _____ ___    _________                            _____
(PSetQ [VARIABLE:id VALUE:any]): Undefined                            macro

     Part of the USEFUL package (LOAD USEFUL).  

        (PSETQ VAR1 VAL1 VAR2 VAL2 ...  VARn VALn)

     SetQ
     SetQ
     SetQ's  the  VAR's to the corresponding VAL's.  The VAL's are all
     evaluated before any assignments are made.  That is,  this  is  a
              SetQ
              SetQ
     parallel SetQ.


 SetF
 SetF  ___ ____ ___ ___    ___ ___                                    _____
(SetF [LHS:form RHS:any]): RHS:any                                    macro

                                   SetF   SetF
                                   SetF   SetF
     There  are  two  versions  of SetF.  SetF is redefined on loading
                                                         SetF     SetF
                                                         SetF     SetF
     USEFUL.  The description below is for the resident  SetF.    SetF
     provides  a  method  for  assigning  values  to  expressions more
                         __
     general than simple ids.  For example:

        (SETF (CAR X) 2)
            ==> CAR X := 2;

     is equivalent to 

        (RPLACA X 2)

                 SetF
                 SetF
     In general, SetF has the form

        (SetF LHS RHS)

              ___                                               ___
     in which LHS is the "left hand side" to be assigned to and RHS is
                                             ___
     evaluated to the value to be assigned.  LHS can  be  one  of  the
     following:


                               SetQ
     __                        SetQ
     id                        SetQ  is  used to assign a value to the
PSL Manual                    7 February 1983                   Identifiers
section 6.5                                                        page 6.9

                               __
                               id.
      Eval                     Set                         SetQ
      Eval                     Set                         SetQ
     (Eval expression)         Set  is  used  instead  of  SetQ.    In
                                              Eval
                                              Eval
                               effect,  the  "Eval"  cancels  out  the
                                Quote
                                Quote
                               "Quote" which would normally be used.
      Value                                           Eval
      Value                                           Eval
     (Value expression)        Is treated the same as Eval.
      Car                      RplacA
      Car ____                 RplacA
     (Car pair)                RplacA  is  used  to store into the Car
                               "field".
      Cdr                      RplacD
      Cdr ____                 RplacD
     (Cdr pair)                RplacD is used to store  into  the  Cdr
                               "field".
      GetV                     PutV
      GetV ______              PutV
     (GetV vector)             PutV   is   used   to  store  into  the
                               appropriate location.
      Indx                     SetIndx
      Indx                     SetIndx
     (Indx "indexable object") SetIndx  is  used  to  store  into  the
                               object.
      Sub                      SetSub
      Sub ______               SetSub
     (Sub vector)              SetSub   is  used  to  store  into  the
                               appropriate subrange of the vector.


                              Car           Cdr          SetF
                      ___     Car ____      Cdr  ____    SetF
     Note that if the LHS is (Car pair) or (Cdr  pair),  SetF  returns
                                                      SetF      RplacA
                                         ___          SetF      RplacA
     the  modified  pair  instead of the RHS, because SetF uses RplacA
         RplacD
         RplacD
     and RplacD in these cases.

                                              SetF        Caar   Cadr
                                              SetF        Caar   Cadr
     Loading USEFUL brings in declarations to SetF about  Caar,  Cadr,
          Cddddr
          Cddddr
     ...  Cddddr.    This  is  rather  handy with constructor/selector
                                                               Cadadr
                                                               Cadadr
     macros.  For instance, if FOO is a selector which maps to Cadadr,
     

        (SETF (FOO X) Y)

     works; that is, it maps to something which does a 

        (RPLACA (CDADR X) Y)

     and then returns X. 


 PSetF
 PSetF  ___ ____ ___ ___    _________                                 _____
(PSetF [LHS:form RHS:any]): Undefined                                 macro

                                                PSetF         SetF
                                                PSetF         SetF
     Part of the USEFUL package (LOAD USEFUL).  PSetF does a  SetF  in
                                                           ___
     parallel: i.e. it evaluates all the right hand sides (RHS) before
                                           ___
     assigning any to the left hand sides (LHS).


 MakeUnBound
 MakeUnBound _ __   _________                                          ____
(MakeUnBound U:id): Undefined                                          expr

           _               __
     Make  U  an  unbound  id by storing a "magic" number in the value
     cell.


 ValueCell
 ValueCell _ __   ___                                                  ____
(ValueCell U:id): any                                                  expr

                                         __      _
     Safe access to the value cell of an id.  If U is not an id a type
                                     _
     mismatch error is signalled; if U is an unbound id, an unbound id
Identifiers                   7 February 1983                    PSL Manual
page 6.10                                                       section 6.5

                                                                  _
     error  is  signalled.    Otherwise  the  current  value  of  U is
                              Value     LispVar
                              Value     LispVar
     returned.  [See also the Value and LispVar  functions,  described
     in Chapter 20, for more direct access].


 UnBoundP
 UnBoundP _ __   _______                                               ____
(UnBoundP U:id): boolean                                               expr

                   _
     Tests whether U has no value.

  [???  Define  and  describe  General Property LISTs or hash-tables. See
  [???  Define  and  describe  General Property LISTs or hash-tables. See
  [???  Define  and  describe  General Property LISTs or hash-tables. See
  Hcons. ???]
  Hcons. ???]
  Hcons. ???]



6.6. Package System Functions
6.6. Package System Functions
6.6. Package System Functions

  To get the package system (Load Package).  An example of the use of  this
system is at the end of this section.

  The  character  "\"  is  normally  reserved  in the basic Read-Table (see
Chapter 12) to make up multi-part names of the form  "PackageName\LocalId".
If the package system is loaded, the Intern process starts searching a path
in  a  linked  structure from "PackageName", itself an id accessible in the
"CurrentPackage".  The print-name is still "LocalId",  but  the  additional
                                                        Prin1     Prin2
                                                        Prin1     Prin2
package  field  in  each  id  records  "PackageName".   Prin1 and Prin2 are
modified to access this field in loading the package system.  The  root  of
the  tree  is the GLOBAL package, indicated by \.  If the package system is
loaded, the basic id hash table is made into the GLOBAL package.  Thus  \ID
is guaranteed in the root (in fact the pre-existing id hash table).

  [???  Explain further or at least more clearly. ???]
  [???  Explain further or at least more clearly. ???]
  [???  Explain further or at least more clearly. ???]

  The following fluid variables are managed by the package system.


                   __________                                        ______
\CURRENTPACKAGE!* [Initially: Global]                                global

     This   is   the   start   of   the   search  path  if  interning.
     \CurrentPackage!*
     \CurrentPackage!*
     \CurrentPackage!* is rebound in the token scanner on encountering
     a "\".


                 __________                                          ______
\PACKAGENAMES!* [Initially: (Global)]                                global

     List of ALL package names currently created.

  Our current package model uses a  set  of  general  path  functions  that
access  functions  specific  to  each level of the id hash table tree to do
various things: "Localxxxx(s)" and "Pathxxxx(s)" in which "xxxx" is one  of
          InternP, Intern, RemOb, MapObl
          InternP, Intern, RemOb, MapObl
the  set (InternP, Intern, RemOb, MapObl).  By storing different functions,
each package may have a different structure and associated functions.   The
                                           ______
current implementation of a package uses a vector
PSL Manual                    7 February 1983                   Identifiers
section 6.6                                                       page 6.11

[Name Father GetFn PutFn RemFn MapFn]


                                                       __
stored under the indicator 'Package on the PackageName id.

  A  simple  bucket  id hash table can also be used for experiments, or the
user can build his own.  As far as possible, each function  checks  that  a
legal package is given before performing the operation.  

  [??? Should we have a package Tag ???]
  [??? Should we have a package Tag ???]
  [??? Should we have a package Tag ???]

  The following functions should be used.  


 \CreatePackage
 \CreatePackage ____ __ _____________ __   __                          ____
(\CreatePackage NAME:id FATHERPACKAGE:id): id                          expr

     This  creates  a  convenient  size  id  hash table, generates the
     functions to manage it  for  this  package,  and  links  the  new
                       _____________
     package  to  the  FATHERPACKAGE so that path searches for ids are
     required.


 \SetPackage
 \SetPackage ____ __   __                                              ____
(\SetPackage NAME:id): id                                              expr

                                     ______
     Selects another package such as GLOBAL\.


 \PathInternP
 \PathInternP _  __ ______    _______                                  ____
(\PathInternP S:{id string}): boolean                                  expr

                                              _
     Searches from CurrentPackage!* to see if S is interned.


 \PathIntern
 \PathIntern _  __ ______    __                                        ____
(\PathIntern S:{id string}): id                                        expr

                          __
     Look up or insert an id.


 \PathRemob
 \PathRemob _  __ ______    __                                         ____
(\PathRemob S:{id string}): id                                         expr

     Remobs, puts in NIL package.


 \PathMapObl
 \PathMapObl _ ________   ___                                          ____
(\PathMapObl F:function): NIL                                          expr

             _        __
     Applies F to ALL ids in path.


 \LocalInternP
 \LocalInternP _  __ ______    _______                                 ____
(\LocalInternP S:{id string}): boolean                                 expr

     Searches in CURRENTPACKAGE!*.
Identifiers                   7 February 1983                    PSL Manual
page 6.12                                                       section 6.6

 \LocalIntern
 \LocalIntern _  __ ______    __                                       ____
(\LocalIntern S:{id string}): id                                       expr

                                                     __
     Look  up  or insert in CURRENTPACKAGE!* (forces ids uninterned in
     CURRENTPACKAGE!* into CURRENTPACKAGE!*) .


 \LocalRemob
 \LocalRemob _  __ ______    __                                        ____
(\LocalRemob S:{id string}): id                                        expr

     Remobs, puts in NIL package.


 \LocalMapObl
 \LocalMapObl _ ________   ___                                         ____
(\LocalMapObl F:function): NIL                                         expr

             _        __
     Applies F to ALL ids in (CurrentPackage!*).

                 ______
  Note that if a string is used, it CANNOT include the \.  Also, since most
__
ids are "RAISED" on input, be careful.

                           \PathIntern
                           \PathIntern
  Current intern, etc. are \PathIntern, etc.

  Several restrictions are placed on the use  of  packages  when  compiled.
Since  it  is a loaded module and not integrated with the basic PSL system,
all ids in the compiled package are Interned in  Global\  before  they  are
defined.    This  requires  a  slightly  more  complex  loading  system for
packages.  Names and function ids which conflict with names in Global\  (or
other  packages  in  the path) must be forced into the id hash table of the
desired package.  The  package  is  compiled  WITHOUT  the  package  module
loaded.

  In  addition,  if a function call must be issued for a function which has
been redefined in the package the function name  must  be  changed.    When
                                     Fasl
                                     Fasl
PACKAGE  has  been  integrated  with Fasl and PSL, it will be sufficient to
prefix the  function  name  with  the  package  name  (e.g.  Global\Print).
Currently, one must actually change the function name (e.g. Global!.Print).

  Other problems in the package system include:


   a. Single  character  identifiers  are  handled specially (i.e. not
      interned) and therefore may not be used in any packages  without
      doing an explicit intern

   b. By leaving the the package identifier and '\' off the identifier
      will  place  it  in  the  Global\ package instead of the current
      package

   c. If an identifier is  installed  in  the  Global\  package,  then
      reference  to it with another package identifier will return the
      Global\ value instead of issuing an error


                                                                      Print
                                                                      Print
  As an example, a small package which redefines the system function  Print
PSL Manual                    7 February 1983                   Identifiers
section 6.6                                                       page 6.13

is shown.  The assumed file name is PrintPack.SL.

   (De GetFieldFn (Relation Field)
             (Slotdescslotfn
                (Cdr (Assoc Field
                        (Dsdescslotalist Getdefstruct Relation)))))

     (Df Print (Args)
        (Prog (Fields)
           (Setq Fields (Get (Car Args) 'Fields))
           (Foreach Elem In (Eval (Car Args)) Do
              (Cons
                  Global!.Print
                  (Foreach Field In Fields Collect
                     (Apply (GetFieldFn
                                  (Car Args) Field) ('List Elem)))))
           (Return (Car Args))))

  This  package  would  be  compiled as follows (immediately after entering
PSL):

   (Faslout "PrintPackage")
   (Dskin "PrintPack.SL"$)
   (Faslend)
   (Quit)

  This package would be loaded as follows (immediately after entering PSL):

   (Load '(Defstruct Package))
         (CopyD 'Global!.Print Print)
         (Progn (\CreatePackage 'PrintPack 'Global)
                (\SetPAckage 'PrintPack)
                (LocalIntern 'Print))
         (Faslin "PrintPack.B")



6.7. System Global Variables, Switches and Other "Hooks"
6.7. System Global Variables, Switches and Other "Hooks"
6.7. System Global Variables, Switches and Other "Hooks"


6.7.1. Introduction
6.7.1. Introduction
6.7.1. Introduction

  A number of global variables provide global control of the  LISP  system,
or  implement  values  which  are  constant  throughout execution.  Certain
options are controlled by switches, with T or NIL properties (e.g.  ECHOing
as  a  file is read in); others require a value, such as an integer for the
current output base.  PSL has the convention  (following  the  REDUCE/RLISP
convention) of using a "!*" in the name of the variable: !*XXXXX for GLOBAL
variables  expecting  a  T/NIL  value  (called "switches"), and XXXXX!* for
other GLOBALs.  Chapter 26 is an index of  switches  and  global  variables
used in PSL.
Identifiers                   7 February 1983                    PSL Manual
page 6.14                                                       section 6.7

  [??? These should all be FLUIDs, so that ANY one of these variables may
  [??? These should all be FLUIDs, so that ANY one of these variables may
  [??? These should all be FLUIDs, so that ANY one of these variables may
  be rebound, as appropriate ???]
  be rebound, as appropriate ???]
  be rebound, as appropriate ???]


6.7.2. Setting Switches
6.7.2. Setting Switches
6.7.2. Setting Switches

  Strictly  speaking, XXXX is a switch and !*XXXX is a corresponding global
variable that assumes the T/NIL value; both  are  loosely  referred  to  as
switches elsewhere in the manual.

       On      Off
       On      Off
  The  On  and Off functions are used to change the values of the variables
associated with switches.  Some switches contain an s-expression  on  their
                                          1
property lists under the indicator 'SIMPFG .  The s-expression has the form
     Cond
     Cond
of a Cond list:


((T (action-for-ON)) (NIL (action-for-OFF)))


                                                  On     Off
                                                  On     Off
If  the  'SIMPFG  indicator  is present, then the On and Off functions also
evaluate the appropriate action in the s-expression.


 On
 On  _ __    ____                                                     _____
(On [U:id]): None                                                     macro

              _
     For each U, the associated !*U variable is set to T.   If  a  "(T
                                                GET
                                                GET  _
     (action-for-ON))"  clause  is  found  by  (GET  U  'SIMPFG),  the
     "action" is EVAL'ed.


 Off
 Off  _ __    ____                                                    _____
(Off [U:id]): None                                                    macro

              _
     For each U, the associated !*U variable is set  to  NIL.    If  a
                                                   GET
                                                   GET _
     "(NIL  (action-for-OFF)"  clause is found by (GET U 'SIMPFG), the
     "action" is EVAL'ed.

   (On Comp Ord Usermode)

  will set !*Comp, !*Ord, and !*Usermode to T.

  Note that 




_______________

  1
   The name SIMPFG comes  from  its  introduction  in  the  REDUCE  algebra
system,   where   it   was  used  as  a  "simp  flag"  to  specify  various
simplifications to be performed as various switches were turned on or off.
PSL Manual                    7 February 1983                   Identifiers
section 6.7                                                       page 6.15

   (Get 'Cref 'Simpfg)

returns 

   ((T (Crefon)) (Nil (Crefoff)))

         ____                          ____
Setting  CREF  on  will  result  in  !*CREF being set to T and the function
Crefon
Crefon
Crefon being evaluated.


6.7.3. Special Global Variables
6.7.3. Special Global Variables
6.7.3. Special Global Variables


     __________                                                      ______
NIL [Initially: NIL]                                                 global

     NIL is a special GLOBAL variable.  It  is  protected  from  being
                 Set    SetQ
                 Set    SetQ
     modified by Set or SetQ.


   __________                                                        ______
T [Initially: T]                                                     global

     T  is  a  special  GLOBAL  variable.   It is protected from being
                 Set    SetQ
                 Set    SetQ
     modified by Set or SetQ.


6.7.4. Special Put Indicators
6.7.4. Special Put Indicators
6.7.4. Special Put Indicators

                                                            __
  Some  actions  search  the  property  list  of  relevant  ids  for  these
indicators:


                   __
'HELPFUNCTION  An  id,  a  function  to  be executed to give help about the
               topic; ideally for a complex topic,  a  clever  function  is
               used.

'HELPSTRING    A help string, kept in core for important or short topics.

'HELPFILE      The  most common case, the name of a file to print; later we
               hope to load this file into an EMODE buffer for perusal in a
               window.

'SWITCHINFO    A  string  describing  the  purpose  of  the   SWITCH,   see
               ShowSwitches
               ShowSwitches
               ShowSwitches below.

'GLOBALINFO    A   string   describing  the  purpose  of  the  GLOBAL,  see
               ShowGlobals
               ShowGlobals
               ShowGlobals below.

                                                       __
'BREAKFUNCTION Associates a function to be run with an Id  typed  at  Break
               Loop, see Chapter 14.

'TYPE          PSL uses the property TYPE to indicate whether a function is
               a FEXPR, MACRO, or NEXPR; if no property is present, EXPR is
Identifiers                   7 February 1983                    PSL Manual
page 6.16                                                       section 6.7

               assumed.

'VARTYPE       PSL  uses  the  property  VARTYPE  to  indicate  whether  an
               __________
               identifier is of type GLOBAL or FLUID.

'!*LAMBDALINK  The interpreter also looks under '!*LAMBDALINK for a  Lambda
               expression, if a procedure is not compiled.


6.7.5. Special Flag Indicators
6.7.5. Special Flag Indicators
6.7.5. Special Flag Indicators


                   __
'EVAL     If  the  id  is  flagged  EVAL,  the RLISP top-loop evaluates and
                                              On Defn
                                  __          On Defn
          outputs any expression (id ...)  in On Defn (!*DEFN := T) mode.

                 __
'IGNORE   If the id is flagged IGNORE, the  RLISP  top-loop  evaluates  but
                                                      On Defn
                                          __          On Defn
          does NOT output any expression (id ...)  in On Defn (!*DEFN := T)
          mode.

                                                                  PutD
                 __                                               PutD
'LOSE     If  an id has the 'LOSE flag, it will not be defined by PutD when
          it is read in.

'USER     'USER is put on all functions  defined  when  in  !*USERMODE,  to
          distinguish them from "system" functions.  See Chapter 10.


                         LoadTime     CompileTime
                         LoadTime     CompileTime
  See also the functions LoadTime and CompileTime in Chapter 18.

  [??? Mention Parser properties ???]
  [??? Mention Parser properties ???]
  [??? Mention Parser properties ???]


6.7.6. Displaying Information About Globals
6.7.6. Displaying Information About Globals
6.7.6. Displaying Information About Globals

       Help
       Help
  The  Help  function  has two options, (HELP SWITCHES) and (HELP GLOBALS),
which should display the current state of a variety of switches and globals
respectively.  These calls have the same  effect  as  using  the  functions
below, using an initial table of Switches and Globals.

                  ShowSwitches
                  ShowSwitches
  The  function  (ShowSwitches  switch-list)  may  be  used to print names,
current settings and purpose of some switches.  Use NIL as the  switch-list
                                                  ShowSwitches
                                                  ShowSwitches
to  get  information on ALL switches of interest; ShowSwitches in this case
       MapObl
       MapObl
does a MapObl (Section 6.3.1) looking for 'SwitchInfo property.

              ShowGlobals
              ShowGlobals
  Similarly, (ShowGlobals global-list) may be used to print  names,  values
and  purposes  of  important  GLOBALs.   Again, NIL used as the global-list
       ShowGlobals         MapObl
       ShowGlobals         MapObl
causes ShowGlobals to do a MapObl looking for a 'GlobalInfo  property;  the
result is some information about all globals of interest.
