|
|
1.1 ! root 1: .\" @(#)bc 6.1 (Berkeley) 5/23/86 ! 2: .\" ! 3: .EH 'USD:6-%''BC \- An Arbitrary Precision Desk-Calculator Language' ! 4: .OH 'BC \- An Arbitrary Precision Desk-Calculator Language''USD:6-%' ! 5: .\".RP ! 6: .TL ! 7: BC \- An Arbitrary Precision Desk-Calculator Language ! 8: .AU ! 9: Lorinda Cherry ! 10: .AU ! 11: Robert Morris ! 12: .AI ! 13: .MH ! 14: .AB ! 15: BC is a language and a compiler for doing arbitrary precision arithmetic ! 16: on the PDP-11 under the ! 17: .UX ! 18: time-sharing ! 19: system. The output of the compiler is interpreted and executed by ! 20: a collection of routines which can input, output, and do ! 21: arithmetic on indefinitely large integers and on scaled fixed-point ! 22: numbers. ! 23: .PP ! 24: These routines are themselves based on a dynamic storage allocator. ! 25: Overflow does not occur until all available core storage ! 26: is exhausted. ! 27: .PP ! 28: The language has a complete control structure as well as immediate-mode ! 29: operation. Functions can be defined and saved for later execution. ! 30: .PP ! 31: Two five hundred-digit numbers can be multiplied to give a ! 32: thousand digit result in about ten seconds. ! 33: .PP ! 34: A small collection of library functions is also available, ! 35: including sin, cos, arctan, log, exponential, and Bessel functions of ! 36: integer order. ! 37: .PP ! 38: Some of the uses of this compiler are ! 39: .IP \- ! 40: to do computation with large integers, ! 41: .IP \- ! 42: to do computation accurate to many decimal places, ! 43: .IP \- ! 44: conversion of numbers from one base to another base. ! 45: .AE ! 46: .PP ! 47: .SH ! 48: Introduction ! 49: .PP ! 50: BC is a language and a compiler for doing arbitrary precision ! 51: arithmetic on the ! 52: .UX ! 53: time-sharing system [1]. ! 54: The compiler was written to make conveniently available a ! 55: collection of routines (called DC [5]) which are capable of doing ! 56: arithmetic on integers of arbitrary size. The compiler ! 57: is by no means intended to provide a complete programming ! 58: language. ! 59: It is a minimal language facility. ! 60: .PP ! 61: There is a scaling provision that permits the ! 62: use of decimal point notation. ! 63: Provision is made for input and output in bases other than ! 64: decimal. Numbers can be converted from decimal to octal by ! 65: simply setting the output base to equal 8. ! 66: .PP ! 67: The actual limit on the number of digits that can ! 68: be handled depends on the amount of storage available on the machine. ! 69: Manipulation of numbers with many hundreds of digits ! 70: is possible even on the smallest versions of ! 71: .UX . ! 72: .PP ! 73: The syntax of BC has been deliberately selected to agree ! 74: substantially with the C language [2]. Those who ! 75: are familiar with C will find few surprises in this language. ! 76: .SH ! 77: Simple Computations with Integers ! 78: .PP ! 79: The simplest kind of statement is an arithmetic expression ! 80: on a line by itself. ! 81: For instance, if you type in the line: ! 82: .DS ! 83: .ft B ! 84: 142857 + 285714 ! 85: .ft P ! 86: .DE ! 87: the program responds immediately with the line ! 88: .DS ! 89: .ft B ! 90: 428571 ! 91: .ft P ! 92: .DE ! 93: The operators \-, *, /, %, and ^ can also be used; they ! 94: indicate subtraction, multiplication, division, remaindering, and ! 95: exponentiation, respectively. Division of integers produces an ! 96: integer result truncated toward zero. ! 97: Division by zero produces an error ! 98: comment. ! 99: .PP ! 100: Any term in an expression may be prefixed by a minus sign to ! 101: indicate that it is to be negated (the `unary' minus sign). ! 102: The expression ! 103: .DS ! 104: .ft B ! 105: 7+\-3 ! 106: .ft P ! 107: .DE ! 108: is interpreted to mean that \-3 is to be added to 7. ! 109: .PP ! 110: More complex expressions with several operators and with ! 111: parentheses are interpreted just as in ! 112: Fortran, with ^ having the greatest binding ! 113: power, then * and % and /, and finally + and \-. ! 114: Contents of parentheses are evaluated before material ! 115: outside the parentheses. ! 116: Exponentiations are ! 117: performed from right to left and the other operators ! 118: from left to right. ! 119: The two expressions ! 120: .DS ! 121: .ft B ! 122: a^b^c and a^(b^c) ! 123: .ft P ! 124: .DE ! 125: are equivalent, as are the two expressions ! 126: .DS ! 127: .ft B ! 128: a*b*c and (a*b)*c ! 129: .ft P ! 130: .DE ! 131: BC shares with Fortran and C the undesirable convention that ! 132: .DS ! 133: \fBa/b*c\fP is equivalent to \fB(a/b)*c\fP ! 134: .ft P ! 135: .DE ! 136: .PP ! 137: Internal storage registers to hold numbers have single lower-case ! 138: letter names. The value of an expression can be assigned to ! 139: a register in the usual way. The statement ! 140: .DS ! 141: .ft B ! 142: x = x + 3 ! 143: .ft P ! 144: .DE ! 145: has the effect of increasing by three the value of the contents of the ! 146: register named x. ! 147: When, as in this case, the outermost operator is an =, the ! 148: assignment is performed but the result is not printed. ! 149: Only 26 of these named storage registers are available. ! 150: .PP ! 151: There is a built-in square root function whose ! 152: result is truncated to an integer (but see scaling below). ! 153: The lines ! 154: .DS ! 155: .ft B ! 156: x = sqrt(191) ! 157: x ! 158: .ft P ! 159: .DE ! 160: produce the printed result ! 161: .DS ! 162: .ft B ! 163: 13 ! 164: .ft P ! 165: .DE ! 166: .SH ! 167: Bases ! 168: .PP ! 169: There are special internal quantities, called `ibase' and `obase'. ! 170: The contents of `ibase', initially set to 10, ! 171: determines the base used for interpreting numbers read in. ! 172: For example, the lines ! 173: .DS ! 174: .ft B ! 175: ibase = 8 ! 176: 11 ! 177: .ft P ! 178: .DE ! 179: will produce the output line ! 180: .DS ! 181: .ft B ! 182: 9 ! 183: .ft P ! 184: .DE ! 185: and you are all set up to do octal to decimal conversions. ! 186: Beware, however of trying to change the input base back ! 187: to decimal by typing ! 188: .DS ! 189: .ft B ! 190: ibase = 10 ! 191: .ft P ! 192: .DE ! 193: Because the number 10 is interpreted as octal, this statement will ! 194: have no effect. ! 195: For those who deal in hexadecimal notation, ! 196: the characters A\-F are permitted in numbers ! 197: (no matter what base is in effect) ! 198: and are ! 199: interpreted as digits having values 10\-15 respectively. ! 200: The statement ! 201: .DS ! 202: .ft B ! 203: ibase = A ! 204: .ft P ! 205: .DE ! 206: will change you back to decimal input base no matter what the ! 207: current input base is. ! 208: Negative and large positive input bases are ! 209: permitted but useless. ! 210: No mechanism has been provided for the input of arbitrary ! 211: numbers in bases less than 1 and greater than 16. ! 212: .PP ! 213: The contents of `obase', initially set to 10, are used as the base for output ! 214: numbers. The lines ! 215: .DS ! 216: .ft B ! 217: obase = 16 ! 218: 1000 ! 219: .ft P ! 220: .DE ! 221: will produce the output line ! 222: .DS ! 223: .ft B ! 224: 3E8 ! 225: .ft P ! 226: .DE ! 227: which is to be interpreted as a 3-digit hexadecimal number. ! 228: Very large output bases are permitted, and they are sometimes useful. ! 229: For example, large numbers can be output in groups of five digits ! 230: by setting `obase' to 100000. ! 231: Strange (i.e. 1, 0, or negative) output bases are ! 232: handled appropriately. ! 233: .PP ! 234: Very large numbers are split across lines with 70 characters per line. ! 235: Lines which are continued end with \\. ! 236: Decimal output conversion is practically instantaneous, but output ! 237: of very large numbers (i.e., more than 100 digits) with other bases ! 238: is rather slow. ! 239: Non-decimal output conversion of ! 240: a one hundred digit number takes about ! 241: three seconds. ! 242: .PP ! 243: It is best to remember that `ibase' and `obase' have no effect ! 244: whatever on the course of internal computation or ! 245: on the evaluation of expressions, but only affect input and ! 246: output conversion, respectively. ! 247: .SH ! 248: Scaling ! 249: .PP ! 250: A third special internal quantity called `scale' is ! 251: used to determine the scale of calculated ! 252: quantities. ! 253: Numbers may have ! 254: up to 99 decimal digits after the decimal point. ! 255: This fractional part is retained in further computations. ! 256: We refer to the number of digits after the decimal point of ! 257: a number as its scale. ! 258: .PP ! 259: When two scaled numbers are combined by ! 260: means of one of the arithmetic operations, the result ! 261: has a scale determined by the following rules. For ! 262: addition and subtraction, the scale of the result is the larger ! 263: of the scales of the two operands. In this case, ! 264: there is never any truncation of the result. ! 265: For multiplications, the scale of the result is never ! 266: less than the maximum of the two scales of the operands, ! 267: never more than the sum of the scales of the operands ! 268: and, subject to those two restrictions, ! 269: the scale of the result is set equal to the contents of the internal ! 270: quantity `scale'. ! 271: The scale of a quotient is the contents of the internal ! 272: quantity `scale'. The scale of a remainder is ! 273: the sum of the scales of the quotient and the divisor. ! 274: The result of an exponentiation is scaled as if ! 275: the implied multiplications were performed. ! 276: An exponent must be an integer. ! 277: The scale of a square root is set to the maximum of the scale ! 278: of the argument and the contents of `scale'. ! 279: .PP ! 280: All of the internal operations are actually carried out in terms ! 281: of integers, with digits being discarded when necessary. ! 282: In every case where digits are discarded, truncation and ! 283: not rounding is performed. ! 284: .PP ! 285: The contents of ! 286: `scale' must be no greater than ! 287: 99 and no less than 0. It is initially set to 0. ! 288: In case you need more than 99 fraction digits, you may arrange ! 289: your own scaling. ! 290: .PP ! 291: The internal quantities `scale', `ibase', and `obase' can be ! 292: used in expressions just like other variables. ! 293: The line ! 294: .DS ! 295: .ft B ! 296: scale = scale + 1 ! 297: .ft P ! 298: .DE ! 299: increases the value of `scale' by one, and the line ! 300: .DS ! 301: .ft B ! 302: scale ! 303: .ft P ! 304: .DE ! 305: causes the current value of `scale' to be printed. ! 306: .PP ! 307: The value of `scale' retains its meaning as a ! 308: number of decimal digits to be retained in internal ! 309: computation even when `ibase' or `obase' are not equal to 10. ! 310: The internal computations (which are still conducted in decimal, ! 311: regardless of the bases) are performed to the specified number ! 312: of decimal digits, never hexadecimal or octal or any ! 313: other kind of digits. ! 314: .SH ! 315: Functions ! 316: .PP ! 317: The name of a function is a single lower-case letter. ! 318: Function names are permitted to collide with simple ! 319: variable names. ! 320: Twenty-six different defined functions are permitted ! 321: in addition to the twenty-six variable names. ! 322: The line ! 323: .DS ! 324: .ft B ! 325: define a(x){ ! 326: .ft P ! 327: .DE ! 328: begins the definition of a function with one argument. ! 329: This line must be followed by one or more statements, ! 330: which make up the body of the function, ending ! 331: with a right brace }. ! 332: Return of control from a function occurs when a return ! 333: statement is executed or when the end of the function is reached. ! 334: The return statement can take either ! 335: of the two forms ! 336: .DS ! 337: .ft B ! 338: return ! 339: return(x) ! 340: .ft P ! 341: .DE ! 342: In the first case, the value of the function is 0, and in ! 343: the second, the value of the expression in parentheses. ! 344: .PP ! 345: Variables used in the function can be declared as automatic ! 346: by a statement of the form ! 347: .DS ! 348: .ft B ! 349: auto x,y,z ! 350: .ft P ! 351: .DE ! 352: There can be only one `auto' statement in a function and it must ! 353: be the first statement in the definition. ! 354: These automatic variables are allocated space and initialized ! 355: to zero on entry to the function and thrown away on return. The ! 356: values of any variables with the same names outside the function ! 357: are not disturbed. ! 358: Functions may be called recursively and the automatic variables ! 359: at each level of call are protected. ! 360: The parameters named in a function definition are treated in ! 361: the same way as the automatic variables of that function ! 362: with the single exception that they are given a value ! 363: on entry to the function. ! 364: An example of a function definition is ! 365: .DS ! 366: .ft B ! 367: define a(x,y){ ! 368: auto z ! 369: z = x*y ! 370: return(z) ! 371: } ! 372: .ft P ! 373: .DE ! 374: The value of this function, when called, will be the ! 375: product of its ! 376: two arguments. ! 377: .PP ! 378: A function is called by the appearance of its name ! 379: followed by a string of arguments enclosed in ! 380: parentheses and separated by commas. ! 381: The result ! 382: is unpredictable if the wrong number of arguments is used. ! 383: .PP ! 384: Functions with no arguments are defined and called using ! 385: parentheses with nothing between them: b(). ! 386: .PP ! 387: If the function ! 388: .ft I ! 389: a ! 390: .ft ! 391: above has been defined, then the line ! 392: .DS ! 393: .ft B ! 394: a(7,3.14) ! 395: .ft P ! 396: .DE ! 397: would cause the result 21.98 to be printed and the line ! 398: .DS ! 399: .ft B ! 400: x = a(a(3,4),5) ! 401: .ft P ! 402: .DE ! 403: would cause the value of x to become 60. ! 404: .SH ! 405: Subscripted Variables ! 406: .PP ! 407: A single lower-case letter variable name ! 408: followed by an expression in brackets is called a subscripted ! 409: variable (an array element). ! 410: The variable name is called the array name and the expression ! 411: in brackets is called the subscript. ! 412: Only one-dimensional arrays are ! 413: permitted. The names of arrays are permitted to ! 414: collide with the names of simple variables and function names. ! 415: Any fractional ! 416: part of a subscript is discarded before use. ! 417: Subscripts must be greater than or equal to zero and ! 418: less than or equal to 2047. ! 419: .PP ! 420: Subscripted variables may be freely used in expressions, in ! 421: function calls, and in return statements. ! 422: .PP ! 423: An array name may be used as an argument to a function, ! 424: or may be declared as automatic in ! 425: a function definition by the use of empty brackets: ! 426: .DS ! 427: .ft B ! 428: f(a[\|]) ! 429: define f(a[\|]) ! 430: auto a[\|] ! 431: .ft P ! 432: .DE ! 433: When an array name is so used, the whole contents of the array ! 434: are copied for the use of the function, and thrown away on exit ! 435: from the function. ! 436: Array names which refer to whole arrays cannot be used ! 437: in any other contexts. ! 438: .SH ! 439: Control Statements ! 440: .PP ! 441: The `if', the `while', and the `for' statements ! 442: may be used to alter the flow within programs or to cause iteration. ! 443: The range of each of them is a statement or ! 444: a compound statement consisting of a collection of ! 445: statements enclosed in braces. ! 446: They are written in the following way ! 447: .DS ! 448: .ft B ! 449: if(relation) statement ! 450: while(relation) statement ! 451: for(expression1; relation; expression2) statement ! 452: .ft P ! 453: .DE ! 454: or ! 455: .DS ! 456: .ft B ! 457: if(relation) {statements} ! 458: while(relation) {statements} ! 459: for(expression1; relation; expression2) {statements} ! 460: .ft P ! 461: .DE ! 462: .PP ! 463: A relation in one of the control statements is an expression of the form ! 464: .DS ! 465: .ft B ! 466: x>y ! 467: .ft P ! 468: .DE ! 469: where two expressions are related by one of the six relational ! 470: operators \fS <, >, <=, >=, ==, or !=.\fP ! 471: The relation \fS==\fP ! 472: stands for `equal to' and \fS!=\fP stands for `not equal to'. ! 473: The meaning of the remaining relational operators is ! 474: clear. ! 475: .PP ! 476: BEWARE of using \fS=\fP instead of \fS==\fP in a relational. Unfortunately, ! 477: both of them are legal, so you will not get a diagnostic ! 478: message, but \fS=\fP really will not do a comparison. ! 479: .PP ! 480: The `if' statement causes execution of its range ! 481: if and only if the relation is true. ! 482: Then control passes to the next statement in sequence. ! 483: .PP ! 484: The `while' statement causes execution of its range ! 485: repeatedly as long as the relation ! 486: is true. The relation is tested before each execution ! 487: of its range and if the relation ! 488: is false, control passes to the next statement beyond the range ! 489: of the while. ! 490: .PP ! 491: The `for' statement begins ! 492: by executing `expression1'. Then the relation is tested ! 493: and, if true, the statements in the range of the `for' are executed. ! 494: Then `expression2' is executed. The relation is tested, and so on. ! 495: The typical use of the `for' statement is for a controlled iteration, ! 496: as in the statement ! 497: .DS ! 498: .ft B ! 499: for(i=1; i<=10; i=i+1) i ! 500: .ft P ! 501: .DE ! 502: which will print the integers from 1 to 10. ! 503: Here are some examples of the use of the control statements. ! 504: .DS ! 505: .ft B ! 506: define f(n){ ! 507: auto i, x ! 508: x=1 ! 509: for(i=1; i<=n; i=i+1) x=x*i ! 510: return(x) ! 511: } ! 512: .ft P ! 513: .DE ! 514: The line ! 515: .DS ! 516: .ft B ! 517: f(a) ! 518: .ft P ! 519: .DE ! 520: will print ! 521: .ft I ! 522: a ! 523: .ft ! 524: factorial if ! 525: .ft I ! 526: a ! 527: .ft ! 528: is a positive integer. ! 529: Here is the definition of a function which will ! 530: compute values of the binomial coefficient ! 531: (m and n are assumed to be positive integers). ! 532: .DS ! 533: .ft B ! 534: define b(n,m){ ! 535: auto x, j ! 536: x=1 ! 537: for(j=1; j<=m; j=j+1) x=x*(n\-j+1)/j ! 538: return(x) ! 539: } ! 540: .ft P ! 541: .DE ! 542: The following function computes values of the exponential function ! 543: by summing the appropriate series ! 544: without regard for possible truncation errors: ! 545: .DS ! 546: .ft B ! 547: scale = 20 ! 548: define e(x){ ! 549: auto a, b, c, d, n ! 550: a = 1 ! 551: b = 1 ! 552: c = 1 ! 553: d = 0 ! 554: n = 1 ! 555: while(1==1){ ! 556: a = a*x ! 557: b = b*n ! 558: c = c + a/b ! 559: n = n + 1 ! 560: if(c==d) return(c) ! 561: d = c ! 562: } ! 563: } ! 564: .ft P ! 565: .DE ! 566: .SH ! 567: Some Details ! 568: .PP ! 569: There are some language features that every user should know ! 570: about even if he will not use them. ! 571: .PP ! 572: Normally statements are typed one to a line. It is also permissible ! 573: to type several statements on a line separated by semicolons. ! 574: .PP ! 575: If an assignment statement is parenthesized, it then has ! 576: a value and it can be used anywhere that an expression can. ! 577: For example, the line ! 578: .DS ! 579: .ft B ! 580: (x=y+17) ! 581: .ft P ! 582: .DE ! 583: not only makes the indicated assignment, but also prints the ! 584: resulting value. ! 585: .PP ! 586: Here is an example of a use of the value of an ! 587: assignment statement even when it is not parenthesized. ! 588: .DS ! 589: .ft B ! 590: x = a[i=i+1] ! 591: .ft P ! 592: .DE ! 593: causes a value to be assigned to x and also increments i ! 594: before it is used as a subscript. ! 595: .PP ! 596: The following constructs work in BC in exactly the same manner ! 597: as they do in the C language. Consult the appendix or the ! 598: C manuals [2] for their exact workings. ! 599: .DS ! 600: .ft B ! 601: .ta 2i ! 602: x=y=z is the same as x=(y=z) ! 603: x =+ y x = x+y ! 604: x =\- y x = x\-y ! 605: x =* y x = x*y ! 606: x =/ y x = x/y ! 607: x =% y x = x%y ! 608: x =^ y x = x^y ! 609: x++ (x=x+1)\-1 ! 610: x\-\- (x=x\-1)+1 ! 611: ++x x = x+1 ! 612: \-\-x x = x\-1 ! 613: .ft P ! 614: .DE ! 615: Even if you don't intend to use the constructs, ! 616: if you type one inadvertently, something correct but unexpected ! 617: may happen. ! 618: .PP ! 619: WARNING! In some of these constructions, spaces are ! 620: significant. ! 621: There is a real difference between ! 622: .ft B ! 623: x =\- y and x= \-y. ! 624: .ft P ! 625: The first replaces x by x\-y and the second by \-y. ! 626: .SH ! 627: Three Important Things ! 628: .PP ! 629: 1. To exit a BC program, type `quit'. ! 630: .PP ! 631: 2. There is a comment convention identical to that of C and ! 632: of PL/I. Comments begin with `/*' and end with `*/'. ! 633: .PP ! 634: 3. There is a library of math functions which may be obtained by ! 635: typing at command level ! 636: .DS ! 637: .ft B ! 638: bc \-l ! 639: .ft P ! 640: .DE ! 641: This command will load a set of library functions ! 642: which, at the time of writing, consists of sine (named `s'), ! 643: cosine (`c'), arctangent (`a'), natural logarithm (`l'), ! 644: exponential (`e') and Bessel functions of integer order (`j(n,x)'). Doubtless more functions will be added ! 645: in time. ! 646: The library sets the scale to 20. You can reset it to something ! 647: else if you like. ! 648: The design of these mathematical library routines ! 649: is discussed elsewhere [3]. ! 650: .PP ! 651: If you type ! 652: .DS ! 653: .ft B ! 654: bc file ... ! 655: .ft P ! 656: .DE ! 657: BC will read and execute the named file or files before accepting ! 658: commands from the keyboard. In this way, you may load your ! 659: favorite programs and function definitions. ! 660: .SH ! 661: Acknowledgement ! 662: .PP ! 663: The compiler is written in YACC [4]; its original ! 664: version was written by S. C. Johnson. ! 665: .SH ! 666: References ! 667: .IP [1] ! 668: K. Thompson and D. M. Ritchie, ! 669: .ft I ! 670: UNIX Programmer's Manual, ! 671: .ft ! 672: Bell Laboratories, ! 673: 1978. ! 674: .IP [2] ! 675: B. W. Kernighan and ! 676: D. M. Ritchie, ! 677: .ft I ! 678: The C Programming Language, ! 679: .ft ! 680: Prentice-Hall, 1978. ! 681: .IP [3] ! 682: R. Morris, ! 683: .ft I ! 684: A Library of Reference Standard Mathematical Subroutines, ! 685: .ft ! 686: Bell Laboratories internal memorandum, 1975. ! 687: .IP [4] ! 688: S. C. Johnson, ! 689: .ft I ! 690: YACC \(em Yet Another Compiler-Compiler. ! 691: .ft ! 692: Bell Laboratories Computing Science Technical Report #32, 1978. ! 693: .IP [5] ! 694: R. Morris and L. L. Cherry, ! 695: .ft I ! 696: DC \- An Interactive Desk Calculator. ! 697: .ft ! 698: .LP ! 699: .bp ! 700: .ft B ! 701: .DS C ! 702: Appendix ! 703: .DE ! 704: .ft ! 705: .NH ! 706: Notation ! 707: .PP ! 708: In the following pages syntactic categories are in \fIitalics\fP; ! 709: literals are in \fBbold\fP; material in brackets [\|] is optional. ! 710: .NH ! 711: Tokens ! 712: .PP ! 713: Tokens consist of keywords, identifiers, constants, operators, ! 714: and separators. ! 715: Token separators may be blanks, tabs or comments. ! 716: Newline characters or semicolons separate statements. ! 717: .NH 2 ! 718: Comments ! 719: .PP ! 720: Comments are introduced by the characters /* and terminated by ! 721: */. ! 722: .NH 2 ! 723: Identifiers ! 724: .PP ! 725: There are three kinds of identifiers \- ordinary identifiers, array identifiers ! 726: and function identifiers. ! 727: All three types consist of single lower-case letters. ! 728: Array identifiers are followed by square brackets, possibly ! 729: enclosing an expression describing a subscript. ! 730: Arrays are singly dimensioned and may contain up to 2048 ! 731: elements. ! 732: Indexing begins at zero so an array may be indexed from 0 to 2047. ! 733: Subscripts are truncated to integers. ! 734: Function identifiers are followed by parentheses, possibly enclosing arguments. ! 735: The three types of identifiers do not conflict; ! 736: a program can have a variable named \fBx\fP, ! 737: an array named \fBx\fP and a function named \fBx\fP, all of which are separate and ! 738: distinct. ! 739: .NH 2 ! 740: Keywords ! 741: .PP ! 742: The following are reserved keywords: ! 743: .ft B ! 744: .ta .5i 1.0i ! 745: .nf ! 746: ibase if ! 747: obase break ! 748: scale define ! 749: sqrt auto ! 750: length return ! 751: while quit ! 752: for ! 753: .fi ! 754: .ft ! 755: .NH 2 ! 756: Constants ! 757: .PP ! 758: Constants consist of arbitrarily long numbers ! 759: with an optional decimal point. ! 760: The hexadecimal digits \fBA\fP\-\fBF\fP are also recognized as digits with ! 761: values 10\-15, respectively. ! 762: .NH 1 ! 763: Expressions ! 764: .PP ! 765: The value of an expression is printed unless the main ! 766: operator is an assignment. ! 767: Precedence is the same as the order ! 768: of presentation here, with highest appearing first. ! 769: Left or right associativity, where applicable, is ! 770: discussed with each operator. ! 771: .bp ! 772: .NH 2 ! 773: Primitive expressions ! 774: .NH 3 ! 775: Named expressions ! 776: .PP ! 777: Named expressions are ! 778: places where values are stored. ! 779: Simply stated, ! 780: named expressions are legal on the left ! 781: side of an assignment. ! 782: The value of a named expression is the value stored in the place named. ! 783: .NH 4 ! 784: \fIidentifiers\fR ! 785: .PP ! 786: Simple identifiers are named expressions. ! 787: They have an initial value of zero. ! 788: .NH 4 ! 789: \fIarray-name\fP\|[\|\fIexpression\fP\|] ! 790: .PP ! 791: Array elements are named expressions. ! 792: They have an initial value of zero. ! 793: .NH 4 ! 794: \fBscale\fR, \fBibase\fR and \fBobase\fR ! 795: .PP ! 796: The internal registers ! 797: \fBscale\fP, \fBibase\fP and \fBobase\fP are all named expressions. ! 798: \fBscale\fP is the number of digits after the decimal point to be ! 799: retained in arithmetic operations. ! 800: \fBscale\fR has an initial value of zero. ! 801: \fBibase\fP and \fBobase\fP are the input and output number ! 802: radix respectively. ! 803: Both \fBibase\fR and \fBobase\fR have initial values of 10. ! 804: .NH 3 ! 805: Function calls ! 806: .NH 4 ! 807: \fIfunction-name\fB\|(\fR[\fIexpression\fR\|[\fB,\|\fIexpression\|\fR.\|.\|.\|]\|]\fB) ! 808: .PP ! 809: A function call consists of a function name followed by parentheses ! 810: containing a comma-separated list of ! 811: expressions, which are the function arguments. ! 812: A whole array passed as an argument is specified by the ! 813: array name followed by empty square brackets. ! 814: All function arguments are passed by ! 815: value. ! 816: As a result, changes made to the formal parameters have ! 817: no effect on the actual arguments. ! 818: If the function terminates by executing a return ! 819: statement, the value of the function is ! 820: the value of the expression in the parentheses of the return ! 821: statement or is zero if no expression is provided ! 822: or if there is no return statement. ! 823: .NH 4 ! 824: sqrt\|(\|\fIexpression\fP\|) ! 825: .PP ! 826: The result is the square root of the expression. ! 827: The result is truncated in the least significant decimal place. ! 828: The scale of the result is ! 829: the scale of the expression or the ! 830: value of ! 831: .ft B ! 832: scale, ! 833: .ft ! 834: whichever is larger. ! 835: .NH 4 ! 836: length\|(\|\fIexpression\fP\|) ! 837: .PP ! 838: The result is the total number of significant decimal digits in the expression. ! 839: The scale of the result is zero. ! 840: .NH 4 ! 841: scale\|(\|\fIexpression\fP\|) ! 842: .PP ! 843: The result is the scale of the expression. ! 844: The scale of the result is zero. ! 845: .NH 3 ! 846: Constants ! 847: .PP ! 848: Constants are primitive expressions. ! 849: .NH 3 ! 850: Parentheses ! 851: .PP ! 852: An expression surrounded by parentheses is ! 853: a primitive expression. ! 854: The parentheses are used to alter the ! 855: normal precedence. ! 856: .NH 2 ! 857: Unary operators ! 858: .PP ! 859: The unary operators ! 860: bind right to left. ! 861: .NH 3 ! 862: \-\|\fIexpression\fP ! 863: .PP ! 864: The result is the negative of the expression. ! 865: .NH 3 ! 866: ++\|\fInamed-expression\fP ! 867: .PP ! 868: The named expression is ! 869: incremented by one. ! 870: The result is the value of the named expression after ! 871: incrementing. ! 872: .NH 3 ! 873: \-\-\|\fInamed-expression\fP ! 874: .PP ! 875: The named expression is ! 876: decremented by one. ! 877: The result is the value of the named expression after ! 878: decrementing. ! 879: .NH 3 ! 880: \fInamed-expression\fP\|++ ! 881: .PP ! 882: The named expression is ! 883: incremented by one. ! 884: The result is the value of the named expression before ! 885: incrementing. ! 886: .NH 3 ! 887: \fInamed-expression\fP\|\-\- ! 888: .PP ! 889: The named expression is ! 890: decremented by one. ! 891: The result is the value of the named expression before ! 892: decrementing. ! 893: .NH 2 ! 894: Exponentiation operator ! 895: .PP ! 896: The exponentiation operator binds right to left. ! 897: .NH 3 ! 898: \fIexpression\fP ^ \fIexpression\fP ! 899: .PP ! 900: The result is the first ! 901: expression raised to the power of the ! 902: second expression. ! 903: The second expression must be an integer. ! 904: If \fIa\fP ! 905: is the scale of the left expression ! 906: and \fIb\fP is the absolute value ! 907: of the right expression, ! 908: then the scale of the result is: ! 909: .PP ! 910: min\|(\|\fIa\(mub\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP\|)\|) ! 911: .NH 2 ! 912: Multiplicative operators ! 913: .PP ! 914: The operators *, /, % bind left to right. ! 915: .NH 3 ! 916: \fIexpression\fP * \fIexpression\fP ! 917: .PP ! 918: The result is the product ! 919: of the two expressions. ! 920: If \fIa\fP and \fIb\fP are the ! 921: scales of the two expressions, ! 922: then the scale of the result is: ! 923: .PP ! 924: min\|(\|\fIa+b\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP,\|\fIb\fP\|)\|) ! 925: .NH 3 ! 926: \fIexpression\fP / \fIexpression\fP ! 927: .PP ! 928: The result is the quotient of the two expressions. ! 929: The scale of the result is the value of \fBscale\fR. ! 930: .NH 3 ! 931: \fIexpression\fP % \fIexpression\fP ! 932: .PP ! 933: The % operator produces the remainder of the division ! 934: of the two expressions. ! 935: More precisely, ! 936: \fIa\fP%\fIb\fP is \fIa\fP\-\fIa\fP/\fIb\fP*\fIb\fP. ! 937: .PP ! 938: The scale of the result is the sum of the scale of ! 939: the divisor and the value of ! 940: .ft B ! 941: scale ! 942: .ft ! 943: .NH 2 ! 944: Additive operators ! 945: .PP ! 946: The additive operators bind left to right. ! 947: .NH 3 ! 948: \fIexpression\fP + \fIexpression\fP ! 949: .PP ! 950: The result is the sum of the two expressions. ! 951: The scale of the result is ! 952: the maximun of the scales of the expressions. ! 953: .NH 3 ! 954: \fIexpression\fP \- \fIexpression\fP ! 955: .PP ! 956: The result is the difference of the two expressions. ! 957: The scale of the result is the ! 958: maximum of the scales of the expressions. ! 959: .NH 2 ! 960: assignment operators ! 961: .PP ! 962: The assignment operators bind right to left. ! 963: .NH 3 ! 964: \fInamed-expression\fP = \fIexpression\fP ! 965: .PP ! 966: This expression results in assigning the value of the expression ! 967: on the right ! 968: to the named expression on the left. ! 969: .NH 3 ! 970: \fInamed-expression\fP =+ \fIexpression\fP ! 971: .NH 3 ! 972: \fInamed-expression\fP =\- \fIexpression\fP ! 973: .NH 3 ! 974: \fInamed-expression\fP =* \fIexpression\fP ! 975: .NH 3 ! 976: \fInamed-expression\fP =/ \fIexpression\fP ! 977: .NH 3 ! 978: \fInamed-expression\fP =% \fIexpression\fP ! 979: .NH 3 ! 980: \fInamed-expression\fP =^ \fIexpression\fP ! 981: .PP ! 982: The result of the above expressions is equivalent ! 983: to ``named expression = named expression OP expression'', ! 984: where OP is the operator after the = sign. ! 985: .NH 1 ! 986: Relations ! 987: .PP ! 988: Unlike all other operators, the relational operators ! 989: are only valid as the object of an \fBif\fP, \fBwhile\fP, ! 990: or inside a \fBfor\fP statement. ! 991: .NH 2 ! 992: \fIexpression\fP < \fIexpression\fP ! 993: .NH 2 ! 994: \fIexpression\fP > \fIexpression\fP ! 995: .NH 2 ! 996: \fIexpression\fP <= \fIexpression\fP ! 997: .NH 2 ! 998: \fIexpression\fP >= \fIexpression\fP ! 999: .NH 2 ! 1000: \fIexpression\fP == \fIexpression\fP ! 1001: .NH 2 ! 1002: \fIexpression\fP != \fIexpression\fP ! 1003: .NH 1 ! 1004: Storage classes ! 1005: .PP ! 1006: There are only two storage classes in BC, global and automatic ! 1007: (local). ! 1008: Only identifiers that are to be local to a function need be ! 1009: declared with the \fBauto\fP command. ! 1010: The arguments to a function ! 1011: are local to the function. ! 1012: All other identifiers are assumed to be global ! 1013: and available to all functions. ! 1014: All identifiers, global and local, have initial values ! 1015: of zero. ! 1016: Identifiers declared as \fBauto\fP are allocated on entry to the function ! 1017: and released on returning from the function. ! 1018: They therefore do not retain values between function calls. ! 1019: \fBauto\fP arrays are specified by the array name followed by empty square brackets. ! 1020: .PP ! 1021: Automatic variables in BC do not work in exactly the same way ! 1022: as in either C or PL/I. On entry to a function, the old values of ! 1023: the names that appear as parameters and as automatic ! 1024: variables are pushed onto a stack. ! 1025: Until return is made from the function, reference to these ! 1026: names refers only to the new values. ! 1027: .NH 1 ! 1028: Statements ! 1029: .PP ! 1030: Statements must be separated by semicolon or newline. ! 1031: Except where altered by control statements, execution ! 1032: is sequential. ! 1033: .NH 2 ! 1034: Expression statements ! 1035: .PP ! 1036: When a statement is an expression, unless ! 1037: the main operator is an assignment, the value ! 1038: of the expression is printed, followed by a newline character. ! 1039: .NH 2 ! 1040: Compound statements ! 1041: .PP ! 1042: Statements may be grouped together and used when one statement is expected ! 1043: by surrounding them with { }. ! 1044: .NH 2 ! 1045: Quoted string statements ! 1046: .PP ! 1047: "any string" ! 1048: .sp .5 ! 1049: This statement prints the string inside the quotes. ! 1050: .NH 2 ! 1051: If statements ! 1052: .sp .5 ! 1053: \fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fR ! 1054: .PP ! 1055: The substatement is executed if the relation is true. ! 1056: .NH 2 ! 1057: While statements ! 1058: .sp .5 ! 1059: \fBwhile\|(\|\fIrelation\fB\|)\|\fIstatement\fR ! 1060: .PP ! 1061: The statement is executed while the relation ! 1062: is true. ! 1063: The test occurs before each execution of the statement. ! 1064: .NH 2 ! 1065: For statements ! 1066: .sp .5 ! 1067: \fBfor\|(\|\fIexpression\fB; \fIrelation\fB; \fIexpression\fB\|)\|\fIstatement\fR ! 1068: .PP ! 1069: The for statement is the same as ! 1070: .nf ! 1071: .ft I ! 1072: first-expression ! 1073: \fBwhile\|(\fPrelation\|\fB) {\fP ! 1074: statement ! 1075: last-expression ! 1076: } ! 1077: .ft R ! 1078: .fi ! 1079: .PP ! 1080: All three expressions must be present. ! 1081: .NH 2 ! 1082: Break statements ! 1083: .sp .5 ! 1084: \fBbreak\fP ! 1085: .PP ! 1086: \fBbreak\fP causes termination of a \fBfor\fP or \fBwhile\fP statement. ! 1087: .NH 2 ! 1088: Auto statements ! 1089: .sp .5 ! 1090: \fBauto \fIidentifier\fR\|[\|\fB,\fIidentifier\fR\|] ! 1091: .PP ! 1092: The auto statement causes the values of the identifiers to be pushed down. ! 1093: The identifiers can be ordinary identifiers or array identifiers. ! 1094: Array identifiers are specified by following the array name by empty square ! 1095: brackets. ! 1096: The auto statement must be the first statement ! 1097: in a function definition. ! 1098: .NH 2 ! 1099: Define statements ! 1100: .sp .5 ! 1101: .nf ! 1102: \fBdefine(\|\fR[\fIparameter\|\fR[\fB\|,\|\fIparameter\|.\|.\|.\|\fR]\|]\|\fB)\|{\fI ! 1103: statements\|\fB}\fR ! 1104: .fi ! 1105: .PP ! 1106: The define statement defines a function. ! 1107: The parameters may ! 1108: be ordinary identifiers or array names. ! 1109: Array names must be followed by empty square brackets. ! 1110: .NH 2 ! 1111: Return statements ! 1112: .sp .5 ! 1113: \fBreturn\fP ! 1114: .sp .5 ! 1115: \fBreturn(\fI\|expression\|\fB)\fR ! 1116: .PP ! 1117: The return statement causes termination of a function, ! 1118: popping of its auto variables, and ! 1119: specifies the result of the function. ! 1120: The first form is equivalent to \fBreturn(0)\fR. ! 1121: The result of the function is the result of the expression ! 1122: in parentheses. ! 1123: .NH 2 ! 1124: Quit ! 1125: .PP ! 1126: The quit statement stops execution of a BC program and returns ! 1127: control to UNIX when it is first encountered. ! 1128: Because it is not treated as an executable statement, ! 1129: it cannot be used ! 1130: in a function definition or in an ! 1131: .ft B ! 1132: if, for, ! 1133: .ft ! 1134: or ! 1135: .ft B ! 1136: while ! 1137: .ft ! 1138: statement.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.