Annotation of 43BSDTahoe/new/apl/apl.vax/doc/man.5, revision 1.1

1.1     ! root        1: .NH 1
        !             2: The State Indicator
        !             3: .PP
        !             4: \*a is a recursive language
        !             5: which supports local variables.
        !             6: Therefore,
        !             7: it is essential that it
        !             8: maintain some sort of information
        !             9: concerning its current state of
        !            10: execution,
        !            11: local variables,
        !            12: and status of functions.
        !            13: Part of this information \(em
        !            14: the current status of active
        !            15: functions,
        !            16: is called the ``state indicator''.*
        !            17: .FS
        !            18: *Users of other \*a systems
        !            19: should note that
        !            20: the state indicator as implemented on
        !            21: \*u \*a is similar in concept
        !            22: to the standard \*a state
        !            23: indicator,
        !            24: but does not function entirely the same
        !            25: way.
        !            26: In particular,
        !            27: the system command ``)siv'' is not supported,
        !            28: and the state indicator is cleared in
        !            29: a different manner.
        !            30: Read on.
        !            31: .FE
        !            32: Each time a function begins execution,
        !            33: \*a keeps track of the current line
        !            34: number in that function.
        !            35: When the current function calls
        !            36: another function,
        !            37: the line number where the request
        !            38: was made is recorded in the
        !            39: state indicator.
        !            40: .PP
        !            41: When a function terminates abnormally,
        !            42: it is said to be ``suspended''.
        !            43: This means that \*a stops execution
        !            44: of the function,
        !            45: but retains all information about its
        !            46: current state of execution.
        !            47: In some cases,
        !            48: the problem can be corrected and the
        !            49: function restarted where it left off.
        !            50: This discussion will not include that
        !            51: technique.
        !            52: In any event,
        !            53: when the function is suspended,
        !            54: \*a will print a traceback automatically,
        !            55: perhaps such as:
        !            56: .sp
        !            57: .DS L
        !            58: varx: used before set
        !            59: at      fn3[5]
        !            60: from    fn2[12]
        !            61: from    main[4]
        !            62: .DE
        !            63: .sp
        !            64: In this case,
        !            65: the error
        !            66: (undefined variable)
        !            67: occurred in the function
        !            68: ``fn3'' at line 5.
        !            69: ``fn3'' was called by the
        !            70: function ``fn2'' at line 12,
        !            71: which in turn was called by the
        !            72: function ``main'' at line 14.
        !            73: .PP
        !            74: The ``)si'' command produces a similar
        !            75: traceback.
        !            76: For the above example,
        !            77: the traceback could be:
        !            78: .sp
        !            79: .DS L
        !            80: fn3[5]  *
        !            81: fn2[12]
        !            82: main[4]
        !            83: .DE
        !            84: .sp
        !            85: This shows that the function
        !            86: ``fn3'' was suspended due to error,
        !            87: and that ``fn2'' and ``main'' are
        !            88: waiting for ``fn3'' and ``fn2'',
        !            89: respectively.
        !            90: .PP
        !            91: When an error occurs and a
        !            92: function is suspended,
        !            93: all of that function's variables
        !            94: are accessible from the keyboard.
        !            95: Thus,
        !            96: you can examine the current
        !            97: variables to help determine the problem.
        !            98: As stated above,
        !            99: in some cases it may be
        !           100: possible to change some variables
        !           101: and resume execution of the suspended
        !           102: function.
        !           103: However,
        !           104: in general,
        !           105: after you examine the variables
        !           106: you will probably want to restart
        !           107: from the beginning.
        !           108: In order to do this,
        !           109: type the ``)reset'' command.
        !           110: This causes \*a to clear the
        !           111: state indicator,
        !           112: resetting suspended functions
        !           113: and releasing local variables.
        !           114: .PP
        !           115: If you do not use ``)reset'',
        !           116: you will find two things.
        !           117: First,
        !           118: if you get another error,
        !           119: the state indicator may look like:
        !           120: .sp
        !           121: .DS L
        !           122: fn3[3]  *
        !           123: fn2[12]
        !           124: main[4]
        !           125: fn3[5]  *
        !           126: fn2[12]
        !           127: main[4]
        !           128: .DE
        !           129: .sp
        !           130: This shows that ``fn3'' was suspended
        !           131: due to an error at line 3,
        !           132: and it traces execution back to
        !           133: the start of ``main''.
        !           134: Then,
        !           135: it shows that in a previous run,
        !           136: ``fn3'' was suspended due to an error
        !           137: at line 5,
        !           138: and it traces execution back to
        !           139: the start of ``main''.
        !           140: You can still use the ``)reset''
        !           141: command to get back to a clear
        !           142: state indicator.
        !           143: .PP
        !           144: The other effect which you will
        !           145: notice if you do not ``)reset''
        !           146: the state indicator is that
        !           147: you will be unable to edit some
        !           148: functions.
        !           149: If a function is suspended
        !           150: (it appears in the state indicator),
        !           151: it cannot be changed,
        !           152: because it is possible that
        !           153: the error condition may be corrected
        !           154: and execution resumed.
        !           155: Therefore,
        !           156: if you try to edit a function which
        !           157: appears in the state indicator,
        !           158: you will get the error message:
        !           159: .sp
        !           160: si damage -- type \')reset\'
        !           161: .sp
        !           162: To edit the function,
        !           163: clear the state indicator with
        !           164: ``)reset'' first,
        !           165: and then you may proceeed with
        !           166: an ``)edit'' or ``)editf'' command.
        !           167: .PP
        !           168: A useful technique for finding
        !           169: errors is to look at the function
        !           170: which ``blew up'' and try retyping
        !           171: the line which failed,
        !           172: a little bit at a time.
        !           173: This often helps isolate the
        !           174: problem.
        !           175: Generally,
        !           176: you want to do this before the
        !           177: state indicator is ``)reset''
        !           178: so that the state of \*a is
        !           179: exactly the same as it was when
        !           180: the error was detected.
        !           181: Since you cannot run the editor
        !           182: to list the function
        !           183: without typing ``)reset'',
        !           184: you will probably want to use
        !           185: the ``)list'' command
        !           186: to look at the bad function.
        !           187: .PP
        !           188: As an example,
        !           189: suppose your ``friend'' Chris
        !           190: (male or female,
        !           191: take your pick)
        !           192: gave you the following program
        !           193: to compute the reciprocal of
        !           194: the numbers from 1 to x:
        !           195: .DS L
        !           196:        r { recip x
        !           197: [1]      r { % Ix
        !           198: .DE
        !           199: You are using origin 0,
        !           200: and
        !           201: your attempt to run the
        !           202: function yields the following:
        !           203: .DS L
        !           204:        recip 10
        !           205: recip domain
        !           206: at     recip[1]
        !           207: .DE
        !           208: It looks like Chris gave
        !           209: you a bum steer.
        !           210: You decide to try to debug
        !           211: the function.
        !           212: You can't use the editor
        !           213: to look at it with ``)editf''
        !           214: unless you type ``)reset'' first.
        !           215: You don't want to ``)reset'',
        !           216: because that would take you
        !           217: back to the beginning and
        !           218: you would lose any
        !           219: temporary variables
        !           220: (in this case, just ``x'').
        !           221: Thus,
        !           222: you can use the ``)list'' command:
        !           223: .DS L
        !           224:        )list recip
        !           225: 
        !           226:        y { recip x
        !           227: [1]      y { %Ix
        !           228: .DE
        !           229: Now,
        !           230: you can experiment with the
        !           231: function by typing the commands
        !           232: yourself:
        !           233: .DS L
        !           234:        x
        !           235: 10
        !           236: 
        !           237:        Ix
        !           238: 0 1 2 3 4 5 6 7 8 9
        !           239: .DE
        !           240: At this point,
        !           241: you immediately spot the
        !           242: trouble \(em
        !           243: \*a was trying to take the
        !           244: reciprocal of 0.
        !           245: The function ``recip'' was
        !           246: written assuming that the
        !           247: origin was 1,
        !           248: but Chris did not tell you
        !           249: and you were using 0 instead.
        !           250: Thus,
        !           251: you merely say:
        !           252: .DS L
        !           253:        )reset
        !           254: .DE
        !           255: (now that you've found the problem,
        !           256: you want to reset \*a to clear the
        !           257: state indicator),
        !           258: and
        !           259: .DS L
        !           260:        )origin 1
        !           261: was 0
        !           262: 
        !           263:        recip
        !           264:  1.00000000e+00 5.00000000e\(mi01 3.33333333e\(mi01 2.50000000e\(mi01
        !           265:                 2.00000000e\(mi01 1.66666667e\(mi01 1.42857143e\(mi01
        !           266:                 1.25000000e\(mi01 1.11111111e\(mi01 1.00000000e\(mi01
        !           267: .DE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.