1 RELEASE NOTES, MEDLEY BETA RELEASE 1 RELEASE NOTES, MEDLEY BETA RELEASE APPENDIX B. SEDIT 1 APPENDIX B. SEDIT 1 APPENDIX B. SEDIT%THE LISP EDITOR 6 SEdit is the Xerox Lisp structure editor. It allows you to edit Xerox Lisp code directly in memory. This editor replaces DEdit in Chapter 16, Structure Editor, of the Interlisp-D Reference Manual. First introduced in Lyric, the SEdit structure editor has been greatly enhanced in the Medley release. Medley additions are indicated with revision bars in the right margin. All symbols referenced in this appendix are external in the package named "SEdit", unless otherwise qualified. 2 16.1 SEdit - The Structure Editor 1 As a structure (EDITING% LISP% CODE% IN% MEMORY NIL Editing% Lisp% Code% in% Memory NIL (B) 1)editor, SEdit alters Lisp code directly in memory. The effect this has on the running system depends on what is being edited. For Common Lisp definitions, SEdit always edits a copy of the object. For example, with functions, it edits the definition of the function. What the system actually runs is the installed function, either compiled or interpreted. The primary difference between the definition and the installed function is that comment forms are removed from the definition to produce the installed function. The changes made while editing a function will not be installed until the edit session is complete. For Interlisp functions and macros, SEdit edits the actual structure that will be run. An exception to this is an edit of an EXPR definition of a compiled function. In this case, changes are included and the function is unsaved when the edit session is completed. SEdit edits all other structures, such as variables and property lists, directly. SEdit installs all changes as they are made. If an error is made during an SEdit session, abort the edit with an Abort command (see Section 16.1.7, Command Keys). This command undoes all changes from the beginning of the edit session and exits from SEdit without changing your environment. If the definition being edited is redefined while the edit window is open, SEdit redisplays the new definition. Any edits on the old definition will be lost. If SEdit was busy when the redefinition occurred, the SEdit window will be gray. When SEdit is no longer busy, position the cursor in the SEdit window and press the left mouse button; SEdit will get the new definition and display it. 16.1.1 An Edit Session 1 The List Structure Editor discussion in Chapter 3, Language Integration, explains how to start an editor in Xerox Lisp. Whenever you call SEdit, a new (STARTING% AN% SEDIT% SESSION% NIL Starting% an% SEdit% session% NIL (B) 2)SEdit window is created. This SEdit window has its own process, and thus does not rely on an Exec to run in. You can make edits in the window, shrink it while you do something else, expand it and edit some more, and finally close the window when you are done. Throughout an edit session, SEdit remembers everything that you do through a change history. All edits can be undone and redone sequentially. When an edit session ends, SEdit forgets this information and installs the changes in the system. The session ends with an event signalling to the editor that changes are complete. Three events signal (ENDING% AN% SEDIT% SESSION% NIL Ending% an% SEdit% session NIL (B) 2)completion: f Closing the window. Do this to terminate the edit session when you are finished. f Shrinking the window. Shrink the window when you have made some edits and may want to continue the editing session at a later time. f Typing one of the Completion Commands, listed below. Each of these commands has the effect of installing your changes, completing the edit, and returning the TTY process to the Exec. They vary in what is done in addition to completing. Using these commands the definition that you were editing can be automatically compiled, the edit window can be closed, or both. A new edit session begins when you come back to an SEdit after completing. The change history is discarded at this point. If the Exec is waiting for SEdit to return before going on, complete the edit session using any of the methods above to alert the Exec that SEdit is done. The TTY process passes back to the Exec . 16.1.2 SEdit Carets 1 There are two carets in SEdit, the edit caret(EDIT% CARET% IN% SEDIT% NIL Edit% caret% in% SEdit% NIL (B) 2) and the structure caret(STRUCTURE% CARET% IN% SEDIT NIL Structure% caret% in% SEdit% NIL (B) 2). The edit caret appears when characters are edited within a single structure, such as an atom, string, or comment. Anything typed in will appear at the edit caret as part of the structure that the caret is within. The edit caret looks like this: (@@ @ XdDD  `@`0 The structure caret appears when the edit point is between structures, so that anything inserted will go into a new structure. It looks like this: )   ,2""2, ? SEdit changes the caret frequently, depending on where you are in the structure you are editing, and how the caret is positioned. The left mouse button allows an edit caret position to be set. The middle mouse button allows the structure caret position to be set . 16.1.3 The Mouse 1 In SEdit, the mouse buttons (MOUSE% BUTTONS% NIL Mouse% buttons% NIL (B) 3 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% )are used as follows. The left mouse button(LEFT% MOUSE% BUTTON NIL Left% mouse% button NIL (B) 3 SUBNAME IN% SEDIT% % SUBTEXT in% SEdit% ) positions the mouse cursor to point to parts of Lisp structures. The middle mouse button(MIDDLE% MOUSE% BUTTON NIL Middle% mouse% button NIL (B) 3 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% ) positions the mouse cursor to point to whole Lisp structures. Thus, selecting the Q in LEQ using the left mouse button selects that character, and sets the edit caret after the Q: F>8 D D`;` Any characters typed in at this point would be appended to the atom LEQ. Selecting the same letter using the middle mouse button selects the whole atom (this convention matches TEdit's character/word selection convention), and sets a structure caret between the LEQ and the n: G""""""88|| At this point, any characters typed in would form a new atom between the LEQ and the n. Larger structures can be selected in two ways. Use the middle mouse button to position the mouse cursor on the parenthesis of the desired list to select that list. Press the mouse button multiple times, without moving the mouse, extends the selection. Using the previous example, if the middle button were pressed twice, the list (LEQ ...) would be selected: K B @B`@, 2 " " " C"@@@  Pressing the button a third time would cause the list containing the (LEQ n 1) to be selected. The right mouse button(RIGHT% MOUSE% BUTTON NIL Right% mouse% button NIL (B) 3 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% ) positions the mouse cursor for selecting sequences of structures or substructures. Extended selections are indicated by a box enclosing the structures selected. The selection is extended in the same mode as the original selection. That is, if the original selection were a character selection, the right button could be used to select more characters in the same atom. Extended selections also have the property of being marked for pending deletion. That is, the selection takes the place of the caret, and anything typed in is inserted in place of the selection. For example, selecting the E by pressing the left mouse button and selecting the Q by pressing the right mouse button would produce: E9EE`EEEE9  Similarly, pressing the middle mouse button and then selecting with the right mouse button extends the selection by whole structures. Thus, in our example, pressing the middle mouse button to select LEQ and pressing the right mouse button to select the 1 would produce: I PDĀXD@dD@DD@DD@DD@ώDP This is not the same as selecting the entire list, as above. Instead, the elements in the list are collectively selected, but the list itself is not. 16.1.4 Gaps 1 The SEdit structure editor requires that everything edited must have an underlying Lisp structure, even if the structure is not directly displayed. For example, with quoted forms the actual structure might be (QUOTE GREEN), although this would be displayed as 'GREEN. Even when the user is in the midst of typing in a form, the underlying Lisp structure(LISP% STRUCTURES% NIL Lisp% structures NIL (B) 4 SUBNAME SEDIT% GAPS% FOR% SUBTEXT SEdit% gaps% for% ) must exist. Because of this necessity, SEdit provides (GAPS NIL Gaps NIL (B) 4 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% )gaps to serve as dummy Lisp objects during typing. SEdit does not need a gap for every form typed in, but gaps are necessary for quoted objects. When something is typed that requires SEdit to build a Lisp structure and thus create a gap, as the quote character does, the gap will appear marked for pending deletion. This means it is ready to be replaced by the structure to be typed in. In this way it is possible to type special structures, like quotes, directly, while SEdit maintains the structure. A gap looks like: @>@ A gap displayed after a quote has been typed in would look like this: H"" with the gap marked for pending deletion, ready for typein of the object to be quoted. 16.1.5 Special Characters 1 A few characters have (SPECIAL% CHARACTERS% NIL Special% characters% NIL (B) 4 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% )special meaning in Lisp, and are treated specially by SEdit. SEdit must always have a complete structure to work on at any level of the edit. This means that SEdit needs a special way to type in structures such as lists, strings, and quoted objects. In most instances these structures can be typed in just as they would be to a regular Exec, but in a few cases this is not possible. Lists- ( and ) (LISTS NIL Lists NIL (B) 4 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% % )Lists begin with an open parenthesis character (. Typing an open parenthesis gives a balanced list, that is, SEdit inserts both an open and a close parenthesis. The structure caret is between the two parentheses. List elements can be typed in at the structure caret. When a close parenthesis, ) is typed, the caret will be moved outside the list (and the close parenthesis), effectively finishing the list. Square bracket characters, [ and ], have no special meaning in SEdit, as they have no special meaning in Common Lisp. Quoted Structures: SEdit handles the (QUOTED% STRUCTURES NIL Quoted% structures NIL (B) 5 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% % )quote keys so that it is possible to type in all quote forms directly. When typing one of the following quote keys at a structure caret, the quote character typed will appear, followed by a gap to be replaced by the object to be quoted. Single Quote $ ' Use to enter quoted structures. Backquote $` Use to enter backquoted structures. Comma $ , Use to enter comma forms, as used with a Backquote form. At Sign $ @ Use after a comma to create a comma-at-sign gap. This allows type-in of comma-at forms, e.g. ,@list, as used within a Backquote form. Dot $ . Use the dot (period) after a comma to create a comma-dot gap. This allows type-in of comma-dot forms, e.g. ,.list, as used within a Backquote form. Hash Quote $ #' Use this two character sequence to enter the CL:FUNCTION abbreviation hash$quote (#'). Dotted Lists: The dot, or period, character (.) is used to type dotted lists in SEdit. After typing a dot, SEdit inserts a dot and a gap to fill in for the tail of the list. To dot an existing list, point the cursor between the last and second to the last element in the list, and type a dot. To undot a list, select the tail of the list before the dot while holding down the SHIFT key. Escape- \ or % Use to (ESCAPE% NIL Escape NIL (B) 5 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% )escape from a specific typed in character. Use the escape key to enter characters, like parentheses, which otherwise have special meaning to the SEdit reader. Press the escape key then type in the character to escape. SEdit uses the escape key appropriate to the environment it is editing in; it depends on the readtable that was current when the editor was started. The backslash key (\) is used when editing Common Lisp, and the percent key (%) is used when editing Interlisp. Multiple Escape- | Use the multiple escape key, the vertical bar character (|), to escape a sequence of typed in characters. SEdit always balances multiple escape characters. When one multiple escape character is typed, SEdit produces a balanced pair, with the caret between them, ready for typing in the characters to be escaped. If you type a second vertical bar, the caret moves after the second vertical bar, and is still within the same atom, so that you can add more unescaped characters to the atom. Comments- ; The comment(COMMENTS NIL Comments NIL (B) 5 SUBNAME IN% SEDIT% SUBTEXT in% SEdit% % ) key, a semicolon (;), starts a comment. When a semicolon is typed, an empty comment is inserted with the caret in position for typing in the comment. Comments can be edited like strings. There are three levels of comments supported by SEdit: single, double, and triple. Single semicolon comments are formatted at the comment column, about three-quarters of the way across the SEdit window, towards the right margin. Double semicolon comments are formatted at the current indentation of the code that they are in. Triple semicolon comments are formatted against the left margin of the SEdit window. The level of a comment can be increased or decreased by pointing after the semicolon, and either typing another semicolon, or backspacing over the preceding semicolon. Comments can be placed anywhere in your Common Lisp code. However, in Interlisp code, they must follow the placement rules for Interlisp comments. Strings- " Enter (STRINGS NIL Strings NIL (B) 6 SUBNAME IN% SEDIT% SUBTEXT in% SEdit)strings in SEdit by typing a double quote ("). SEdit balances the double quotes. When one is typed, SEdit produces a second, with the caret between the two, ready for typing the characters of the string. If a double quote character is typed in the middle of a string, SEdit breaks the string into two smaller strings, leaving the caret between them. 16.1.6 Commands 1 SEdit commands are most easily entered through the keyboard. When possible, SEdit uses a named key on the keyboard, for example, the DELETE key. The other commands are either Meta, Control, or Meta-Contol key combinations. For the alphabetic command keys, either uppercase or lowercase will work. There are two menus available, as an alternative means of invoking commands. They are the middle button popup menu, and the attached command menu. These menus are described in more detail below. 16.1.6 Editing Commands 1 (REDISPLAY (Editor Command) Redisplay NIL (B) 6)Redisplay: Control-L(CONTROL-L (Editor Command) Control-L NIL (B) 6) [Editor Command] (1) Redisplays the structure being edited. Delete Selection(DELETE% SELECTION (Editor Command) Delete% Selection NIL (B) 6): DELETE [Editor Command] (1) Deletes the current selection. Delete Word(DELETE% WORD (Editor Command) Delete% Word NIL (B) 6): Control-W(CONTROL-W (Editor Command) Control-W NIL (B) 6) [Editor Command] (1) Deletes the previous atom or whole structure. If the caret is in the middle of an atom, deletes backward to the beginning of the atom only. 16.1.7 Completion Commands 1 (ABORT (Editor Command) Abort NIL (B) 6)Abort: Meta-A(META-A (Editor Command) Meta-A NIL (B) 6) [Editor Command] (1) Aborts. This command must be confirmed. All changes since the beginning of the edit session are undone, and the edit is closed. The following commands signal completion of an edit session and install the structure you were editing. Control-X(CONTROL-X (Editor Command) Control-X NIL (B) 6) [Editor Command] (1) Signals the system that this edit is complete. The window remains open, though, so the user can see the edit and start editing again directly. Control-C(CONTROL-C (Editor Command) Control-C NIL (B) 6) [Editor Command] (1) Signals the system that this edit is complete and compiles the definition being edited. The variable *compile-fn* determines the function to be called to do the compilation. See the Options section below. Meta-Control-X(META-CONTROL-X (Editor Command) Meta-Control-X NIL (B) 7) [Editor Command] (1) Signals the system that this edit is complete and closes the window. Meta-Control-C(META-CONTROL-C (Editor Command) Meta-Control-C NIL (B) 7) [Editor Command] (1) Signals the system that this edit is complete, compiles the definition being editing, and closes the window. 16.1.8 Undo Commands 1 Undo: Meta-U(META-U (Editor Command) Meta-U NIL (B) 7) or (UNDO (Editor Command) NIL NIL (B) 7)UNDO [Editor Command] (1) Undoes the last edit. All changes since the beginning of the edit session are remembered, and can be undone sequentially. (REDO (Editor Command) Redo NIL (B) 7)Redo: Meta-R(META-R (Editor Command) Meta-R NIL (B) 7) or (AGAIN (Editor Command) NIL NIL (B) 7)AGAIN [Editor Command] (1) Redoes the edit change that was just undone. Redo only works directly following an Undo. Any number of Undo commands can be sequentially redone. 16.1.9 Find Commands 1 Find: Meta-F(META-F (Editor Command) Meta-F NIL (B) 7) or (FIND (Editor Command) NIL NIL (B) 7)FIND [Editor Command] (1) Finds a specified structure, or sequence of structures. If there is a current selection, SEdit looks for the next occurrence of the selected structure. If there is no selection, SEdit prompts for the structure to find, and searches forward from the position of the caret. The found structure will be selected, so the Find command can be used to easily find the same structure again. If a sequence of structures is selected, SEdit will look for the next occurrence of the same sequence. Similarly, when SEdit prompts for the structure to find, you can type a sequence of structures to look for. The variable *wrap-search* controls whether or not SEdit wraps around from the end of the structure being edited and continues searching from the beginning. Reverse Find(REVERSE% FIND (Editor Command) Reverse% Find NIL (B) 7): Control-Meta-F(CONTROL-META-F (Editor Command) Control-Meta-F NIL (B) 7) [Editor Command] (1) Finds a specified structure, searching in reverse from the position of the caret. The variable *wrap-search* controls whether or not SEdit wraps around from the beginning of the structure being edited and continues searching from the end. Find Gap(FIND% GAP (Editor Command) Find% Gap NIL (B) 8): Meta-N (META-N% (Editor Command) Meta-N% NIL (B) 8)or SKIP-NEXT(SKIP-NEXT (Editor Command) NIL NIL (B) 8) [Editor Command] (1) Skips to the next gap in the structure, leaving it selected for pending deletion. (SUBSTITUTE (Editor Command) Substitute NIL (B) 8)Substitute: Meta-S(META-S (Editor Command) Meta-S NIL (B) 8) or SHIFT-FIND(SHIFT-FIND (Editor Command) NIL NIL (B) 8) [Editor Command] (1) Substitutes one structure, or sequence of structures, for another structure, or sequence, within the current selection. SEdit prompts you in the SEdit prompt window for the structures to replace, and the structures to replace with. The selection to substitute within must be a structure selection. To get a structure selection, click with the middle mouse button (not the left), and extend it, if necessary, with the right mouse button. If you begin with the left button, you will get an informational message "Select the structure to substitute within", because the selection was of characters, rather than structures. Delete Structure(DELETE% STRUCTURE (Editor Command) Delete% Structure NIL (B) 8): Meta-Control-S(META-CONTROL-S (Editor Command) Meta-Control-S NIL (B) 8) [Editor Command] (1) Removes all occurences of a structure or sequence of structures within the current selection. SEdit prompts the user in the SEdit prompt window for the structures to delete. 16.1.9 General Commands 1 Arglist(ARGLIST (Editor Command) Arglist NIL (B) 8): Meta-H(META-H (Editor Command) Meta-H NIL (B) 8) or (HELP (Editor Command) NIL NIL (B) 8)HELP [Editor Command] (1) Shows the argument list for the function currently selected, or currently being typed in, in the SEdit prompt window. If the argument list will not fit in the SEdit prompt window, it is displayed in the main Prompt Window. Convert Comments(CONVERT% COMMENTS (Editor Command) Convert% Comments NIL (B) 8): Meta-;(META-; (Editor Command) Meta-; NIL (B) 8) [Editor Command] (1) Converts old style comments in the selected structure to new style comments. This converter notices any list that begins with an asterisk (*) in the INTERLISP package (IL:*) as an old style comment. Section 16.1.11, Options, describes the converter options . Edit:(EDIT (Editor Command) Edit NIL (B) 8) Meta-O(META-O (Editor Command) Meta-O NIL (B) 8) [Editor Command] (1) Edits the definition of the current selection. If the selected name has more than one type of definition, SEdit asks for the type to be edited. If the selection has no definition, a menu pops up. This menu lets the user specify either the type of definition to be created, or no definition if none needs to be created. Eval:(EVAL (Editor Command) Eval NIL (B) 8) Meta-E(META-E (Editor Command) Meta-E NIL (B) 8) or Do-It(DO-IT (Editor Command) Do-It NIL (B) 8) [Editor Command] (1) Evaluates the current selection. If the result is a structure, the inspector is called on it, allowing the user to choose how to look at the result. Otherwise, the result is printed in the SEdit prompt window. The evaluation is done in the process from which the edit session was started. Thus, while editing a function from a break window, evaluations are done in the context of the break. Expand: Meta-X(META-X (Editor Command) Meta-X NIL (B) 8) or (EXPAND (Editor Command) NIL NIL (B) 8)EXPAND [Editor Command] (1) Replaces the current selection with its definition. This command can be used to expand macros and translate CLISP. Extract:(EXTRACT (Editor Command) Extract NIL (B) 9) Meta- /(META-% / (Editor Command) Meta-% / NIL (B) 9) [Editor Command] (1) Extracts one level of structure from the current selection. If the current selection is an atom, or if there is no selection, the next largest structure containing this atom, or caret, is used. This command can be used to strip the parentheses off a list or a comment, or to unquote a quoted structure. Inspect(INSPECT (Editor Command) Inspect NIL (B) 9): Meta-I(META-I (Editor Command) Meta-I NIL (B) 9) [Editor Command] (1) Inspect the current selection. (JOIN (Editor Command) Join NIL (B) 9)Join: Meta-J(META-J (Editor Command) Meta-J NIL (B) 9) [Editor Command] (1) Joins. This command joins any number of sequential Lisp objects of the same type into one object of that type. Join is supported for atoms, strings, lists, and comments. In addition, SEdit permits joining of a sequence of atoms and strings, since either type can easily be coerced into the other. In this case, the result of the Join will be an atom if the first object in the selection is an atom, otherwise the result will be a string. (MUTATE (Editor Command) Mutate NIL (B) 9)Mutate: Meta-Z(META-Z (Editor Command) Meta-Z NIL (B) 9) [Editor Command] (1) Mutates. This command allows the user to do arbitrary operations on a LISP structure. First select the structure to be mutated (it must be a whole structure, not an extended selection). When the user presses Meta-Z SEdit prompts for the function to use for mutating. This function is called with the selected structure as its argument, and the structure is replaced with the result of the mutation. For example, an atom can be put in upper case by selecting the atom and mutating by the function U-CASE. You can replace a structure with its value by selecting it and mutating by EVAL. Quote(QUOTE (Editor Command) Quote NIL (B) 9): Meta-' Meta-` Meta-, Meta-. Meta-@ or Meta-2 Meta-# or Meta-3 [Editor Command] (1) Quotes the current selection with the specified kind of quote, respectively, Single Quote, Backquote, Comma, Comma-At-Sign, Comma-Dot, or Hash-Quote. Parenthesize: Meta- )(META-% %) (Editor Command) Meta-% %) NIL (B) 9) or Meta-0(META-0 (Editor Command) Meta-0 NIL (B) 9) [Editor Command] (1) Parenthesizes the current selection, positioning the caret after the new list. Parenthesize: Meta- ((META-% %( (Editor Command) Meta-% %( NIL (B) 9) or Meta-9(META-9 (Editor Command) Meta-9 NIL (B) 9) [Editor Command] (1) Parenthesizes the current selection, positioning the caret at the beginning of the new list. Only a whole structure selection or an extended selection of a sequence of whole structures can be parenthesized. 16.1.10 Miscellaneous 1 Change Print Base(CHANGE% PRINT% BASE (Editor Command) Change% Print% Base NIL (B) 10): Meta-B(META-B (Editor Command) Meta-B NIL (B) 10) [Editor Command] (1) Changes Print Base. Prompts for entry of the desired Print Base, in decimal. SEdit redisplays fixed point numbers in this new base. Set Package(SET% PACKAGE (Editor Command) Set% Package NIL (B) 10): Meta-P(META-P (Editor Command) Meta-P NIL (B) 10) [Editor Command] (1) Changes the current package for this edit. Prompts the user, in the SEdit prompt window, for a new package name. SEdit will redisplay atoms with respect to that package. Attached Menu(ATTACH% MENU (Editor Command) Attach% Menu NIL (B) 10): Meta-M(META-M (Editor Command) Meta-M NIL (B) 10) [Editor Command] (1) Attaches a menu of the commonly used commands (the SEdit Command Menu) to the top of the SEdit window. Each SEdit window can have its own menu, if desired. 16.1.10 Help Menu 1 When the mouse cursor is positioned in the SEdit title bar and the middle mouse button is pressed, a Help Menu(HELP% MENU% COMMANDS NIL Help% Menu% Commands NIL (B) 10) of commands pops up. The menu looks like this: 93'ۛݻvݻwݲg)Tq۹@0`@0` ( HM@(HH@% "HH@%&>LHH@" AK0" AG PHLH HHO HHH PHHG@x @G bG HLH H HHOP O HHH0 H HH0HGGx0`  0`!G À(@HLH $@(@BHHOP % @BHHH0 $%&@0HH0$@" !GÀ"  @ 0`@ 0`! G bG8(@HLH H !"D(@HHO O!|% @HHH H#!@%&@2HHH# !"D" ! GG8" @@0`A@@0`AKG(ALH@(AHHH@% AHHH@%&AHH@" AGG" >0`~@0`AG(AH(A% ~H%&AH" AG" A0`~0`@(@0(|% @%&@0" @" @0`@0`!GYÁ.(@H"j$A1#(@⟏>A!!% @H @$!!%&@2H"B$A!#" !GAÁ!" 0`@0`! Ga#(@H$@(@⟏G% @HD%&@0 H@" ! G"  0`>@ 0`AK=z(@LH""(<HG">% HH@" %&HH"2"" AK ќ" >0`A 0`a@.(Q0@1(IG!% I@!%&E0!1" C" A  H0`A@0`A :H(A FI(BH% ABH%&AHFI" AH:H" AB<0`@0`/f,Ë(@LH5 3$LH(@HE! "'H% HE! "$H%&HHB! "$HH" B "#F" ` @I0`A0`!K(@(@I% @I%&@" !H"  0` 0`@ (@ (~ % @ %&@ " @" 0`A0`".(1#(!!% !!%&!#" "ȗ" A 0` 0`gx( ( %  %&  " @ȍN" @0` 0` pÞ( $H( % %&  $H" Æ"   0`0`%(!& (!$ % !$ %&!$ " D$ " 80@0`0@0`R(R"D@(G% 2D%&2"D@" ѝ3"  0` 0` ,8( 51"D"(@!!>8>% @!!  %&@!!"D"" @8"  0``@0` $#8(@$$$D($$$|% $$$@%&d$D" ã8"  > ?0`~@! 0`A!! |% AH !!# @%&AH !! "D" A !!?8" ~>0`|@!0`B@r% |H 2@ђ%&@H "D2 " @ 8" @  0``  0``.qq(Q@1(Q@! % J@! %&J@H!D " D@FgN!Dq" D@ The Help Menu lists each command and its corresponding Command Key. (In the menu, the letter C stands for CONTROL, while M indicates Meta.) The command selected is executed just as if the command had been entered from the keyboard. The menu remembers which command was selected last, and pops up with the mouse cursor next to that same command the next time the menu is used. This provides a very fast way to repeat the same command when using the mouse. 16.1.9 Command Menu 1 The SEdit Attached Command Menu(SEDIT% COMMAND% MENU NIL SEdit% Command% Menu NIL (B) 11) contains the commonly used commands. Use the Meta-M keyboard command to bring up this menu. The menu can be closed, independently of the SEdit window, when desired. The menu looks like: Gfo>q2g&|d>s'gٛsv]m;wwۻwn][owwۻwnkWogwۻWlkMoUUۺ7Jw[3;w6wg@&@&@&~||@>|g߀o?&67f`@3f llcc1&67f`@3f llc1&c666|`@36f llc0 &c666f`@>6| llc0 &66{>f`@0>f llc1&66{cf`@0cf llcc&;c||`@0cfc &@&@`&@&@&@@@~>ߏ||~@?~oa oocclf@0cc clldcclf@0cc Ìldcco6f@>cc͛ldcc6|@0cc ldccl>f@0cc dcclcf@0cc  lld|~>oߏcfv@?~c ol@@@@ϟ7?3? ٷ 11 @ٷ 0 100 @ٶ>083 ǀϟ6͇0<1 |"x ρ11 x ٰ11 @8?11>p@ۍ͌͌ϛmm==ǘ~߱~ٳ1`ٸ1``ǘ1|`ُ1`ك1`ٳ1``Ϗ> ~` All of the commands in the menu function identically to their corresponding keyboard commands, except for Find and Substitute. When Find is selected with the mouse cursor, SEdit prompts in the menu window, next to the Find button, for the structures to find. Type in the structures then select Find again. The search begins from the caret position in the SEdit window. Similarly, Substitute prompts, next to the Find button, for the structures to find, and next to the Substitute button for the structures to substitute with. After both have been typed in, selecting Substitute replaces all occurrences of the Find structures with the Substitute structures, within the current selection. To do a confirmed substitute, set the edit point before the first desired substitution, and select Find. Then if you want to substitute that occurrence of the structure, select Substitute. Otherwise, select Find again to go on. Selecting either Find or Substitute with the right mouse button erases the old structure to find or substitute from the menu, and prompts for a new one. 16.1.11 SEdit Window Region Manager 1 SEdit provides user redefinable functions which control how SEdit chooses the region for a new edit window. (Get-Window-Region(GET-WINDOW-REGION (Function) Get-Window-Region NIL (B) 11) CONTEXT REASON NAME TYPE) [Function] (1) This function is called when SEdit wants to know where to place a window it is about to open. This happens whenever the user starts a new SEdit or expands an Sedit icon.The default behavior is to pop a window region off SEdit's stack of regions that have been used in the past. If the stack is empty, SEdit prompts for a new region. This function can be redefined to provide different behavior. It is called with the edit CONTEXT, a REASON for needing a region, the NAME of the structure to be edited, and the TYPE of the structure to be edited. The edit CONTEXT is SEdit's main data structure and can be useful for associating particular edits with specific regions. The REASON argument specifies why SEdit wants a region, and will be one of the keywords :CREATE or :EXPAND. (Save-Window-Region(SAVE-WINDOW-REGION (Function) Save-Window-Region NIL (B) 12) CONTEXT REASON NAME TYPE REGION) [Function] (1) This function is called whenever SEdit is finished with a region and wants to make the region available for other SEdits. This happens whenever an SEdit window is closed or shrunk, or when an SEdit Icon is closed. The default behavior is simply to push the region onto SEdit's stack of regions. This function can be redefined to provide different behavior. It is also called with the edit CONTEXT, the REASON, the NAME, the TYPE, and additionally the window REGION that is being released. The REASON argument specifies why SEdit is releasing the region, and will be one of the keywords :CLOSE, :SHRINK, or :CLOSE-ICON. Keep-Window-Region(KEEP-WINDOW-REGION (Variable) Keep-Window-Region NIL (B) 12) [Variable] (1) Default T. This flag determines the behavior of the default SEdit region manager, explained above, for shrinking and expanding windows. When set to T, shrinking an SEdit window will not give up that window's region; the icon will always expand back into the same region. When set to NIL, the window's region is made available for other SEdits when the window is shrunk. Then when an SEdit icon is expanded, the window will be reshaped to the next available region. This variable is only used by the default implementations of the functions Get-Window-Region and Save-Window-Region. If these functions are redefined, this flag is no longer used. 16.1.12 Options 1 The following parameters can be set as desired. *Wrap-Parens*(*WRAP-PARENS* (Variable) *Wrap-Parens* NIL (B) 12) [Variable] (1) This SEdit pretty printer flag determines whether or not trailing close parenthesis characters, ), are forced to be visible in the window without scrolling. By default it is set to NIL, meaning that close parens are allowed to "fall off" the right edge of the window. If set to T, the pretty printer will start a new line before the structure preceding the close parens, so that all the parens will be visible. *Wrap-Search*(*WRAP-SEARCH* (Variable) *Wrap-Search* NIL (B) 12) [Variable] (1) This flag determines whether or not SEdit find will wrap around to the top of the structure when it reaches the end, or vice versa in the case of reverse find. The default is NIL. *Clear-Linear-On-Completion*(*CLEAR-LINEAR-ON-COMPLETION* (Variable) *Clear-Linear-On-Completion* NIL (B) 13) [Variable] (1) This flag determines whether or not SEdit completely re-pretty prints the structure being edited when you complete the edit. The default value is NIL, meaning that SEdit reuses the pretty printing. Convert-Upgrade(CONVERT-UPGRADE (Variable) Convert-Upgrade NIL (B) 13) [Variable] (1) Default 100. When using Meta-; to convert old-style single- asterisk comments, if the length of the comment exceeds Convert-Upgrade characters, the comment is converted into a double semicolon comment. Otherwise, the comment is converted into a single semicolon comment. Old-style double-asterisk comments are always converted into new-style triple-semicolon comments. 16.1.13 Control Functions 1 ((RESET (Function) Reset NIL (B) 13)Reset) [Function] (1) This function recomputes the SEdit edit environment. Any changes made in the font profile, or any changes made to SEdit's commands are captured by resetting. Close all SEdit windows before calling this function. (Add-Command(ADD-COMMAND (Function) Add-Command NIL (B) 13) KEY-CODE FORM &OPTIONAL KEY-NAME COMMAND-STRING HELP-STRING) [Function] (1) This function allows you to (WRITING% YOUR% OWN% SEDIT% COMMANDS% NIL Writing% your% own% SEdit% commands% NIL (B) 13)write your own SEdit keyboard commands. You can add commands to new keys, or you can redefine keys that SEdit already uses as command keys. If you mistakenly redefine an SEdit command, the funtion Reset-Commands will remove all user-added commands, leaving SEdit with its default set of commands. KEY-CODE can be a character code, or any form acceptible to il:charcode. FORM determines the function to be called when the key command is typed. It can be a symbol naming a function, or a list, whose first element is a symbol naming a function and the rest of the elements are extra arguments to the function. When the command is invoked, SEdit will apply the function to the edit context (SEdit's main data structure), the charcode that was typed, and any extra arguments supplied in FORM. The extra arguments do not get evaluated, but are useful as keywords or flags, depending on how the command was invoked. The command function must return T if it handled the command. If the function returns NIL, SEdit will ignore the command and insert the character typed. The optional arguments are used to add this command to SEdit's middle button menu. When the item is selected fromthe menu, the command function will be called as described above, with the charcode argument set to NIL. KEY-NAME is a string to identify the key (combination) to be typed to invoke the command. For example "M-A" to represent the Meta-A key combination, and "M-C-A" for Meta-Control-A. COMMAND-NAME is a string to identify the command function, and will appear in the menu next to the KEY-NAME. HELP-STRING is a string to be printed in the prompt window when a mouse button is held down over the menu item. After adding all the commands that you want, you must call Reset-Commands to install them. For example: (add-command "^U" (my-change-case t)) (add-command "^Y" (my-change-case nil)) (add-command "1,r" my-remove-nil "M-R" "Remove NIL" "Remove NIL from the selected structure")) (reset-commands) will add three commands. Suppose my-change-case takes the arguments CONTEXT, CHARCODE, and UPPER-CASE?. UPPER-CASE? will be set to T when my-change-case is called from Control-U, and NIL when called from Control-Y. my-remove-nil will be called with only CONTEXT and CHARCODE arguments when Meta-R is typed. Below are some SEdit functions which are useful in writing new commands. (Reset-Commands(RESET-COMMANDS (Function) Reset-Commands NIL (B) 14)) [Function] (1) This function installs all commands added by Add-Command. SEdits which are open at the time of the Reset-Commands will not see the new commands; only new SEdits will have the new commands available. (Default-Commands(DEFAULT-COMMANDS (Function) Default-Commands NIL (B) 14)) [Function] (1) This function removes all commands added by Add-Command, leaving SEdit with its default set of commands. As in Reset-Commands, open SEdits will not be changed; only new SEdits will have the user commands removed. (Get-Prompt-Window(GET-PROMPT-WINDOW (Function) Get-Prompt-Window NIL (B) 14) CONTEXT) [Function] (1) This function returns the attached prompt window for a particular SEdit. (Get-Selection(GET-SELECTION (Function) Get-Selection NIL (B) 14) CONTEXT) [Function] (1) This function returns two values: the selected structure, and the type of selection, one of NIL, T, or :SUB-LIST. The selection type NIL means there is not a valid selection (in this case the structure is meaningless). T means the selection is one complete structure. :SUB-LIST means a series of elements in a list is selected, in which case the structure returned is a list of the elements selected. (Replace-Selection(REPLACE-SELECTION (Function) Replace-Selection NIL (B) 15) CONTEXT STRUCTURE SELECTION-TYPE ) [Function] (1) This function replaces the current selection with a new structure, or multiple structures, by deleting the selection and then inserting the new structure(s). The SELECTION-TYPE argument must be one of T or :SUB-LIST. If T the STRUCTURE is inserted as one complete structure. If :SUB-LIST, the STRUCTURE is treated as a list of elements, each of which is insertd. 16.1.13 Programmer's Interface 1 This programmer's(PROGRAMMER'S% INTERFACE% NIL Programmer's% interface% % NIL (B) 15 SUBNAME TO% SEDIT% SUBTEXT to% SEdit% ) interface to SEdit provides a way to call SEdit directly. This interface is sketchy and will change inthe future. *Getdef-Fn*(*GETDEF-FN* (Variable) *Getdef-Fn* NIL (B) 15) [Variable] (1) This function is called with the arguments NAME, TYPE, and OLDDEF, when SEdit needs to refetch the definition for the named object being edited. When SEdit is first started it gets passed the structure, so this function doesn't get called. But after completion, SEdit refetches because it doesn't know if the Edit Interface (File Manager) changed the definition upon installation. The function returns the new definition. *Fetch-Definition-Error-Break-Flag*(*FETCH-DEFINITION-ERROR-BREAK-FLAG* (Variable) *Fetch-Definition-Error-Break-Flag* NIL (B) 15) [Variable] (1) This flag, along with the error options listed below, determines what happens when the Getdef-Fn errors. The default value is NIL, causing errors to be suppressed. When set to T, the break will be allowed. *Getdef-Error-Fn*(*GETDEF-ERROR-FN* (Variable) *Getdef-Error-Fn* NIL (B) 15) [Variable] (1) This function is funcalled with the arguments NAME, TYPE, OLDDEF, and PROMPT-WINDOW, when the Getdef-Fn errors, independent of whether or not the break is suppressed. This function should return the structure to be used in place of the unavailable new definition. *Edit-Fn*(*EDIT-FN* (Variable) *Edit-Fn* NIL (B) 15) [Variable] (1) This function is funcalled with the selected structure as its argument from the Edit (M-O) command. It should start the editor as appropriate, or else generate an error if the selection is not editable. *Compile-Fn*(*COMPILE-FN* (Variable) *Compile-Fn* NIL (B) 15) [Variable] (1) This function is funcalled with the arguments NAME, TYPE, and BODY, from the compile completion commands. It should compile the definition, BODY, and install the code as appropriate. ((SEDIT (Function) SEdit NIL (B) 15)SEdit STRUCTURE PROPS OPTIONS) [Function] (1) This function provides a means of starting SEdit directly. STRUCTURE is the structure to be edited. PROPS is a property list, which may specify the following properties: :name - the name of the object being edited :type - the file manager type of the object being edited. If NIL, SEdit will not call the file manager when it tries to refetch the definition it is editing. Instead, it will just continue to use the structure that it has. :completion-fn - the function to be called when the edit session is completed. This function is called with the CONTEXT, STRUCTURE, and CHANGED? arguments. CONTEXT is SEdits main data structure. STRUCTURE is the structure being edited. CHANGED? specifies if any changes have been made, and is one of NIL, T, or :ABORT, where :ABORT means the user is aborting the edit and throwing away any changes made. If the value of this property is a list, the first element is treated as the function, and the rest of the elements are extra arguments that the function is applied to following the main arguments above. :root-changed-fn - the function to be called when the entire structure being edited is replaced with a new structure. This function is called with the new structure as its argument. If the value of this property is a list, the first element is treated as the function, and the rest of the elements are extra arguments that the function is applied to following the structure argument. OPTIONS is one or a list of any number of the followng keywords: :fetch-definition-suppress-errors - If this option is provided, any error under the Getdef-Fn will be suppressed, regardless of the :fetch-definition-allow-errors option or the value of *Fetch-Definition-Error-Break-Flag*. :fetch-definition-allow-errors - If this option is provided, any error under the Getdef-Fn will be allowed to break. :dontwait - This option specifies that the call to SEdit should return as soon as the editor is started, rather than waiting for a completion command. :close-on-completion - This option specifies that SEdit cannot remain active for multiple completions. That is, the SEdit window cannot be shrunk, and the completion commands that normally leave the window open will in this case close the window and terminate the edit. :compile-on-completion - This option specifies that SEdit should call the *Compile-Fn* to compile the definition being edited upon completion, regardless of the completion command used. Fixed ARS 1 AR 7471 ---- You no longer have to Ctrl-X out of SEdit to compile. To compile, select either of two new SEdit commands. The C-C command (Ctrl -C) compiles and leaves the SEdit window open. The M-C-C command (Meta-Ctrl- C) compiles and closes the window. AR 7783 ---- After typing Meta-O, you are prompted to "Select a type of dummy definition to install." The first option is "Optimizers". This title refers to XCL:DEFOPTIMIZERS, and has nothing to do with CL:OPTIMIZE. AR 7786 ---- Square bracket characters '[' and ']' are not treated as special characters by SEdit, just as in Common Lisp. [This page intentionally left blank] (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC B-) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC B-)) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (TEXT NIL NIL (54 54 504 723) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC B-)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC B-)) (54 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC B-)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC B-)) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))))))-(T-T4HHTT4HH TT3HHT3HH T3T3T-T3rHT3rHxT3HHrT.TT4HHTT4HHTT3 T.TT.TT3HHT4 TT4HHTT3HHT4TT4TT6T-T,-(T5-T-T, ,-TF PAGEHEADING VERSOHEADF PAGEHEADING RECTOHEADE PAGEHEADINGFOOTINGVE PAGEHEADINGFOOTINGR-2T-T-T MODERN MODERN GACHA TERMINAL MODERN ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) MODERN MODERNMODERN MODERNMODERN MODERN & HRULE.GETFNMODERN &%% HRULE.GETFNMODERN %%$$ HRULE.GETFNMODERN ## HRULE.GETFNMODERN  -( HRULE.GETFNMODERN o' HRULE.GETFNMODERN )# ) HRULE.GETFNMODERN ) !OIM.INDEX.GETFN!! !!!  ) HRULE.GETFNMODERN  !y! MIM.INDEX.GETFN ! !i GIM.INDEX.GETFN !  !> !  !n  9 :z !  ) HRULE.GETFNMODERN  - AIM.INDEX.GETFN IIM.INDEX.GETFN ! BMOBJ.GETFN3MODERN ! ! BMOBJ.GETFN3MODERN !  ) HRULE.GETFNMODERN  ! YIM.INDEX.GETFN* aIM.INDEX.GETFNZ cIM.INDEX.GETFN ! BMOBJ.GETFN3MODERN !I ! !$ BMOBJ.GETFN3MODERN !X !i ! BMOBJ.GETFN3MODERN !a ! aIM.INDEX.GETFN: ! ! BMOBJ.GETFN3MODERN ! !L BMOBJ.GETFN3MODERN !  ) HRULE.GETFNMODERN  !  - X iIM.INDEX.GETFN !* AIM.INDEX.GETFN !  BMOBJ.GETFN3 !F !H BMOBJ.GETFN3MODERN !W  ) HRULE.GETFNMODERN  ! cIM.INDEX.GETFN   EIM.INDEX.GETFN.    _IM.INDEX.GETFN  $  )  @  e #    o $    /      [   GIM.INDEX.GETFN 9  "  :   KIM.INDEX.GETFN    EIM.INDEX.GETFN+  4   HRULE.GETFNMODERN  ,  HRULE.GETFNMODERN  0IM.INDEX.GETFNMODERN  0IM.INDEX.GETFN   HRULE.GETFNMODERN  ( @IM.INDEX.GETFN  HRULE.GETFNMODERN ! 6IM.INDEX.GETFN 0IM.INDEX.GETFN  HRULE.GETFNMODERN    HRULE.GETFNMODERN  (IM.INDEX.GETFNMODERN  *IM.INDEX.GETFN   HRULE.GETFNMODERN  h 0IM.INDEX.GETFN   HRULE.GETFNMODERN   0IM.INDEX.GETFN   HRULE.GETFNMODERN   :IM.INDEX.GETFN   HRULE.GETFNMODERN  E :IM.INDEX.GETFN   HRULE.GETFNMODERN  m  HRULE.GETFNMODERN   *IM.INDEX.GETFN %IM.INDEX.GETFN   HRULE.GETFNMODERN  {&IM.INDEX.GETFNMODERN  *IM.INDEX.GETFN &IM.INDEX.GETFN    HRULE.GETFNMODERN    HRULE.GETFNMODERN   *IM.INDEX.GETFN %IM.INDEX.GETFN   HRULE.GETFNMODERN   8IM.INDEX.GETFN :IM.INDEX.GETFN   HRULE.GETFNMODERN  R 0IM.INDEX.GETFN .IM.INDEX.GETFN *IM.INDEX.GETFN   HRULE.GETFNMODERN  R2IM.INDEX.GETFNMODERN  *IM.INDEX.GETFN +IM.INDEX.GETFN   HRULE.GETFNMODERN   @IM.INDEX.GETFN :IM.INDEX.GETFN   HRULE.GETFNMODERN    HRULE.GETFNMODERN   ,IM.INDEX.GETFN *IM.INDEX.GETFN %IM.INDEX.GETFN    HRULE.GETFNMODERN    @IM.INDEX.GETFN *IM.INDEX.GETFN HRULE.GETFNMODERN    &IM.INDEX.GETFN *IM.INDEX.GETFN HRULE.GETFNMODERN C &IM.INDEX.GETFN *IM.INDEX.GETFN (IM.INDEX.GETFN   HRULE.GETFNMODERN   *IM.INDEX.GETFN 'IM.INDEX.GETFN    HRULE.GETFNMODERN  t ,IM.INDEX.GETFN .IM.INDEX.GETFN  HRULE.GETFNMODERN 1 ,IM.INDEX.GETFN *IM.INDEX.GETFN   HRULE.GETFNMODERN  &IM.INDEX.GETFNMODERN  *IM.INDEX.GETFN  HRULE.GETFNMODERN   *IM.INDEX.GETFNMODERN  *IM.INDEX.GETFN   HRULE.GETFNMODERN     (IM.INDEX.GETFN             HRULE.GETFNMODERN   0IM.INDEX.GETFN *IM.INDEX.GETFN  HRULE.GETFNMODERN  O 0IM.INDEX.GETFN *IM.INDEX.GETFN  HRULE.GETFNMODERN    HRULE.GETFNMODERN   EIM.INDEX.GETFN +IM.INDEX.GETFN   HRULE.GETFNMODERN    7IM.INDEX.GETFN +IM.INDEX.GETFN   HRULE.GETFNMODERN    7IM.INDEX.GETFN +IM.INDEX.GETFN   HRULE.GETFNMODERN     HRULE.GETFNMODERN  n:IM.INDEX.GETFN2'@ BMOBJ.GETFN3  HRULE.GETFNMODERN   :IM.INDEX.GETFN   BMOBJ.GETFN3?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8))   A   $  HRULE.GETFNMODERN  l ;IM.INDEX.GETFN    HRULE.GETFNMODERN RY(*ob  =IM.INDEX.GETFN    HRULE.GETFNMODERN   +  >  w  =IM.INDEX.GETFN   HRULE.GETFNMODERN     K  B  HRULE.GETFNMODERN  0 3IM.INDEX.GETFN   HRULE.GETFNMODERN   3IM.INDEX.GETFN   HRULE.GETFNMODERN   QIM.INDEX.GETFN   HRULE.GETFNMODERN   7IM.INDEX.GETFN   HRULE.GETFNMODERN  u  b  HRULE.GETFNMODERN   #IM.INDEX.GETFN   HRULE.GETFNMODERN  /IM.INDEX.GETFN ;   HRULE.GETFNMODERN \IM.INDEX.GETFN+A W e[ &(!-"  @ !I 5IM.INDEX.GETFN   HRULE.GETFNMODERN - , V 9IM.INDEX.GETFN   HRULE.GETFNMODERN , : X ;IM.INDEX.GETFN    HRULE.GETFNMODERN I 3IM.INDEX.GETFN    HRULE.GETFNMODERN  ;IM.INDEX.GETFN !   HRULE.GETFNMODERN 3 ; =  HRULE.GETFNMODERN  nIM.INDEX.GETFNt /IM.INDEX.GETFN   HRULE.GETFNMODERN  ,h# _IM.INDEX.GETFN   HRULE.GETFNMODERN   ;IM.INDEX.GETFN   HRULE.GETFNMODERN  .  +IM.INDEX.GETFN   HRULE.GETFNMODERN   1IM.INDEX.GETFN   HRULE.GETFNMODERN  .K' #IM.INDEX.GETFN    HRULE.GETFNMODERN  <  A,q  ! !m:# u3 _  HRULE.GETFNMODERN    x)"% z