|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.