Annotation of 43BSD/ingres/doc/quel/macros.nr, revision 1.1

1.1     ! root        1: .th MACROS QUEL 2/19/79
        !             2: .sh NAME
        !             3: macros \- terminal monitor macro facility
        !             4: .sh DESCRIPTION
        !             5: The terminal monitor macro facility
        !             6: provides the ability
        !             7: to tailor the QUEL language
        !             8: to the user's tastes.
        !             9: The macro facility
        !            10: allows strings of text
        !            11: to be removed from the query stream
        !            12: and replaced with other text.
        !            13: Also,
        !            14: some built in macros
        !            15: change the environment
        !            16: upon execution.
        !            17: .s1
        !            18: .bd "Basic Concepts"
        !            19: .s2
        !            20: All macros are composed of two parts,
        !            21: the
        !            22: .it template
        !            23: part and the
        !            24: .it replacement
        !            25: part.
        !            26: The template part defines when the macro
        !            27: should be invoked.
        !            28: For example,
        !            29: the template
        !            30: ``ret''
        !            31: causes the corresponding macro
        !            32: to be invoked upon encountering
        !            33: the word
        !            34: ``ret''
        !            35: in the input stream.
        !            36: When a macro is encountered,
        !            37: the template part is removed
        !            38: and replaced with the replacement part.
        !            39: For example,
        !            40: if the replacement part of the
        !            41: ``ret'' macro
        !            42: was ``retrieve'',
        !            43: then all instances of the word
        !            44: ``ret'' in the input text
        !            45: would be replaced with the word
        !            46: ``retrieve'',
        !            47: as in the statement
        !            48: .s3
        !            49:        ret (p.all)
        !            50: .s3
        !            51: Macros may have parameters,
        !            52: indicated by a dollar sign.
        !            53: For example,
        !            54: the template
        !            55: ``get $1''
        !            56: causes the macro to be triggered by the word
        !            57: ``get''
        !            58: followed by any other word.
        !            59: The word following ``get''
        !            60: is remembered
        !            61: for later use.
        !            62: For example,
        !            63: if the replacement part
        !            64: of the ``get'' macro
        !            65: where
        !            66: .s3
        !            67:        retrieve (p.all) where p.pnum = $1
        !            68: .s3
        !            69: then typing ``get 35''
        !            70: would retrieve all information about part number 35.
        !            71: .s1
        !            72: .bd "Defining Macros"
        !            73: .s2
        !            74: Macros can be defined
        !            75: using the special macro called
        !            76: ``define''.
        !            77: The template for the define macro
        !            78: is (roughly)
        !            79: .s3
        !            80:        {define; $t; $r}
        !            81: .s3
        !            82: where $t and $r are the template and replacement
        !            83: parts of the macro, respectively.
        !            84: .s3
        !            85: Let's look at a few examples.
        !            86: To define the ``ret'' macro
        !            87: discussed above,
        !            88: we would type:
        !            89: .s3
        !            90:        {define; ret; retrieve}
        !            91: .s3
        !            92: When this is read,
        !            93: the macro processor
        !            94: removes everything between the curly braces
        !            95: and updates some tables
        !            96: so that ``ret'' will be recognized
        !            97: and replaced with the word ``retrieve''.
        !            98: The define macro has the null string
        !            99: as replacement text,
        !           100: so that this macro seems to disappear.
        !           101: .s3
        !           102: A useful macro
        !           103: is one which shortens range statements.
        !           104: It can be defined
        !           105: with
        !           106: .s3
        !           107:        {define; rg $v $r; range of $v is $r}
        !           108: .s3
        !           109: This macro causes the word ``rg'' followed by the
        !           110: next two words
        !           111: to be removed and replaced
        !           112: by the words
        !           113: ``range of'',
        !           114: followed by the first word which followed ``rg'',
        !           115: followed by the word ``is'',
        !           116: followed by the second word
        !           117: which followed ``rg''.
        !           118: For example,
        !           119: the input
        !           120: .s3
        !           121:        rg p parts
        !           122: .s3
        !           123: becomes the same as
        !           124: .s3
        !           125:        range of p is parts
        !           126: .s3
        !           127: .s1
        !           128: .bd "Evaluation Times"
        !           129: .s2
        !           130: When you type in a define statement,
        !           131: it is not processed immediately,
        !           132: just as queries are saved
        !           133: rather than executed.
        !           134: No macro processing is done
        !           135: until the query buffer
        !           136: is evaluated.
        !           137: The commands
        !           138: \ego,
        !           139: \elist,
        !           140: and \eeval
        !           141: evaluate the query buffer.
        !           142: \ego sends the results
        !           143: to \*(II,
        !           144: \elist prints them on your terminal,
        !           145: and \eeval
        !           146: puts the result back into the query buffer.
        !           147: .s3
        !           148: It is important to evaluate any define statements,
        !           149: or it will be exactly like you did not type them in
        !           150: at all.
        !           151: A common way to define macros is to type
        !           152: .s3
        !           153:        {define . . . }
        !           154: .br
        !           155:        \eeval
        !           156: .br
        !           157:        \ereset
        !           158: .s3
        !           159: If the \eeval was left out,
        !           160: there is no effect at all.
        !           161: .s1
        !           162: .bd "Quoting"
        !           163: .s2
        !           164: Sometimes strings must be passed
        !           165: through the macro processor
        !           166: without being processed.
        !           167: In such cases the grave and acute accent marks
        !           168: (\*g and \*a)
        !           169: can be used to surround the literal text.
        !           170: For example,
        !           171: to pass the word ``ret''
        !           172: through without converting it to ``retrieve''
        !           173: we could type
        !           174: .s3
        !           175:        \*gret\*a
        !           176: .s3
        !           177: Another use for quoting is during parameter collection.
        !           178: If we want to enter more than one word
        !           179: where only one was expected,
        !           180: we can surround the parameter with accents.
        !           181: .s3
        !           182: The backslash character
        !           183: quotes only the next character
        !           184: (like surrounding the character with accents).
        !           185: In particular,
        !           186: a grave accent can be used literally
        !           187: by preceeding it
        !           188: with a backslash.
        !           189: .s3
        !           190: Since macros can normally only be on one line,
        !           191: it is frequently useful to use a backslash
        !           192: at the end of the line
        !           193: to hide the newline.
        !           194: For example,
        !           195: to enter the long ``get'' macro,
        !           196: you might type:
        !           197: .nf
        !           198:        {define; get $n; retrieve (e.all) \e
        !           199:        where e.name = "$n"}
        !           200: .fi
        !           201: .s3
        !           202: The backslash always quotes
        !           203: the next character
        !           204: even when it is a backslash.
        !           205: So, to get a real backslash,
        !           206: use two backslashes.
        !           207: .s1
        !           208: .bd "More Parameters"
        !           209: .s2
        !           210: Parameters need not be limited
        !           211: to the word following.
        !           212: For example,
        !           213: in the template descriptor
        !           214: for define:
        !           215: .s3
        !           216:        {define; $t; $r}
        !           217: .s3
        !           218: the $t parameter ends at the first semicolon
        !           219: and the $r parameters ends at the first
        !           220: right curly brace.
        !           221: The rule is that the character
        !           222: which follows the parameter
        !           223: specifier
        !           224: terminates the parameter;
        !           225: if this character is a space,
        !           226: tab,
        !           227: newline,
        !           228: or the end of the template
        !           229: then one word is collected.
        !           230: .s3
        !           231: As with all good rules,
        !           232: this one has an exception.
        !           233: Since system macros are always surrounded by curly braces,
        !           234: the macro processor knows that they must be properly nested.
        !           235: Thus, in the statement
        !           236: .s3
        !           237:        {define; x; {sysfn}}
        !           238: .s3
        !           239: The first right curly brace will close the ``sysfn''
        !           240: rather than the ``define''.
        !           241: Otherwise this would have to be typed
        !           242: .s3
        !           243:        {define; x; \*g{sysfn}\*a}
        !           244: .s3
        !           245: .s3
        !           246: Words are defined in the usual way,
        !           247: as strings of letters and digits
        !           248: plus the underscore character.
        !           249: .s1
        !           250: .bd "Other Builtin Macros"
        !           251: .s2
        !           252: There are several other macros
        !           253: built in to the macro processor.
        !           254: In the following description,
        !           255: some of the parameter specifiers are marked
        !           256: with two dollar signs rather than one;
        !           257: this will be discussed in the section on prescanning below.
        !           258: .s3
        !           259: {define; $$t; $$r}
        !           260: defines a macro as discussed above.
        !           261: Special processing occurs on the template part
        !           262: which will be discussed in a later section.
        !           263: .s3
        !           264: {rawdefine; $$t; $$r}
        !           265: is another form of define,
        !           266: where the special processing does not take place.
        !           267: .s3
        !           268: {remove; $$n}
        !           269: removes the macro
        !           270: with name $n.
        !           271: It can remove more than one macro,
        !           272: since it actually removes all macros
        !           273: which might conflict
        !           274: with $n
        !           275: under some circumstance.
        !           276: For example,
        !           277: typing
        !           278: .s3
        !           279:        {define; get part $n; . . . }
        !           280: .br
        !           281:        {define; get emp $x; . . . }
        !           282: .br
        !           283:        {remove; get}
        !           284: .s3
        !           285: would cause both the get macros to be removed.
        !           286: A call to
        !           287: .s3
        !           288:        {remove; get part}
        !           289: .s3
        !           290: would have only removed
        !           291: the first macro.
        !           292: .s3
        !           293: {type $$s}
        !           294: types $s onto the terminal.
        !           295: .s3
        !           296: {read $$s}
        !           297: types $s and then reads a line
        !           298: from the terminal.
        !           299: The line which was typed
        !           300: replaces the macro.
        !           301: A macro called ``{readcount}''
        !           302: is defined
        !           303: containing the number of characters read.
        !           304: A control-D
        !           305: (end of file)
        !           306: becomes \*-1,
        !           307: a single newline becomes zero,
        !           308: and so forth.
        !           309: .s3
        !           310: {readdefine; $$n; $$s}
        !           311: also types $s and reads a line,
        !           312: but puts the line
        !           313: into a macro named $n.
        !           314: The replacement text
        !           315: is the count of the number
        !           316: of characters
        !           317: in the line.
        !           318: {readcount} is still defined.
        !           319: .s3
        !           320: {ifsame; $$a; $$b; $t; $f}
        !           321: compares the strings $a and $b.
        !           322: If they match exactly
        !           323: then the replacement text
        !           324: becomes $t,
        !           325: otherwise it becomes $f.
        !           326: .s3
        !           327: {ifeq; $$a; $$b; $t; $f}
        !           328: is similar,
        !           329: but the comparison is numeric.
        !           330: .s3
        !           331: {ifgt; $$a; $$b; $t; $f}
        !           332: is like ifeq,
        !           333: but the test is for $a
        !           334: strictly greater than $b.
        !           335: .s3
        !           336: {substr; $$f; $$t; $$s}
        !           337: returns the part of $s
        !           338: between character positions $f and $t,
        !           339: numbered from one.
        !           340: If $f or $t are out of range,
        !           341: they are moved in range as much as possible.
        !           342: .s3
        !           343: {dump; $$n}
        !           344: returns the value of the macro
        !           345: (or macros)
        !           346: which match $n
        !           347: (using the same algorithm as remove).
        !           348: The output is a rawdefine
        !           349: statement
        !           350: so that it can be read back in.
        !           351: {dump} without arguments
        !           352: dumps all macros.
        !           353: .s1
        !           354: .bd "Metacharacters"
        !           355: .s2
        !           356: Certain characters
        !           357: are used internally.
        !           358: Normally you will not even see them,
        !           359: but they can appear in the output of a dump command,
        !           360: and can sometimes be used
        !           361: to create very fancy macros.
        !           362: .s3
        !           363: \e\*|\*v matches any number of spaces,
        !           364: tabs,
        !           365: or newlines.
        !           366: It will even match zero,
        !           367: but only between words,
        !           368: as can occur with punctuation.
        !           369: For example,
        !           370: \e\*|\*v will match the spot
        !           371: between the last character of a word
        !           372: and a comma following it.
        !           373: .s3
        !           374: \e^ matches exactly one space, tab, or newline.
        !           375: .s3
        !           376: \e& matches exactly zero spaces, tabs, or newlines,
        !           377: but only between words.
        !           378: .s1
        !           379: .bd "The Define Process"
        !           380: .s2
        !           381: When you define a macro
        !           382: using 
        !           383: define,
        !           384: a lot of special processing happens.
        !           385: This processing is such that 
        !           386: define
        !           387: is not functionally complete,
        !           388: but still adequate for most requirements.
        !           389: If more power is needed,
        !           390: rawdefine can be used;
        !           391: however,
        !           392: rawdefine is particularly difficult to use correctly,
        !           393: and should only be used by gurus.
        !           394: .s3
        !           395: In define,
        !           396: all sequences of spaces, tabs, and newlines
        !           397: in the template,
        !           398: as well as all ``non-spaces''
        !           399: between words,
        !           400: are turned into a single
        !           401: \e\*|\*v character.
        !           402: If the template ends with a parameter,
        !           403: the \e& character is added at the end.
        !           404: .s3
        !           405: If you want to match a real tab or newline,
        !           406: you can use \et or \en respectively.
        !           407: For example,
        !           408: a macro which reads an entire line
        !           409: and uses it as the name of an employee
        !           410: would be defined with
        !           411: .s3
        !           412:        {define; get $n\en; \e
        !           413: .br
        !           414:            ret (e.all) where e.name = "$n"}
        !           415: .s3
        !           416: This macro might be used by typing
        !           417: .s3
        !           418:        get *Stan*
        !           419: .s3
        !           420: to get all information about everyone
        !           421: with a name which included ``Stan''.
        !           422: By the way,
        !           423: notice that it is ok to nest the ``ret''
        !           424: macro inside the ``get'' macro.
        !           425: .s1
        !           426: .bd "Parameter Prescan"
        !           427: .s2
        !           428: Sometimes it is useful to macro process a parameter
        !           429: before using it in the replacement part.
        !           430: This is particularly important
        !           431: when using certain builtin macros.
        !           432: .s3
        !           433: For prescan to occur,
        !           434: two things must be true:
        !           435: first,
        !           436: the parameter must be specified in the template
        !           437: with two dollar signs instead of one,
        !           438: and second,
        !           439: the actual parameter must begin with an ``at'' sign
        !           440: (``@'')
        !           441: (which is stripped off).
        !           442: .s3
        !           443: For an example of the use of prescan,
        !           444: see ``Special Macros'' below.
        !           445: .s1
        !           446: .bd "Special Macros"
        !           447: .s2
        !           448: Some special macros are used by the terminal monitor
        !           449: to control the environment and return results
        !           450: to the user.
        !           451: .s3
        !           452: {begintrap}
        !           453: is executed at the beginning of a query.
        !           454: .s3
        !           455: {endtrap}
        !           456: is executed after the body of a query
        !           457: is passed to \*(II.
        !           458: .s3
        !           459: {continuetrap}
        !           460: is executed after the query completes.
        !           461: The difference between this and endtrap
        !           462: is that endtrap occurs after the query is submitted,
        !           463: but before the query executes,
        !           464: whereas continuetrap is executed after the query executes.
        !           465: .s3
        !           466: {editor}
        !           467: can be defined
        !           468: to be the pathname of an editor to use
        !           469: in the \eedit command.
        !           470: .s3
        !           471: {shell}
        !           472: can be defined to be the pathname
        !           473: of a shell to use in the \eshell command.
        !           474: .s3
        !           475: {tuplecount}
        !           476: is set after every query
        !           477: (but before continuetrap is sprung)
        !           478: to be the count of the number of tuples which satisfied
        !           479: the qualification of the query
        !           480: in a retrieve,
        !           481: or the number of tuples changed in an update.
        !           482: It is not set for DBU functions.
        !           483: If multiple queries are run at once,
        !           484: it is set to the number of tuples which satisfied the
        !           485: last query run.
        !           486: .s3
        !           487: For example,
        !           488: to print out the number of tuples touched
        !           489: automatically after each query,
        !           490: you could enter:
        !           491: .nf
        !           492:        {define; {begintrap}; {remove; {tuplecount}}}
        !           493:        {define; {continuetrap}; \e
        !           494:           {ifsame; @{tuplecount}; {tuplecount};; \e
        !           495:             {type @{tuplecount} tuples touched}}}
        !           496: .fi
        !           497: .sh "SEE ALSO"
        !           498: monitor(quel)

unix.superglobalmegacorp.com

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