1
0
mirror of synced 2026-01-27 04:41:54 +00:00
Files
Interlisp.medley/docs/primer/22-RESOURCE-MANAGEMENT.TEDIT
2020-12-13 17:04:48 -07:00

54 lines
28 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
1
Medley for the Novice, Release 2.0
1
Medley for the Novice, Release 2.0
22. RESOURCE MANAGEMENT
1
22. RESOURCE MANAGEMENT
1
"22"22. RESOURCE MANAGEMENT
6
Naming Variables(VARIABLES NIL Variables NIL ("22") 1 SUBNAME NAMING SUBTEXT naming) and Records(RECORDS NIL Records NIL ("22") 1 SUBNAME NAMING SUBTEXT naming)
1
You will find times when one environment simultaneously hosts a number of different programs. Running a demo of several programs, or reloading the entire Medley environment from floppies when it contains several different programs, are two examples that could, if you aren't careful, provide a few problems. Here are a few tips on how to prevent problems:
ÿÿïfÿ If you change the value of a system variable, MENUHELDWAIT(MENUHELDWAIT (Variable) NIL NIL ("22") 1) for example, or connect to a directory other than {DSK}<LISPFILES>, write a function to reset the variable or directory to its original value. Run this function when you are finished working. This is especially important if you change any of the system menus.
ÿÿïfÿ Do not redefine Medley functions or CLISP words. Remember, if you reset an atom's value or function definition at the top level (in the Executive Window), the message (Some.Crucial.Function.Or.Variable redefined), appears. If this is not what you wanted, type UNDO immediately!
If, however, you reset the value or function definition of an atom inside your program, a warning message will not be printed.
ÿÿïfÿ Make the atom names in your programs as unique as possible. To do this without filling your program with unreadable names that noone, including you, can remember, prefix your variable names with the initials of your program. Even then, check to see that they are not already being used with the function BOUNDP. For example, type:
(BOUNDP 'BackgroundMenu)
This atom is bound to the menu that appears when you press the leff mouse button when the mouse cursor is not in any window. BOUNDP returns T. BOUNDP returns NIL if its argument does not currently have a value.
ÿÿïfÿ Make your function names as unique as possible. Once again, prefixing function names with the initials of your program can be helpful in making them unique, but even so, check to see that they are not already being used. GETD is the Interlisp-D function that returns the function definition of an atom, if it has one. If an atom has no function definition, GETD returns NIL. For example, type:
(GETD 'CAR)
A non-NIL value is returned. The atom CAR already has a function definition.
ÿÿïfÿ Use complete record field names in record FETCHes and REPLACEs when your code is not compiled. A complete record field name is a list consisting of the record declaration name and the field name. Consider the following example:
(REC0RD NAME (FIRST LAST))
(SETQ MyName (create Name FIRST ¬'John LAST ¬'Smith))
(FETCH (NAME FIRST) OF MyName)
ÿÿïfÿ Avoid reusing names that are field names of Lisp system records. A few examples of system records follow. Do not reuse these names.
(RECORD REGION (LEFT BOTTOM WIDTH HEIGHT))
(RECORD POSITION (XCOORD YCOORD))
(RECORD IMAGEOBJ (- BITMAP -)))
ÿÿïfÿ When you select a record name and field names for a new record, check to see whether those names have already been used.
Call the function RECLOOK(RECLOOK (Function) NIL NIL ("22") 2), with your record name as an argument, in the Executive Window (see Figure 22-1). If your record name is already a record, the record definition will be returned; otherwise the function will return NIL.
`M˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|ÿÿÿí¾À@`wûƒƒ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ}ÿÿÿþïÝžûßï·û}½ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ}þî<ïÝ®ûßï·û½ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|]Û¿ï½¶ûÀï·û‡½ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ}ÿ¼ÿŸ½¶ûßàwûûƒïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ}ÿ½ûÿ½ºûßï·ûý¿ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ}ÿ]Û¾ÿ½¼ûßï·û}¿ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ|î<~ݾûÀo°;ƒ¿ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿßÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿïÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ`À`À`Àb#ˆÀc!Àc!Àb¡Àb¡ÀbaÀbaÀb#<23>À`À`À`À`À`¾~|Àøù˜øøó~ÏœfÀ`3`ÆÁ<C386><C381>°Í<>ØÞcÀaÁùÈ3`ÆÁ<C386><C381>àÍ<>ÃØÞcÀb!8$3|ÀÁ<C380><C381>ÀÍŒóØÛa€À`""">`ÀÁ<C380><C381>àùŒ{ØÛa€ÀaÄB!3`ÆÁ<C386><C381>°ÁŒØÙá€ÀbB"3`ÆÁ<C386><C381>˜Á<>ØÙá€Àcè3~|üøùŒÀùóϘá€À`À`À`À`À`@À`‡<>ŽÇ>8qŽ8ñà8qãÁÀ`„H"Dˆ$H„<>"D‰"D‰!ÀaH"Dˆ$H„<>"D‰
"D‰Àa<07>"xˆ$F‰P"Dñ
D‰â €Àa"PˆÄA‰P"D¡ D‰B €Àaˆ"HˆH„‰0"D"D‰" €ÀaH"DˆH„‰0"D‰"D‰À`„OŽ8qŽ8‰à8qÁÀ`€À`@À`À`àÀ`ƒäO B'€ 8qóÀ>Dˆ@À`€„H<E2809E>" £$@ ˆB ŠDØ@À`ˆ<E2809A>"@£$@ ˆB ŠÀ`€‚ˆž@¢¤@ `B ŠÀ`<>A¤@ À`<>Aòd@ ˆBŸÀ`<>Ad@ ˆBÀ`<>!'€>8pB8ˆ@À` @À`àÀ`À`@€À`"D‰Ãç<C383>8!à"D @À`2DÙ"H€DQE"l @À`2DÙ"H€DQE"l À`*D©ãLj@QàE"T À`*D©@‰@H„"T À`&D©ˆO„"T À`&D©HD‰H„"T À`"8‰ãäH8‰ˆ„D @À` @À`@€À`À`pÀ`"D‰Ãç<C383>8ñà"DÀ`2DÙ"H€D‰E"lÀ`2DÙ"H€D‰E"lÀ`*D©ãLj@‰àE"TÀ`*D©@‰@H„"TÀ`&D©ˆD‰ O„"TÀ`&D©HD‰H„"TÀ`"8‰ãäHˆ„DÀ`À`pÀ`À` @€À`AÄG>D @À`B$H„ l @À`"ˆ„ l À`<00><T À`€A T À`!„ T À`!„ T À`>D @À`@ @À` @€À`À`À`¾~|Àøù˜ãÀÀ`3`ÆÁ<C386><C381>°ó`ÀaÁøˆ3`ÆÁ<C386><C381>àó<ÌÙž<`Àb!83|ÀÁ<C380><C381>ÀÛfÌÙ³d0À`" >`ÀÁ<C380><C381>àÛ~mŸ3p0ÀaÄ@<40>3`ÆÁ<C386><C381>°Ï`˜30Àb@3`ÆÁ<C386><C381>˜Ïf33L0Àcè@„3~|üøùŒÇ<3x0À``À``À`ÀÀ`À`Àb#ˆÀc!Àc!Àb¡Àb¡ÀbaÀbaÀb#<23>À`À`À`À`À`À`ÀaÁùÈÀb!8$À`" "ÀaÄÀbBÀcèÀ`À`À`À`À`ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ
Figure 22-1. Response to RECLOCK
Call the function FIELDLOOK(FIELDLOOK (Function) NIL NIL ("22") 2) with your new field name in the Executive Window (see Figure 22-2). If your field name is already a field name in another record, the record definition will be returned; otherwise the function will return NIL.
`Rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþà?ÿÿøÿmö¿Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþïÿÿÿ÷~ì÷Þÿ}¿Ûíîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþï÷qãÿ~íwÞÿ}¿ÛýîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþàzîÝÿ}í·Þ}¿Ü=ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþïýàßüýí·Þÿ¿ßÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþïýïßûýí×Þÿ}¿ßíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþïúîÝ÷ýíçÞÿ}¿Ûíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþà7qãð~í÷Þ}<7D>Üþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ@@@@@@@|
û~Áù<C381>ñó0
™ññóçãƒ`Á<>ƒ`
61€GÎ@ƒ`Á<>ƒÀó61€ À‘ 1ó|Á<>ƒc60ÀA1ƒ`Á<>ƒÀcæ0À B1ƒ`Á<>ƒ`ó60À B1ƒ`Á<>ƒ060À@B 1ƒ~ýùùñó™ññó7àÀ@  xøáÇ<C3A1><8pã㇈áÃ<C3A1>Ç<D<>$H€"Dˆ@<40>$H$H"D<>$H€"Dˆ@<40> Q$H¢$H"'ˆ€"D`@<40> !$O¢Hž"P<>%€<D@<40> !$JBH”"H<>$ˆ€ Dˆ@<40> Q$IB$H"D<>$H€ Dˆ@<40>$HB$H"DøáÄO 8pàƒ‡ˆáÈžAÇ<  >DññÀ"xB<ðCäH„D‰ 
2DB„"ˆ „M„(‰ 
2D„"ˆ „M(‰à@
*D"ˆ „Jñ*D<„J<10>&D‰ð„J<10>&D„J<10>ð€"xC㇠ñƒˆ„@  @B$Hœ>xðƒ‚x!ò$BC$M Dˆ„EDPB&ƒ$M DˆEDPB&Á¤Jž<xˆDPB%A¤JDˆB%AdJ H€ODøB%AdJ D€HDˆB%AB#ˆž>D€ƒˆ‘xˆAÄB@ @ @B$Hœ>xðƒ<>x!ò$AC$M Dˆ„HDPB&Áƒ$M DˆHDPB&Á¤Jž<xˆžDPB%A¤JDˆB%AdJ H€HDøB%AdJ D€HDˆB%AB#ˆž>D€ƒ<>xˆAÄA@ @DqóäB"DˆBÂ"(ˆBÁ(`CÅABA"ˆBA"ˆBApCäB
û~Áù<C381>ñó0
›àƒ`Á<>ƒ`
0 GÎ@ƒ`Á<>ƒÀó3ÇŒ À‘ 1ó|Á<>ƒc6l†A1ƒ`Á<>ƒÀcæn B1ƒ`Á<>ƒ`óc† B1ƒ`Á<>ƒ0i†@B 1ƒ~ýùùñóÏ@   @@@@@@@|GÂ@ À† A
 B B@B @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ
Figure 22-2. Response to FIELDLOOK
Some Space and Time Considerations
1
In order for your program to run at maximum speed, you must efficiently use the space available on the system. The following section points out areas that you may not know are wasting valuable space, and tips on how to prevent this waste.
Often programs are written so that new data structures are created each time the program is run. This is wasteful. Write your programs so that they only create new variables and other data structures conditionally. If a structure has already been created, use it instead of creating a new one.
Some time(TIME NIL Time NIL ("22") 2 SUBNAME SAVING SUBTEXT saving) and space(SPACE NIL Space NIL ("22") 2 SUBNAME SAVING SUBTEXT saving) can be saved by changing your RECORD and TYPERECORD declarations to DATATYPE. DATATYPE is used the same way as the functions RECORD and TYPERECORD. In addition, the same FETCH and REPLACE commands can be used with the data structure DATATYPE creates. The difference is that the data structure DATATYPE creates cannot be treated as a list the way RECORDs and TYPERECORDs can.
Global Variables(VARIABLES NIL Variables NIL ("22") 3 SUBNAME GLOBAL SUBTEXT global)(GLOBAL% VARIABLES NIL Global% variables NIL ("22") 3)
Once defined, global variables remain until Lisp is reloaded. Avoid using global variables if at all possible! One specific problem arises when programs use the function GENSYM(GENSYM (Function) NIL NIL ("22") 3). In program development, many atoms are created that may no longer be useful. Hints:
ÿÿïfÿ Use
(DELDEF atomname 'PROP)
to delete property lists, and
(DELDEF atomname 'VARS)
to have the atom act like it is not defined.
These not only remove the definition from memory, but also change the appropriate fileCOMS that the deleted object was associated with so that the file package will not attempt to save the object (function, variable, record definition, and so forth) the next time the file is made. Just doing something like
(SETQ (arg atomname) 'NOBIND)
looks like it will have the same effect as the second DELDEF above, but the SETQ does not update the file package.
ÿÿïfÿ If you are generating atom names with GENSYM, try to keep a list of the atom names that are no longer needed. Reuse these atom names, before generating new ones. There is a (fairly large) maximum to the number of atoms you can have, but things slow down considerably when you create lots of atoms.
ÿÿïfÿ When possible, use a data structure such as a list or an array, instead of many individual atoms. Such a structure has only one pointer to it. Once this pointer is removed, the whole structure will be garbage-collected and space will be reclaimed.
Circular Lists(CIRCULAR% LISTS NIL Circular% lists NIL ("22") 3)
If your program is creating circular lists, a lot of space may be wasted. (Many crosslinked data structures end up having circularities.) Hints when using circular lists:
ÿÿïfÿ Write a function to remove pointers that make lists circular when you are through with the circular list.
ÿÿïfÿ If you are working with circular lists of windows, bind your main window to a unique global variable. Write window creation conditionally so that if the binding of that variable is already a window, use it, and only create a new window if that variable is unbound or NIL.
Here is an example that illustrates the problem. When several auxilIary windows are built, pointers to these windows are usually kept on the main window's property list. Each auxilIary window also typically keeps a pointer to the main window on its property list If the top level function creates windows rather than reusing existing ones, there will be many lists of useless windows cluttering the work space. Or, if such a main window is closed and will not be used again, you will have to break the links by deleting the relevant properties from both the main window and all of the auxiliary windows first. This is usually done by putting a special CLOSEFN on the main window and all of its auxiliary windows.
When You Run Out of Space(SPACE NIL Space NIL ("22") 4 SUBNAME RUNNING% OUT% OF SUBTEXT running% out% of)
Typically, if you generato a lot of structure! that won't get garbage collected, you will eventually run out of space. The important part ii being aNe to track down those structures and the code that generates them to become more space efficient.
Use the Lisp Library Package GCHAX.DCOM(GCHAX.DCOM (Package) NIL NIL ("22") 4) to track down pointers to data structures. The basic idea is that GCHAX will return the number of references to a particular data structure.
A special function exists that allows you to get a little extra space so that you can try to save your work when you get toward the edge (usually noted by a message indicating that you should save your work and load a new Medley environment). The GAINSPACE(GAINSPACE (Function) NIL NIL ("22") 4) function allows you to delete non-essential data structures. To use it, type:
(GAINSPACE)
into the Executive Window. Answer N to all questions except the followi ng.
ÿÿïfÿ Delete edit history
ÿÿïfÿ Delete history list.
ÿÿïfÿ Delete values of old variables.
ÿÿïfÿ Delete your MASTERSCOPE database
ÿÿïfÿ Delete information for undoing your greeting.
Save your work and reload Lisp as soon as possible.(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "22-" "") STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "22-" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (TEXT NIL NIL (54 54 504 690) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "22-" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "22-" "")) (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 "22-" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "22-" "")) (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 690) NIL))))),HHà2HHà
T2llàT,HHà2HHàT-$$àT2HHàT,llà,llà2HTàT,llà2HTà
T,HHà
-àT-àT2àà5àÌàFøø PAGEHEADING VERSOHEADFøø PAGEHEADING RECTOHEADEøø PAGEHEADINGFOOTINGVEøø PAGEHEADINGFOOTINGR,?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8))
VH(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (POSTSCRIPT (GACHA 8)))
 HELVETICA TITAN
CLASSIC
TITAN
CLASSIC HELVETICAMODERN HELVETICACLASSIC
 HELVETICA
MODERN

TIMESROMAN

TIMESROMAN
 HRULE.GETFNMODERN

     HRULE.GETFNCLASSIC
 #    HRULE.GETFNCLASSIC
     HRULE.GETFNCLASSIC
  
IM.CHAP.GETFN HELVETICA
 HRULE.GETFNMODERNDIM.INDEX.GETFN @IM.INDEX.GETFN HRULE.GETFNCLASSIC
d   2 *IM.INDEX.GETFN3 Á   ¬ !
0     3    ~ 
  2   à     
  $   -  §  
    + "   {   %IM.INDEX.GETFNÇ   ü BMOBJ.GETFN3      'IM.INDEX.GETFNÎ   X BMOBJ.GETFN3?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8))
  # HRULE.GETFNCLASSICï &  :IM.INDEX.GETFN
<IM.INDEX.GETFN 
  ' 
  . 4 - 
 DIM.INDEX.GETFN6IM.INDEX.GETFNª $IM.INDEX.GETFNV 
  

 

- 
S Ú   
7  # 
 * þ 
 û 2IM.INDEX.GETFN
« 
 m 
   Œ 5 PIM.INDEX.GETFN
÷ 
'IM.INDEX.GETFND F ÷ 'IM.INDEX.GETFNO  # ) 
  
  
 $ 
  

 2 3 W?Ezº