Annotation of 43BSDTahoe/ucb/lisp/doc/ch7.n, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1980 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)ch7.n       6.2 (Berkeley) 5/14/86
                      6: .\"
                      7: ." $Header: ch7.n,v 1.3 83/07/01 11:22:58 layer Exp $
                      8: .Lc The\ Lisp\ Reader 7
                      9: .sh 2 Introduction \n(ch 1
                     10: .pp
                     11: The 
                     12: .i read
                     13: function is responsible for converting
                     14: a stream of 
                     15: characters into a Lisp expression.
                     16: .i Read 
                     17: is table driven and the table it uses is called a 
                     18: .i readtable.
                     19: The 
                     20: .i print
                     21: function does the
                     22: inverse of 
                     23: .i read ;
                     24: it converts a Lisp expression into a stream of 
                     25: characters.
                     26: Typically the conversion is done in such
                     27: a way that if that stream of characters were read by 
                     28: .i read ,
                     29: the 
                     30: result would be an expression equal to the one
                     31: .i print
                     32: was given.
                     33: .i Print
                     34: must also refer to the readtable in order to determine
                     35: how to format its output.
                     36: The 
                     37: .i explode
                     38: function, which returns a list of characters rather than
                     39: printing them,  must also refer to the readtable.
                     40: .pp
                     41: A readtable is created
                     42: with the
                     43: .i makereadtable 
                     44: function, modified with the
                     45: .i setsyntax
                     46: function and interrogated with the
                     47: .i getsyntax 
                     48: function.
                     49: The structure of a readtable is hidden from the user  - a
                     50: readtable should
                     51: only be manipulated with the three functions mentioned above.
                     52: .pp
                     53: There is one distinguished readtable called the 
                     54: .i current
                     55: .i readtable 
                     56: whose value determines what
                     57: .i read ,
                     58: .i print 
                     59: and 
                     60: .i explode 
                     61: do.
                     62: The current readtable is the value of the symbol 
                     63: .i readtable .
                     64: Thus it is  possible to rapidly change 
                     65: the current syntax by lambda binding 
                     66: a different readtable to the symbol 
                     67: .i readtable.
                     68: When the binding is undone, the syntax reverts to its old form.
                     69: .sh +0 Syntax\ Classes
                     70: .pp
                     71: The readtable describes how each of the 128 ascii characters should
                     72: be treated by the reader and printer.
                     73: Each character belongs to a 
                     74: .i syntax 
                     75: .i class 
                     76: which has three properties:
                     77: .ip character\ class\ - 
                     78: Tells what the reader should do when it sees this character.
                     79: There are a large number of character classes.  
                     80: They are described below.
                     81: .ip separator\ -
                     82: Most types of tokens the reader constructs are one character
                     83: long.
                     84: Four token types have an arbitrary length: number (1234), 
                     85: symbol print name (franz),
                     86: escaped symbol print name (|franz|), and string ("franz").
                     87: The reader can easily determine when it has
                     88: come to the
                     89: end of one of the last two types: it just looks for the
                     90: matching delimiter (| or ").
                     91: When the reader is reading a number or symbol print name, it 
                     92: stops reading when it comes to a character with the 
                     93: .i separator
                     94: property.
                     95: The separator character is pushed back into the input stream and will
                     96: be the first character read when the reader is called again.
                     97: .ip escape\ -
                     98: Tells the printer when to put escapes in front of, or around, a symbol
                     99: whose print name contains this character.
                    100: There are three possibilities: always escape a symbol with this character
                    101: in it, only escape a symbol if this is the only character in the symbol,
                    102: and only escape a symbol if this is the first character in the symbol.
                    103: [note: The printer will always escape a symbol which, if printed out, would
                    104: look like a valid number.]
                    105: .pp
                    106: When the Lisp system is built, Lisp code is added to a C-coded kernel
                    107: and the result becomes the standard lisp system.
                    108: The readtable present in the C-coded kernel, called the
                    109: .i raw
                    110: .i readtable ,
                    111: contains the bare necessities for reading in Lisp code.
                    112: During the 
                    113: construction of the complete Lisp system,
                    114: a copy is made of the raw readtable and 
                    115: then the copy  is modified by adding macro characters.
                    116: The result is what is called the
                    117: .i standard
                    118: .i readtable .
                    119: When a new readtable is created with 
                    120: .i makereadtable,
                    121: a copy is made of either the
                    122: raw readtable
                    123: or the current readtable (which is likely to be the standard readtable).
                    124: .sh +0 Reader\ Operations
                    125: .pp
                    126: The reader has a very simple algorithm.
                    127: It is either 
                    128: .i scanning 
                    129: for a token, 
                    130: .i collecting 
                    131: a token,
                    132: or 
                    133: .i processing 
                    134: a token.
                    135: Scanning involves reading characters and throwing
                    136: away those which don't start tokens (such as blanks and tabs).
                    137: Collecting means gathering the characters which make up a
                    138: token into a buffer.
                    139: Processing may involve creating symbols, strings, lists, 
                    140: fixnums, bignums or flonums or calling a user written function called 
                    141: a character macro.
                    142: .pp
                    143: The components of the syntax class determine when the reader
                    144: switches between the scanning, collecting and processing states.
                    145: The reader will continue scanning as long as the character class
                    146: of the characters it reads is 
                    147: .i cseparator.
                    148: When it reads a character whose character class is not 
                    149: .i cseparator
                    150: it stores that character in its buffer and begins the collecting phase.
                    151: .pp
                    152: If the character class of that first character is 
                    153: .i ccharacter ,
                    154: .i cnumber ,
                    155: .i cperiod ,
                    156: or 
                    157: .i csign .
                    158: then it will continue collecting until it runs into a character whose
                    159: syntax class has the 
                    160: .i separator
                    161: property.
                    162: (That last character will be pushed back into the input buffer and will
                    163: be the first character read next time.)
                    164: Now the reader goes into the processing phase, checking to see if the
                    165: token it read is a number or symbol.
                    166: It is important to note that  after
                    167: the first character is collected the component of the syntax class which 
                    168: tells the reader to  stop 
                    169: collecting is the 
                    170: .i separator
                    171: property, not the character class.
                    172: .pp
                    173: If the character class of the character which stopped the scanning is not 
                    174: .i ccharacter ,
                    175: .i cnumber ,
                    176: .i cperiod ,
                    177: or
                    178: .i csign .
                    179: then the reader processes that character immediately.
                    180: The character classes
                    181: .i csingle-macro ,
                    182: .i csingle-splicing-macro ,
                    183: and 
                    184: .i csingle-infix-macro
                    185: will act like 
                    186: .i ccharacter
                    187: if the following token is not a 
                    188: .i separator.
                    189: The processing which is done for a given character class 
                    190: is described in detail in the next section.
                    191: .sh +0 Character\ Classes
                    192: .de Cc
                    193: .sp 2v
                    194: .tl '\fI\\$1\fP''raw readtable:\\$2'
                    195: .tl '''standard readtable:\\$3'
                    196: ..
                    197: .pc
                    198: .Cc ccharacter A-Z\ a-z\ ^H\ !#$%&*,/:;<=>?@^_`{}~ A-Z\ a-z\ ^H\ !$%&*/:;<=>?@^_{}~
                    199: .pc %
                    200: A normal character.
                    201: .Cc cnumber 0-9 0-9
                    202: This type is a digit.  
                    203: The syntax for an integer (fixnum or bignum) is a string of 
                    204: .i cnumber
                    205: characters optionally followed by a 
                    206: .i cperiod.
                    207: If the digits are not followed by a
                    208: .i cperiod ,
                    209: then they are interpreted in base
                    210: .i ibase
                    211: which must be eight or ten.
                    212: The syntax for a floating point number is
                    213: either zero or more
                    214: .i cnumber 's
                    215: followed by a
                    216: .i cperiod
                    217: and then followed by one or more 
                    218: .i cnumber 's.
                    219: A floating point number
                    220: may also be  an integer or floating point number followed
                    221: by 'e' or 'd', an optional '+' or '\-'
                    222: and then zero or more 
                    223: .i cnumber 's.
                    224: .Cc csign +\- +\-
                    225: A leading sign for a number.  
                    226: No other characters should be given this class.
                    227: .Cc cleft-paren ( (
                    228: A left parenthesis.
                    229: Tells the reader to begin forming a list.
                    230: .Cc cright-paren ) )
                    231: A right parenthesis.
                    232: Tells the reader that it has reached the end of a list.
                    233: .Cc cleft-bracket [ [
                    234: A left bracket.
                    235: Tells the reader that it should begin forming a list.
                    236: See the description of 
                    237: .i cright-bracket
                    238: for the difference between cleft-bracket and cleft-paren.
                    239: .Cc cright-bracket ] ]
                    240: A right bracket.
                    241: A 
                    242: .i cright-bracket 
                    243: finishes the formation of the current
                    244: list and all enclosing lists until it finds one which
                    245: begins with a 
                    246: .i cleft-bracket 
                    247: or until it reaches the 
                    248: top level list.
                    249: .Cc cperiod . .
                    250: The period is used to separate element of a cons cell 
                    251: [e.g. (a\ .\ (b\ .\ nil)) is the same as (a\ b)].
                    252: .i cperiod
                    253: is also used in numbers as described above.
                    254: .Cc cseparator ^I-^M\ esc\ space ^I-^M\ esc\ space
                    255: Separates tokens.  When the reader is scanning, these character
                    256: are passed over.
                    257: Note: there is a difference between the
                    258: .i cseparator 
                    259: character class and the 
                    260: .i separator 
                    261: property of a syntax class.
                    262: .Cc csingle-quote \\' \\'
                    263: This causes 
                    264: .i read
                    265: to be called recursively and the list
                    266: (quote <value read>) to be returned.
                    267: .Cc csymbol-delimiter | |
                    268: This causes the reader to begin collecting characters and to stop only
                    269: when another identical
                    270: .i csymbol-delimiter
                    271: is seen.  
                    272: The only way to escape a 
                    273: .i csymbol-delimiter 
                    274: within a symbol name is with a
                    275: .i  cescape 
                    276: character.
                    277: The collected characters are converted into a string which becomes
                    278: the print name of a symbol.
                    279: If a symbol with an identical print name already exists, then the
                    280: allocation is not done, rather the existing symbol is used.
                    281: .Cc cescape \e \e
                    282: This causes the next character to read in to be treated as a 
                    283: .b vcharacter .
                    284: A character whose syntax class is
                    285: .b vcharacter 
                    286: has a character class
                    287: .i ccharacter
                    288: and does not have
                    289: the 
                    290: .i separator
                    291: property so it will not separate symbols.
                    292: .Cc cstring-delimiter """" """"
                    293: This is the same as 
                    294: .i csymbol-delimiter
                    295: except the result is returned as a string instead of a symbol.
                    296: .Cc csingle-character-symbol none none
                    297: This returns a symbol whose print name is the the single character
                    298: which has been collected.
                    299: .Cc cmacro none `,
                    300: The reader calls the macro function associated with this character and 
                    301: the current readtable, passing it no arguments.
                    302: The result of the macro is added to the structure the reader is building,
                    303: just as if that form were directly read by the reader.
                    304: More details on macros are provided below.
                    305: .Cc csplicing-macro none #;
                    306: A 
                    307: .i csplicing-macro 
                    308: differs from a 
                    309: .i cmacro
                    310: in the way the result is incorporated in the structure the reader is 
                    311: building.
                    312: A 
                    313: .i csplicing-macro
                    314: must return a list of forms (possibly empty).
                    315: The reader acts as
                    316: if it read each element of
                    317: the list itself without
                    318: the surrounding parenthesis.
                    319: .Cc csingle-macro none none
                    320: This causes to reader to check the next character.
                    321: If it is a 
                    322: .i cseparator
                    323: then this acts like a 
                    324: .i cmacro.
                    325: Otherwise, it acts like a 
                    326: .i ccharacter.
                    327: .Cc csingle-splicing-macro none none
                    328: This is triggered like a 
                    329: .i csingle-macro
                    330: however the result is spliced in like a
                    331: .i csplicing-macro.
                    332: .Cc cinfix-macro none none
                    333: This is differs from a 
                    334: .i cmacro
                    335: in that the macro function is passed a form representing what the reader
                    336: has read so far. 
                    337: The result of the macro replaces what the reader had read so far.
                    338: .Cc csingle-infix-macro none none
                    339: This differs from the
                    340: .i cinfix-macro
                    341: in that the macro will only be triggered if the character following the
                    342: .i csingle-infix-macro
                    343: character is a 
                    344: .i cseparator .
                    345: .Cc cillegal ^@-^G^N-^Z^\e-^_rubout ^@-^G^N-^Z^\e-^_rubout
                    346: The characters cause the reader to signal an error if read.
                    347: .sh +0 Syntax\ Classes
                    348: .pp
                    349: The readtable maps each character into a syntax class.
                    350: The syntax class contains three pieces of information: 
                    351: the character class, whether this is a separator, and the escape
                    352: properties.
                    353: The first two properties are used by the reader, the last by 
                    354: the printer (and 
                    355: .i explode ).
                    356: The initial lisp system has the following syntax classes defined.
                    357: The user may add syntax classes with
                    358: .i add-syntax-class .
                    359: For each syntax class, we list the properties of the class and 
                    360: which characters have this syntax class by default.
                    361: More information about each syntax class can be found under the
                    362: description of the syntax class's character class.
                    363: .de Sy
                    364: .sp 1v
                    365: .(b
                    366: .tl '\fB\\$1\fP''raw readtable:\\$2'
                    367: .tl '\fI\\$4\fP''standard readtable:\\$3'
                    368: .tl '\fI\\$5\fP'''
                    369: .if \n(.$>5 .tl '\fI\\$6\fP'''
                    370: .)b
                    371: ..
                    372: .pc
                    373: .Sy vcharacter A-Z\ a-z\ ^H\ !#$%&*,/:;<=>?@^_`{}~ A-Z\ a-z\ ^H\ !$%&*/:;<=>?@^_{}~  ccharacter
                    374: .pc %
                    375: .Sy vnumber 0-9 0-9 cnumber
                    376: .Sy vsign +- +- csign
                    377: .Sy vleft-paren ( ( cleft-paren escape-always separator
                    378: .Sy vright-paren ) ) cright-paren escape-always separator
                    379: .Sy vleft-bracket [ [ cleft-bracket escape-always separator 
                    380: .Sy vright-bracket ] ] cright-bracket escape-always separator 
                    381: .Sy vperiod . . cperiod escape-when-unique
                    382: .Sy vseparator ^I-^M\ esc\ space ^I-^M\ esc\ space cseparator escape-always separator 
                    383: .Sy vsingle-quote \\' \\' csingle-quote escape-always separator 
                    384: .Sy vsymbol-delimiter | | csingle-delimiter escape-always
                    385: .Sy vescape \e \e cescape escape-always
                    386: .Sy vstring-delimiter """" """" cstring-delimiter escape-always
                    387: .Sy vsingle-character-symbol none none csingle-character-symbol separator
                    388: .Sy vmacro none `, cmacro escape-always separator 
                    389: .Sy vsplicing-macro none #; csplicing-macro escape-always separator 
                    390: .Sy vsingle-macro none none csingle-macro escape-when-unique
                    391: .Sy vsingle-splicing-macro none none csingle-splicing-macro escape-when-unique
                    392: .Sy vinfix-macro none none cinfix-macro escape-always separator 
                    393: .Sy vsingle-infix-macro none none csingle-infix-macro escape-when-unique
                    394: .Sy villegal ^@-^G^N-^Z^\e-^_rubout ^@-^G^N-^Z^\e-^_rubout cillegal escape-always separator 
                    395: .sh +0 Character\ Macros
                    396: .pp
                    397: Character macros are 
                    398: user written functions which are executed during the reading process.
                    399: The value returned by a character macro may or may not be used by 
                    400: the reader, depending on the type of macro and the value returned.
                    401: Character macros are always attached to a single character with
                    402: the 
                    403: .i setsyntax 
                    404: function.
                    405: .sh +1 Types
                    406: There are three types of character macros: normal, splicing and infix.
                    407: These types differ in the arguments they are given or in what is done
                    408: with the result they return.
                    409: .sh +1 Normal
                    410: .pp
                    411: A normal macro
                    412: is passed no arguments.
                    413: The value returned by a normal macro is simply used by
                    414: the reader as if it had read the value itself.
                    415: Here is an example of a macro which returns the abbreviation 
                    416: for a given state.
                    417: .Eb
                    418: \->\fI(de\kAfun stateabbrev nil
                    419:  \h'|\nAu'(cdr (assq (read) '((california . ca) (pennsylvania . pa)))))\fP
                    420: stateabbrev
                    421: \-> \fI(setsyntax '\e! 'vmacro 'stateabbrev)\fP
                    422: t
                    423: \-> \fI'( ! california ! wyoming ! pennsylvania)\fP
                    424: (ca nil pa)
                    425: .Ee
                    426: Notice what happened to 
                    427: \fI ! wyoming\fP.
                    428: Since it wasn't in the table, the associated function
                    429: returned nil.
                    430: The creator of the macro may have wanted to leave the
                    431: list alone, in such a case, but couldn't with this
                    432: type of reader macro.
                    433: The splicing macro, described next, allows a character macro function
                    434: to return a value that is ignored.
                    435: .sh +0 Splicing
                    436: .pp
                    437: The value returned from a splicing macro must be a list or nil.
                    438: If the value is nil, then the value is ignored, otherwise the reader
                    439: acts as if it read each object in the list.
                    440: Usually the list only contains one element. 
                    441: If the reader is reading at the top level (i.e. not collecting elements
                    442: of list),
                    443: then it is illegal for a splicing macro to return more then one
                    444: element in the list.
                    445: The major advantage of a splicing macro over a normal macro is the
                    446: ability of the splicing macro to return nothing. 
                    447: The comment character (usually ;) is a splicing macro bound to a
                    448: function which reads to the end of the line and always returns nil.
                    449: Here is the previous example written as a splicing macro
                    450: .Eb
                    451: \-> \fI(de\kAfun stateabbrev nil
                    452: \h'|\nAu'(\kC(lam\kBbda (value)
                    453:  \h'|\nBu'(cond \kA(value (list value))
                    454:  \h'|\nAu'(t nil)))
                    455:  \h'|\nCu'(cdr (assq (read) '((california . ca) (pennsylvania . pa))))))\fP
                    456: \-> \fI(setsyntax '! 'vsplicing-macro 'stateabbrev)\fP
                    457: \-> \fI'(!pennsylvania ! foo !california)\fP
                    458: (pa ca)
                    459: \-> \fI'!foo !bar !pennsylvania\fP
                    460: pa
                    461: \-> 
                    462: .Ee
                    463: .sh +0 Infix
                    464: .pp
                    465: Infix macros are passed a 
                    466: .i conc
                    467: structure representing what has been read so far.
                    468: Briefly, a 
                    469: tconc
                    470: structure is a single list cell whose car points to 
                    471: a list and whose cdr points to the last list cell in that list.
                    472: The interpretation by the reader of the value 
                    473: returned by  an infix macro depends on
                    474: whether the macro is called while the reader is constructing a 
                    475: list or whether it is called at the top level of the reader.
                    476: If the macro is called while a list is
                    477: being constructed, then the value returned should be  a tconc
                    478: structure.
                    479: The car of that structure replaces the list of elements that the
                    480: reader has been collecting.
                    481: If the macro is called at top level, then it will be passed the
                    482: value nil, and the value it returns should either be nil
                    483: or a tconc structure.
                    484: If the macro returns nil, then the value is ignored and the reader
                    485: continues to read.
                    486: If the macro returns a tconc structure of one element (i.e. whose car
                    487: is a list of one element), then that single element is returned
                    488: as the value of 
                    489: .i read.
                    490: If the macro returns a tconc structure of more than one element,
                    491: then that list of elements is returned as the value of read.
                    492: .Eb
                    493: \-> \fI(de\kAfun plusop (x)
                    494:    \h'|\nAu'(cond \kB((null x) (tconc nil '\e+))
                    495:         \h'|\nBu'(t (lconc nil (list 'plus (caar x) (read))))))\fP
                    496: 
                    497: plusop
                    498: \-> \fI(setsyntax '\e+ 'vinfix-macro 'plusop)\fP
                    499: t
                    500: \-> \fI'(a + b)\fP
                    501: (plus a b)
                    502: \-> \fI'+\fP
                    503: |+|
                    504: \-> 
                    505: .Ee
                    506: .sh -1 Invocations
                    507: .pp
                    508: There are three different circumstances in which you would like
                    509: a macro function to be triggered.
                    510: .ip \fIAlways\ -\fP
                    511: Whenever the macro character is seen, the macro should be invoked.
                    512: This is accomplished by using the character classes 
                    513: .i cmacro ,
                    514: .i csplicing-macro ,
                    515: or 
                    516: .i cinfix-macro ,
                    517: and by using the
                    518: .i separator 
                    519: property.
                    520: The syntax classes 
                    521: .b vmacro ,
                    522: .b vsplicing-macro ,
                    523: and 
                    524: .b vsingle-macro
                    525: are defined this way.
                    526: .ip \fIWhen\ first\ -\fP
                    527: The macro should only be triggered when the macro character is the first
                    528: character found after the scanning process.
                    529: A syntax class for a 
                    530: .i when
                    531: .i first
                    532: macro would
                    533: be defined
                    534: using
                    535: .i cmacro , 
                    536: .i csplicing-macro ,
                    537: or 
                    538: .i cinfix-macro
                    539: and not including the 
                    540: .i separator 
                    541: property.
                    542: .ip \fIWhen\ unique\ -\fP
                    543: The macro should only be triggered when the macro character is the only
                    544: character collected in the token collection
                    545: phase of the reader, 
                    546: i.e the macro character is preceeded by zero or more 
                    547: .i cseparator s
                    548: and followed by a 
                    549: .i separator.
                    550: A syntax class for a 
                    551: .i when
                    552: .i unique
                    553: macro would
                    554: be defined using
                    555: .i csingle-macro ,
                    556: .i csingle-splicing-macro ,
                    557: or 
                    558: .i csingle-infix-macro
                    559: and not including the
                    560: .i separator 
                    561: property.
                    562: The syntax classes so defined are
                    563: .b vsingle-macro ,
                    564: .b vsingle-splicing-macro ,
                    565: and
                    566: .b vsingle-infix-macro .
                    567: .sh -1 Functions
                    568: .Lf setsyntax 's_symbol\ 's_synclass\ ['ls_func]
                    569: .Wh
                    570: ls_func is the name of a function or a lambda body.
                    571: .Re
                    572: t
                    573: .Se
                    574: S_symbol should be a symbol whose print name is only one character.
                    575: The syntax class for 
                    576: that character is
                    577: set to s_synclass in the current readtable.
                    578: If s_synclass is a class that requires a character macro, then
                    579: ls_func must be supplied. 
                    580: .No
                    581: The symbolic syntax codes are new to Opus 38.
                    582: For compatibility, s_synclass can be one of the fixnum syntax codes
                    583: which appeared in older versions of the 
                    584: .Fr
                    585: Manual.
                    586: This compatibility is only temporary: existing code which uses the
                    587: fixnum syntax codes should be converted.
                    588: .Lf getsyntax 's_symbol
                    589: .Re
                    590: the syntax class of the first character 
                    591: of s_symbol's print name.
                    592: s_symbol's print name must be exactly one character long.
                    593: .No
                    594: This function is new to Opus 38.
                    595: It supercedes \fI(status\ syntax)\fP which no longer exists.
                    596: .Lf add-syntax-class 's_synclass\ 'l_properties
                    597: .Re
                    598: s_synclass
                    599: .Se
                    600: Defines the syntax class s_synclass to have properties l_properties.
                    601: The list l_properties should contain a character classes mentioned
                    602: above.
                    603: l_properties may contain one of the escape properties:
                    604: .i escape-always ,
                    605: .i escape-when-unique ,
                    606: or 
                    607: .i escape-when-first .
                    608: l_properties may contain the 
                    609: .i separator
                    610: property.
                    611: After a syntax class has been defined with 
                    612: .i add-syntax-class ,
                    613: the 
                    614: .i setsyntax
                    615: function can be used to give characters that syntax class.
                    616: .Eb
                    617: ; Define a non-separating macro character.  
                    618: ; This type of macro character is used in UCI-Lisp, and
                    619: ; it corresponds to a  FIRST MACRO in Interlisp
                    620: \-> \fI(add-syntax-class 'vuci-macro '(cmacro escape-when-first))\fP
                    621: vuci-macro
                    622: \->
                    623: .Ee

unix.superglobalmegacorp.com

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