Annotation of 43BSDTahoe/new/B/doc/UsersGuide.ms, revision 1.1

1.1     ! root        1: .TL \" Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984.
        !             2: A User's Guide to the B system
        !             3: .AU
        !             4: Steven Pemberton
        !             5: CWI, Amsterdam
        !             6: .ds B \fIB\fP
        !             7: .so bfont.def
        !             8: .AB
        !             9: \*B is a new interactive programming language being developed at the CWI.
        !            10: This report gives a brief introduction to using the current \*B implementation.
        !            11: It does not teach you about the language, for which you should refer elsewhere.
        !            12: .AE
        !            13: .SH
        !            14: .bp
        !            15: Introduction
        !            16: .PP
        !            17: .de BX
        !            18: 'nh
        !            19: \v'-\\n(.su/2u'\(br\v'\\n(.su/2u'\|\\$1\|\v'-\\n(.su/2u'\(br\v'\\n(.su/2u'\\h'-\\w'|'u/2u'\l'|0+(\\w'|'u/2u)\(rn'\\h'-\\w'|'u/2u'\l'|0\(ul'\\$2
        !            20: 'hy
        !            21: ..
        !            22: .de BR
        !            23: [\\$1]\\$2
        !            24: ..
        !            25: .de KY
        !            26: .ie t .BX \\$1 \\$2
        !            27: .el .BR \\$1 \\$2
        !            28: ..
        !            29: This guide is a brief introduction to using the current \*B system.
        !            30: It does not attempt to teach you about the language,
        !            31: for which you should refer elsewhere.
        !            32: .PP
        !            33: Furthermore, certain details such as how to start the system up,
        !            34: and which keys on your terminal correspond to the keys mentioned,
        !            35: depend on your local installation, and are not mentioned in this guide.
        !            36: Keys are just referred to here by their name, such as
        !            37: .KY accept .
        !            38: Refer to the ``bterminal(5)'' manual entry for these details.
        !            39: .PP
        !            40: Some older \*B systems don't let you make changes to immediate commands,
        !            41: nor give you suggestions to immediate commands, but only in units.
        !            42: .SH
        !            43: Starting up
        !            44: .PP
        !            45: The first response you should get from the \*B system when you start it up
        !            46: is a prompt that looks like this:
        !            47: .DS
        !            48: \*(<:>>> _?\*(:>
        !            49: .DE
        !            50: The underlined question mark is the indication from the \*B system
        !            51: that it is expecting input from you.
        !            52: (In fact, it depends on the sort of terminal you have
        !            53: whether it is underlined, displayed in reverse video, or what.
        !            54: In any case it is displayed in some special way,
        !            55: and we shall use underlining in this guide.)
        !            56: When it follows the three arrows \*(<:>>>\*(:>, called the \fIcommand prompt\fP,
        !            57: it is expecting you to type in a command.
        !            58: The question mark is called a \fIhole\fP
        !            59: and indicates that something should be filled in;
        !            60: the underline is called the \fIfocus\fP
        !            61: and shows where you are currently working.
        !            62: .PP
        !            63: You can fill this hole by typing in a \*(<:WRITE\*(:> command for instance:
        !            64: you type a \*(<:W\*(:>
        !            65: (which you don't have to type in upper-case:
        !            66: the system knows that it may only be upper-case here),
        !            67: and you immediately see:
        !            68: .DS
        !            69: \*(<:>>> W_?RITE ?\*(:>
        !            70: .DE
        !            71: This extra stuff to the right of the focus is a \fIsuggestion\fP.
        !            72: Most times that you type a \*(<:W\*(:> as the first letter of a command,
        !            73: it is because you want a \*(<:WRITE\*(:>.
        !            74: Therefore the editor suggests this,
        !            75: with an additional hole for the expression that you want to write.
        !            76: If you do want a \*(<:WRITE\*(:>
        !            77: (as in this case)
        !            78: you may press the
        !            79: .KY accept
        !            80: key to accept the suggestion \(em the editor
        !            81: then moves to the first unfilled hole in the command,
        !            82: which in this case is the only one,
        !            83: and you get:
        !            84: .DS
        !            85: \*(<:>>> WRITE _?\*(:>
        !            86: .DE
        !            87: You can now type an expression and press the
        !            88: .KY newline
        !            89: key.
        !            90: The system evaluates the expression,
        !            91: prints the result,
        !            92: and then gives you a new command prompt.
        !            93: Here are a few examples of \*(<:WRITE\*(:> commands:
        !            94: .DS
        !            95: \*(<:>>> WRITE 2+2
        !            96: 4
        !            97: >>> WRITE root 2
        !            98: 1.414213562373095
        !            99: >>> WRITE pi
        !           100: 3.141592653589793\*(:>
        !           101: .DE
        !           102: If you make a mistake while typing and spot it before you type
        !           103: .KY newline ,
        !           104: an easy way to correct it is to use the
        !           105: .KY back
        !           106: key.
        !           107: Pressing
        !           108: .KY back
        !           109: takes you back to the situation before you typed
        !           110: the last key (\fIexactly\fP the situation,
        !           111: as you will see clearly after a little use).
        !           112: If you type
        !           113: .KY back
        !           114: twice,
        !           115: you will be taken back to the situation as it was two keys ago,
        !           116: and so forth.
        !           117: You can regard the
        !           118: .KY back
        !           119: key as a way of travelling back in time.
        !           120: .LP
        !           121: Thus, if you meant to type \*(<:WRITE pi\*(:>,
        !           122: but instead typed \*(<:WRITE po\*(:>,
        !           123: you will see this:
        !           124: .DS
        !           125: \*(<:>>> WRITE po_?\*(:>
        !           126: .DE
        !           127: Now pressing
        !           128: .KY back
        !           129: will give you
        !           130: .DS
        !           131: \*(<:>>> WRITE p_?\*(:>
        !           132: .DE
        !           133: Now you can type the \*(<:i\*(:> and the
        !           134: .KY newline .
        !           135: Currently you can only go back a maximum of 100 keystrokes,
        !           136: and in any case only as far as the command prompt
        !           137: (and thus not back to previous commands).
        !           138: You will see other ways to correct mistakes shortly.
        !           139: .PP
        !           140: If you make a mistake so that the result is illegal \*B,
        !           141: but don't notice before you press
        !           142: .KY newline
        !           143: you will get an error message:
        !           144: .DS
        !           145: \*(<:>>> WRITE root 3**2+4**2
        !           146: *** There's something I don't understand in your command
        !           147:     WRITE root 3**2+4**2
        !           148:                  ^
        !           149: *** The problem is: priorities? use ( and ) to resolve\*(:>
        !           150: .DE
        !           151: The problem here is that the system doesn't know
        !           152: if you want to apply \*(<:root\*(:> to \*(<:3\*(:> or \*(<:3**2\*(:> or \*(<:3**2+4**2\*(:>
        !           153: and you should use brackets to show which.
        !           154: .PP
        !           155: When you type an open bracket,
        !           156: the system automatically supplies the matching closing bracket for you:
        !           157: .DS
        !           158: \*(<:>>> WRITE root(_?)\*(:>
        !           159: .DE
        !           160: You now type in the expression
        !           161: .DS
        !           162: \*(<:>>> WRITE root(3**2+4**2_?)\*(:>
        !           163: .DE
        !           164: You may now type
        !           165: .KY newline
        !           166: \^(
        !           167: .KY accept
        !           168: will take you over the closing bracket,
        !           169: but it is not necessary to do this):
        !           170: .DS
        !           171: \*(<:>>> WRITE root(3**2+4**2)
        !           172: 5\*(:>
        !           173: .DE
        !           174: .LP
        !           175: You can write any legal \*B value:
        !           176: .DS
        !           177: \*(<:>>> WRITE {1..10}
        !           178: {1; 2; 3; 4; 5; 6; 7; 8; 9; 10}
        !           179: >>> WRITE 'Hello! '^^3
        !           180: Hello! Hello! Hello!\*(:>
        !           181: .DE
        !           182: Just as with brackets,
        !           183: the system automatically supplies the closing brace \*(<:}\*(:>,
        !           184: and the closing quote \*(<:'\*(:>.
        !           185: In the latter case,
        !           186: where you want to type something after the closing quote
        !           187: you may either use
        !           188: .KY accept
        !           189: or type the quote yourself,
        !           190: in order to position after it.
        !           191: .PP
        !           192: Commands typed as a response to the command prompt
        !           193: are called `immediate' commands,
        !           194: since they are executed immediately.
        !           195: Another example is the \*(<:PUT\*(:> command.
        !           196: Just as with \*(<:WRITE\*(:>,
        !           197: when you type the first letter of the command,
        !           198: the system provides a suggestion:
        !           199: .DS
        !           200: \*(<:>>> P_?UT ? IN ?\*(:>
        !           201: .DE
        !           202: Again,
        !           203: you use
        !           204: .KY accept
        !           205: to go to the first hole:
        !           206: .DS
        !           207: \*(<:>>> PUT _? IN ?\*(:>
        !           208: .DE
        !           209: Here you type an expression,
        !           210: .DS
        !           211: \*(<:>>> PUT root 2?_ IN ?\*(:>
        !           212: .DE
        !           213: followed by another
        !           214: .KY accept
        !           215: to take you to the second hole:
        !           216: .DS
        !           217: \*(<:>>> PUT root 2 IN _?\*(:>
        !           218: .DE
        !           219: where you can type a target,
        !           220: followed by
        !           221: .KY newline :
        !           222: .DS
        !           223: \*(<:>>> PUT root 2 IN a
        !           224: >>> PUT root 3 IN b
        !           225: >>> WRITE a
        !           226: 1.414213562373095
        !           227: >>> WRITE b
        !           228: 1.732050807568877
        !           229: >>> WRITE a,b
        !           230: 1.414213562373095 1.732050807568877
        !           231: >>> WRITE a*a, b*b
        !           232: 2 3\*(:>
        !           233: .DE
        !           234: The targets that you create in this way,
        !           235: through immediate commands,
        !           236: are called `permanent targets',
        !           237: because if you stop using the system,
        !           238: and log out,
        !           239: and come back later and start using the system again
        !           240: you will find that the targets are still there,
        !           241: with the same values as before.
        !           242: .PP
        !           243: You can find out which targets exist
        !           244: by typing two equals signs after the prompt:
        !           245: .DS
        !           246: \*(<:>>> ==
        !           247: a b
        !           248: >>> PUT 'hello', {1..10} IN message, list
        !           249: >>> ==
        !           250: a b list message
        !           251: >>> WRITE list
        !           252: {1; 2; 3; 4; 5; 6; 7; 8; 9; 10}
        !           253: >>> WRITE message
        !           254: hello\*(:>
        !           255: .DE
        !           256: To get rid of targets you no longer want, use the \*(<:DELETE\*(:> command:
        !           257: .DS
        !           258: \*(<:>>> DELETE a, b
        !           259: >>> ==
        !           260: list message
        !           261: >>> WRITE a
        !           262: *** Can't cope with problem in your command
        !           263:     WRITE a
        !           264: *** The problem is: a has not yet received a value\*(:>
        !           265: .DE
        !           266: As you can see,
        !           267: after the \*(<:DELETE\*(:> command both \*(<:a\*(:> and \*(<:b\*(:> have ceased to exist.
        !           268: .SH
        !           269: Other Immediate Commands
        !           270: .PP
        !           271: In fact,
        !           272: almost any \*B command can be used as an immediate command;
        !           273: the only exceptions are the commands used to terminate \*(<:TEST\*(:>s and \*(<:YIELD\*(:>s,
        !           274: namely \*(<:RETURN\*(:>, \*(<:REPORT\*(:>, \*(<:SUCCEED\*(:> and \*(<:FAIL\*(:>.
        !           275: .DS
        !           276: \*(<:>>> WRITE list
        !           277: {1; 2; 3; 4; 5; 6; 7; 8; 9; 10}
        !           278: >>> INSERT 5 IN list
        !           279: >>> REMOVE 6 FROM list
        !           280: >>> WRITE list
        !           281: {1; 2; 3; 4; 5; 5; 7; 8; 9; 10}
        !           282: >>> CHOOSE number FROM list
        !           283: >>> WRITE number
        !           284: 9
        !           285: >>> CHECK 5 in list
        !           286: >>> CHECK 6 in list
        !           287: *** Your check failed in your command
        !           288:     CHECK 6 in list
        !           289: >>> FOR i IN list: WRITE 10*i
        !           290: 10 20 30 40 50 50 70 80 90 100
        !           291: >>> ==
        !           292: list message number\*(:>
        !           293: .DE
        !           294: Note that a \*(<:CHECK\*(:> command that succeeds doesn't print any message.
        !           295: Also note carefully that
        !           296: the target \*(<:i\*(:> used in the \*(<:FOR\*(:> command doesn't exist afterwards.
        !           297: .PP
        !           298: When you want to type a \*(<:WHILE\*(:> command,
        !           299: and you type the initial \*(<:W\*(:>,
        !           300: the suggestion you get is of course \*(<:W_?RITE ?\*(:>.
        !           301: Here you must type an \*(<:H\*(:>,
        !           302: and the system then suggests
        !           303: .DS
        !           304: \*(<:>>> WH_?ILE ?:\*(:>
        !           305: .DE
        !           306: Now you can press
        !           307: .KY accept
        !           308: to go to the hole,
        !           309: type the test,
        !           310: and press
        !           311: .KY newline :
        !           312: .DS
        !           313: \*(<:>>> WHILE list <> {}:
        !           314:         _?\*(:>
        !           315: .DE
        !           316: Because the \*B system knows that the commands of a \*(<:WHILE\*(:> must be indented,
        !           317: it indents for you automatically.
        !           318: You may now type in the commands to be part of the \*(<:WHILE\*(:>,
        !           319: and each time the system indents you to the right place.
        !           320: After the last command you just need to type an extra
        !           321: .KY newline ,
        !           322: and the system undoes the indentation one level,
        !           323: and executes the \*(<:WHILE\*(:>.
        !           324: (If there is only one simple command to be repeated,
        !           325: it may be on the same line as the \*(<:WHILE\*(:>,
        !           326: but doesn't have to be).
        !           327: .DS
        !           328: \*(<:>>> WHILE list <> {}:
        !           329:         CHOOSE number FROM list
        !           330:         REMOVE number FROM list
        !           331:         WRITE number
        !           332: 2 8 4 7 9 5 3 1 5 10
        !           333: >>> WRITE list
        !           334: {}\*(:>
        !           335: .DE
        !           336: .SH
        !           337: Finishing a B Session
        !           338: .PP
        !           339: The one command that has a different meaning when you type it after a prompt
        !           340: is \*(<:QUIT\*(:>,
        !           341: which just terminates the \*B session.
        !           342: When you type the \*(<:Q\*(:> you will get a suggestion as usual.
        !           343: .DS
        !           344: \*(<:>>> Q_?UIT\*(:>
        !           345: .DE
        !           346: Here there are no holes,
        !           347: but you must still press
        !           348: .KY accept
        !           349: to accept the suggestion,
        !           350: before pressing
        !           351: .KY newline .
        !           352: .SH
        !           353: Making your own Commands
        !           354: .PP
        !           355: You can create your own commands by typing in a how-to unit
        !           356: that defines what your command means.
        !           357: Suppose you type in response to the \*B prompt:
        !           358: .DS
        !           359: \*(<:>>> HOW'TO GREET:
        !           360:         WRITE 'Hello'\*(:>
        !           361: .DE
        !           362: The system gives a suggestion for \*(<:HOW'TO\*(:>,
        !           363: and supplies indentation for you,
        !           364: just as with \*(<:WHILE\*(:>,
        !           365: and you finish by pressing
        !           366: .KY newline
        !           367: until you get the command prompt again.
        !           368: Well,
        !           369: now you've defined your first command,
        !           370: and can execute it by typing its name after the prompt.
        !           371: You will notice that after typing the \*(<:G\*(:> you will get a suggestion for it:
        !           372: .DS
        !           373: \*(<:>>> G_?REET\*(:>
        !           374: .DE
        !           375: Just as with \*(<:QUIT\*(:>,
        !           376: there are no holes,
        !           377: but you must
        !           378: .KY accept
        !           379: the suggestion.
        !           380: .DS
        !           381: \*(<:>>> GREET_?\*(:>
        !           382: .DE
        !           383: Now press
        !           384: .KY newline
        !           385: and your command gets executed,
        !           386: and you get the prompt again:
        !           387: .DS
        !           388: \*(<:>>> GREET
        !           389: Hello
        !           390: >>>\*(:>
        !           391: .DE
        !           392: You may use your own commands just like any in-built command:
        !           393: .DS
        !           394: \*(<:>>> FOR i IN {1..10}: GREET
        !           395: HelloHelloHelloHelloHelloHelloHelloHelloHelloHello\*(:>
        !           396: .DE
        !           397: .SH
        !           398: Correcting errors
        !           399: .PP
        !           400: Apart from
        !           401: .KY back ,
        !           402: another way of correcting errors is to correct a whole line.
        !           403: Here you use the ability to move the focus about.
        !           404: Earlier the focus was a single character,
        !           405: just the hole.
        !           406: However,
        !           407: the focus may be more than one character: it may be several characters,
        !           408: a whole command,
        !           409: or even several commands.
        !           410: .PP
        !           411: Two of the eight keys for moving the focus are
        !           412: .KY up
        !           413: and
        !           414: .KY down .
        !           415: .PP
        !           416: The
        !           417: .KY up
        !           418: key moves the focus up to the previous line
        !           419: so that it includes the whole line.
        !           420: So if you have the following situation:
        !           421: .DS
        !           422: \*(<:>>> FOR i IN {1..3}:
        !           423:         WRITE /
        !           424:         GREET
        !           425:         WRITE /_?\*(:>
        !           426: .DE
        !           427: then typing
        !           428: .KY up
        !           429: gives you
        !           430: .DS
        !           431: \*(<:>>> FOR i IN {1..3}:
        !           432:         WRITE /
        !           433:         GREET_____
        !           434:         WRITE /\*(:>
        !           435: .DE
        !           436: Here the hole in the last line has disappeared
        !           437: (because the line is legal \*B)
        !           438: and the focus has moved up to the whole of the preceding line.
        !           439: You may press
        !           440: .KY up
        !           441: several time to go up several lines.
        !           442: So,
        !           443: pressing
        !           444: .KY up
        !           445: again gives:
        !           446: .DS
        !           447: \*(<:>>> FOR i IN {1..3}:
        !           448:         WRITE /_______
        !           449:         GREET
        !           450:         WRITE /\*(:>
        !           451: .DE
        !           452: The
        !           453: .KY down
        !           454: key does the same but in the other direction.
        !           455: .PP
        !           456: Now the point of all this is,
        !           457: that if you have a line in a command or unit that you want to change,
        !           458: you can move the focus to it,
        !           459: and press
        !           460: .KY delete
        !           461: to get rid of it.
        !           462: This leaves a hole in its place so that you can type a replacement line:
        !           463: .DS
        !           464: \*(<:>>> FOR i IN {1..3}:
        !           465:         ?_
        !           466:         GREET
        !           467:         WRITE /\*(:>
        !           468: .DE
        !           469: If you don't want to replace the line,
        !           470: but completely delete it,
        !           471: then pressing
        !           472: .KY delete
        !           473: again deletes the hole too:
        !           474: .DS
        !           475: \*(<:>>> FOR i IN {1..3}:
        !           476:         GREET_____
        !           477:         WRITE /\*(:>
        !           478: .DE
        !           479: .SH
        !           480: Changing Existing Units
        !           481: .PP
        !           482: Just as you can type two equals signs
        !           483: to find out what permanent targets you have,
        !           484: you can type two colons to
        !           485: find out what units you have in the current workspace.
        !           486: This gives you a list of the first line of each unit in the workspace:
        !           487: .DS
        !           488: \*(<:>>> ::
        !           489: HOW'TO GREET:\*(:>
        !           490: .DE
        !           491: If you want to change any of these units,
        !           492: you can type a colon followed by the name of the unit you want:
        !           493: .DS
        !           494: \*(<:>>> :GREET\*(:>
        !           495: .DE
        !           496: (If the unit you want to change is the last unit you typed in
        !           497: or changed in this session,
        !           498: or the last unit that you got an error message about,
        !           499: then you don't even need to type its name:
        !           500: the system remembers the name of the unit,
        !           501: so all you need to do is type a single colon.)
        !           502: .PP
        !           503: What happens now is that the whole unit is displayed
        !           504: (or as much as will fit on the screen if it is big)
        !           505: with the focus on the line you were last at in the unit.
        !           506: You can now use all the focus moving keys to position
        !           507: to the lines you want to change,
        !           508: and change them.
        !           509: When you have finished,
        !           510: you use the
        !           511: .KY exit
        !           512: key.
        !           513: .SH
        !           514: Errors in Units
        !           515: .PP
        !           516: If when you type in or change a unit,
        !           517: the result has an error in it,
        !           518: you will get an error message from the \*B system.
        !           519: This may happen when you press
        !           520: .KY exit ,
        !           521: or when you run the unit, depending on the sort of error it is.
        !           522: For instance,
        !           523: in this unit,
        !           524: the parameter is \*(<:x\*(:>,
        !           525: but \*(<:n\*(:> is used instead:
        !           526: .DS
        !           527: \*(<:>>> HOW'TO SQUARE x:
        !           528:         WRITE n*n
        !           529: >>> SQUARE 4
        !           530: *** Can't cope with problem in line 2 of your unit SQUARE
        !           531:     WRITE n*n
        !           532: *** The problem is: n has not yet received a value\*(:>
        !           533: .DE
        !           534: When you get such a message,
        !           535: it is very easy to make the necessary correction:
        !           536: since the unit you want to change is
        !           537: the last one that you got an error message for,
        !           538: you only need to type a colon after the prompt:
        !           539: .DS
        !           540: \*(<:>>> :
        !           541: HOW'TO SQUARE x:
        !           542:     WRITE n*n_________\*(:>
        !           543: .DE
        !           544: As you see,
        !           545: you are positioned at the line that gave the error message.
        !           546: Now you can either press
        !           547: .KY delete
        !           548: and retype the whole line,
        !           549: or use the other focus-moving keys to focus on only the part that is in error.
        !           550: .SH
        !           551: Other Focus Moving Keys
        !           552: .PP
        !           553: Apart from
        !           554: .KY up
        !           555: and
        !           556: .KY down
        !           557: there are six other keys for moving the focus,
        !           558: two for making the focus smaller:
        !           559: .KY first
        !           560: and
        !           561: .KY last ,
        !           562: two for enlarging it:
        !           563: .KY widen
        !           564: and
        !           565: .KY extend ,
        !           566: and two for moving it sideways:
        !           567: .KY previous
        !           568: and
        !           569: .KY next .
        !           570: .PP
        !           571: In this case we want to make the focus smaller,
        !           572: by going to the last part of the line.
        !           573: Thus,
        !           574: we can press
        !           575: .KY last
        !           576: and we see:
        !           577: .DS
        !           578: \*(<:HOW'TO SQUARE x:
        !           579:     WRITE n*n___\*(:>
        !           580: .DE
        !           581: Pressing
        !           582: .KY delete
        !           583: deletes the part in the focus,
        !           584: leaving only a hole:
        !           585: .DS
        !           586: \*(<:HOW'TO SQUARE x:
        !           587:     WRITE ?_\*(:>
        !           588: .DE
        !           589: Now we can type the correct expression and then press
        !           590: .KY exit :
        !           591: .DS
        !           592: \*(<:HOW'TO SQUARE x:
        !           593:     WRITE x*x\*(:>
        !           594: .DE
        !           595: Suppose now you have the following unit to solve quadratic equations
        !           596: (if you don't know what these are,
        !           597: it doesn't matter):
        !           598: .DS
        !           599: \*(<:HOW'TO SOLVE a X2 b X c:
        !           600:     PUT root (b**2-4*a*c) IN x
        !           601:     WRITE (-b+x)/2*a, (-b-x)/2*a /
        !           602: 
        !           603: *** There's something I don't understand in line 3 of your unit SOLVE
        !           604:     WRITE (-b+x)/2*a, (-b-x)/2*a /
        !           605:                   ^
        !           606: *** The problem is: priorities? use ( and ) to resolve\*(:>
        !           607: .DE
        !           608: The system doesn't know whether to divide by \*(<:2\*(:> or \*(<:2*a\*(:>,
        !           609: so you must insert brackets.
        !           610: .DS
        !           611: \*(<:>>> :
        !           612: HOW'TO SOLVE a X2 b X c:
        !           613:     PUT root (b**2-4*a*c) IN x
        !           614:     WRITE (-b+x)/2*a, (-b-x)/2*a /______________________________\*(:>
        !           615: .DE
        !           616: Now we want to narrow down to \*(<:2*a\*(:>.
        !           617: Pressing
        !           618: .KY last
        !           619: gives
        !           620: .DS
        !           621: \*(<:HOW'TO SOLVE a X2 b X c:
        !           622:     PUT root (b**2-4*a*c) IN x
        !           623:     WRITE (-b+x)/2*a, (-b-x)/2*a /________________________\*(:>
        !           624: .DE
        !           625: and then
        !           626: .KY first
        !           627: gives
        !           628: .DS
        !           629: \*(<:HOW'TO SOLVE a X2 b X c:
        !           630:     PUT root (b**2-4*a*c) IN x
        !           631:     WRITE (-b+x)/2*a, (-b-x)/2*a /___________\*(:>
        !           632: .DE
        !           633: and another
        !           634: .KY first
        !           635: gives
        !           636: .DS
        !           637: \*(<:HOW'TO SOLVE a X2 b X c:
        !           638:     PUT root (b**2-4*a*c) IN x
        !           639:     WRITE (-b+x)/2*a, (-b-x)/2*a /__________\*(:>
        !           640: .DE
        !           641: Now
        !           642: .KY last
        !           643: gives us
        !           644: .DS
        !           645: \*(<:HOW'TO SOLVE a X2 b X c:
        !           646:     PUT root (b**2-4*a*c) IN x
        !           647:     WRITE (-b+x)/2*a_, (-b-x)/2*a /\*(:>
        !           648: .DE
        !           649: The key
        !           650: .KY extend
        !           651: tries whenever possible to extend the focus to the right.
        !           652: But it sometimes can't,
        !           653: if what is to the right isn't associated with what is in the focus.
        !           654: This is the case here:
        !           655: the comma is associated with the \fIwhole\fP expression \*(<:(-b+x)/2*a\*(:>,
        !           656: and so
        !           657: .KY extend
        !           658: extends to the left instead:
        !           659: .DS
        !           660: \*(<:HOW'TO SOLVE a X2 b X c:
        !           661:     PUT root (b**2-4*a*c) IN x
        !           662:     WRITE (-b+x)/2*a__, (-b-x)/2*a /\*(:>
        !           663: .DE
        !           664: and once more pressing
        !           665: .KY extend :
        !           666: .DS
        !           667: \*(<:HOW'TO SOLVE a X2 b X c:
        !           668:     PUT root (b**2-4*a*c) IN x
        !           669:     WRITE (-b+x)/2*a___, (-b-x)/2*a /\*(:>
        !           670: .DE
        !           671: Now we have the expression we want,
        !           672: and typing an opening bracket encloses the whole expression:
        !           673: .DS
        !           674: \*(<:HOW'TO SOLVE a X2 b X c:
        !           675:     PUT root (b**2-4*a*c) IN x
        !           676:     WRITE (-b+x)/(?_2*a), (-b-x)/2*a /\*(:>
        !           677: .DE
        !           678: Now you can use the focus moves to do the same to the second \*(<:2*a\*(:>.
        !           679: .LP
        !           680: The focus move keys are very easy to use.
        !           681: After a little practice you will find they come very naturally.
        !           682: .SH
        !           683: Copying
        !           684: .PP
        !           685: It is often the case that you want to duplicate a piece of program.
        !           686: If the focus is on something other than a hole,
        !           687: the
        !           688: .KY copy
        !           689: key copies whatever is in the focus to what is called the
        !           690: .I "copy buffer"
        !           691: and lets you know that there is something in the copy buffer
        !           692: by displaying the words \*(<:[copy\ buffer]\*(:> at the bottom of the screen,
        !           693: along with the first bit of what is stored.
        !           694: .PP
        !           695: If, however, the focus is on a hole,
        !           696: then the
        !           697: .KY copy
        !           698: key copies the contents of the buffer into that hole.
        !           699: The \*(<:[copy\ buffer]\*(:> message then disappears, though
        !           700: actually the contents of the buffer remain, so you can continue to use it.
        !           701: However,
        !           702: if the contents of the buffer may not be copied there, you just get a bleep;
        !           703: for instance you can't copy a \*(<:WRITE\*(:> command to a place where
        !           704: an expression must be.
        !           705: .PP
        !           706: You can use the
        !           707: .KY copy
        !           708: key for moving things too:
        !           709: focus on what you want, press
        !           710: .KY copy ,
        !           711: press
        !           712: .KY delete
        !           713: twice to delete it and
        !           714: the hole that gets left after the first delete,
        !           715: move to where you want,
        !           716: make a hole, and press
        !           717: .KY copy
        !           718: again.
        !           719: .PP
        !           720: Making a hole is straightforward.
        !           721: A
        !           722: .KY newline
        !           723: always makes a hole on a new blank line
        !           724: after the line that the focus was positioned on.
        !           725: An
        !           726: .KY accept
        !           727: always takes you to the first hole on a line,
        !           728: or if there is no hole on the line, then it makes one at the end of the line.
        !           729: Finally, pressing
        !           730: .KY first
        !           731: or
        !           732: .KY last
        !           733: enough times makes one,
        !           734: .KY first
        !           735: in front of the focus,
        !           736: .KY last
        !           737: after it.
        !           738: .PP
        !           739: You can use the
        !           740: .KY copy
        !           741: key for copying between different units too.
        !           742: Even if you log out, and come back later, and start using \*B again,
        !           743: the copy buffer is kept.
        !           744: .PP
        !           745: Additionally, if the \*(<:[copy buffer]\*(:> message isn't being displayed,
        !           746: that is, if the copy buffer is empty,
        !           747: and you
        !           748: .KY delete
        !           749: something, whatever you delete is put into the copy buffer;
        !           750: similarly if the copy buffer is empty,
        !           751: each immediate command is stored in the copy buffer.
        !           752: Thus if you mis-type an immediate command,
        !           753: you can use
        !           754: .KY copy
        !           755: to bring it back, and edit it.
        !           756: .SH
        !           757: Renaming and deleting units
        !           758: .PP
        !           759: If you change the name of a unit, or the adicity of a \*(<:YIELD\*(:> or \*(<:TEST\*(:>
        !           760: (such as making a dyadic \*(<:YIELD\*(:> into a monadic one) by changing its heading,
        !           761: then you get the new unit
        !           762: .I and
        !           763: the old one.
        !           764: So, renaming \*(<:GREET\*(:> into \*(<:HELLO\*(:>, and then giving a \*(<:::\*(:> command
        !           765: would give:
        !           766: .DS
        !           767: \*(<:>>> ::
        !           768: HOW'TO GREET:
        !           769: HOW'TO HELLO:
        !           770: HOW'TO SOLVE a X2 b X c:
        !           771: HOW'TO SQUARE x:\*(:>
        !           772: .DE
        !           773: If you delete the
        !           774: .I whole
        !           775: of a unit (by pressing
        !           776: .KY widen
        !           777: until the focus is on the whole unit,
        !           778: and then pressing
        !           779: .KY delete )
        !           780: the unit disappears.
        !           781: Thus deleting \*(<:GREET\*(:> will give you:
        !           782: .DS
        !           783: \*(<:>>> ::
        !           784: HOW'TO HELLO:
        !           785: HOW'TO SOLVE a X2 b X c:
        !           786: HOW'TO SQUARE x:\*(:>
        !           787: .DE
        !           788: .SH
        !           789: Changing targets
        !           790: .PP
        !           791: You may also use the editor for changing permanent targets.
        !           792: Just as you use a single colon for editing units,
        !           793: a single equals followed by the name of a target
        !           794: will display the contents of the target,
        !           795: and let you make changes in the usual way.
        !           796: In fact, you may replace the contents by any
        !           797: .I expression.
        !           798: When you press
        !           799: .KY exit ,
        !           800: the expression is evaluated, and if all is ok
        !           801: the value is put in the target.
        !           802: .SH
        !           803: Workspaces
        !           804: .PP
        !           805: A workspace is a collection of units plus a permanent environment.
        !           806: You can have several workspaces: to create a new one
        !           807: you just start \*B up in a new directory in the filestore.
        !           808: .PP
        !           809: To move units and targets between workspaces, just use the
        !           810: .KY copy
        !           811: key:
        !           812: start \*B up in the one workspace, save whatever you want to move
        !           813: in the copy buffer,
        !           814: exit \*B, move to the destination workspace,
        !           815: re-enter \*B, and copy the buffer back.
        !           816: .SH
        !           817: Record and play
        !           818: .PP
        !           819: Sometimes you need to repeat a sequence of keystrokes several times.
        !           820: For instance, if you want to rename a target in a unit,
        !           821: you have to do it once for each occurrence of the target.
        !           822: An easy way to do this is to
        !           823: .I record
        !           824: a sequence of keystrokes.
        !           825: If you press
        !           826: .KY record ,
        !           827: the message \*(<:[recording]\*(:> appears at the bottom of the screen,
        !           828: and any keys that you type thereafter are processed normally
        !           829: and recorded at the same time,
        !           830: until you press
        !           831: .KY record
        !           832: again.
        !           833: Then pressing
        !           834: .KY play
        !           835: plays those recorded keystrokes back.
        !           836: .PP
        !           837: So, for instance, focus on the target you want to rename,
        !           838: press
        !           839: .KY record ,
        !           840: press
        !           841: .KY delete ,
        !           842: type the new name, and press
        !           843: .KY record
        !           844: again.
        !           845: Then focus on the next occurrence of the target,
        !           846: and press
        !           847: .KY play .
        !           848: .PP
        !           849: Keystrokes that cause an error during recording are not recorded.
        !           850: .SH
        !           851: Redisplaying the screen
        !           852: .PP
        !           853: Sometimes the screen can get messed up
        !           854: (for instance, if your terminal gets accidentally unplugged).
        !           855: If this happens, or you don't believe what you see on the screen,
        !           856: you can always get confirmation by pressing
        !           857: .KY look .
        !           858: This causes the screen to be redisplayed.
        !           859: .SH
        !           860: Interrupting a running command
        !           861: .PP
        !           862: If a command is executing, and you want to stop it,
        !           863: pressing
        !           864: .KY interrupt
        !           865: aborts the command
        !           866: and gives you a prompt again.
        !           867: .SH
        !           868: Incomplete units
        !           869: .PP
        !           870: If, when typing in or correcting a command or unit,
        !           871: you press
        !           872: .KY exit
        !           873: and there are still unfilled holes,
        !           874: the system tells you so,
        !           875: and you must fill or delete them.
        !           876: If you want to exit leaving the holes, to fill them later,
        !           877: use the
        !           878: .KY interrupt
        !           879: key.
        !           880: The system won't let you run an incomplete unit.
        !           881: .SH
        !           882: Getting help
        !           883: .PP
        !           884: Pressing the
        !           885: .KY help
        !           886: key gives you a quick summary of all the keys.
        !           887: Refer to the ``Quick Reference'' card for a brief reminder of the features of
        !           888: the \*B language,
        !           889: and the ``Description of \*B'' for more detailed explanations.
        !           890: .SH
        !           891: Running \*B in the background
        !           892: .PP
        !           893: If your computer system lets you,
        !           894: you can also run \*B non-interactively.
        !           895: In this case \*B commands are read from the standard input, and executed.
        !           896: You may only use normal \*B commands in this case: no focus moves,
        !           897: or editing, and no \*(<:::\*(:> or \*(<:==\*(:> commands.

unix.superglobalmegacorp.com

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