From Files to Lines, From Lists to Lists of Lists

In section~#secfiles#34872>, we discussed the organization of computer files, which is one way to equip a computer with permanent memory. We did not discuss the nature of files <#34873#>per se<#34873#>. Roughly put, we can think of a <#34874#>file<#34874#> as a list of symbols.
A <#66488#><#34876#>file<#34876#><#66488#> is either
  1. <#66489#><#34878#>empty<#34878#><#66489#>, or
  2. <#66490#><#34879#>(cons<#34879#>\ <#34880#>s<#34880#>\ <#34881#>f)<#34881#><#66490#> where <#66491#><#34882#>s<#34882#><#66491#> is a symbol and <#66492#><#34883#>f<#34883#><#66492#> is a file.
A fully faithful representation of files should only include symbols that correspond to characters, but for our purposes we may ignore this distinction. Following a tradition that predates computers, one symbol is almost always treated differently: <#66493#><#34887#>'<#34887#><#34888#>NL<#34888#><#66493#>. The symbol stands for <#34889#>newline<#34889#> and separates two lines from each other. That is, <#66494#><#34890#>'<#34890#><#34891#>NL<#34891#><#66494#> indicates the end of one line and the beginning of another. In most cases, it is therefore better to think of files as data with more structure. In particular, a file could be represented as a list of lines, where each line is a list of symbols. For example, the file
<#34896#>(list<#34896#> <#34897#>'<#34897#><#34898#>how<#34898#> <#34899#>'<#34899#><#34900#>are<#34900#> <#34901#>'<#34901#><#34902#>you<#34902#> <#34903#>'<#34903#><#34904#>NL<#34904#>
      <#34905#>'<#34905#><#34906#>doing<#34906#> <#34907#>'<#34907#><#34908#>?<#34908#> <#34909#>'<#34909#><#34910#>NL<#34910#> 
      <#34911#>'<#34911#><#34912#>any<#34912#> <#34913#>'<#34913#><#34914#>progress<#34914#> <#34915#>'<#34915#><#34916#>?<#34916#><#34917#>)<#34917#> 
should be processed as a list of three lines:
<#34925#>(list<#34925#> <#34926#>(list<#34926#> <#34927#>'<#34927#><#34928#>how<#34928#> <#34929#>'<#34929#><#34930#>are<#34930#> <#34931#>'<#34931#><#34932#>you)<#34932#>
      <#34933#>(list<#34933#> <#34934#>'<#34934#><#34935#>doing<#34935#> <#34936#>'<#34936#><#34937#>?<#34937#><#34938#>)<#34938#> 
      <#34939#>(list<#34939#> <#34940#>'<#34940#><#34941#>any<#34941#> <#34942#>'<#34942#><#34943#>progress<#34943#> <#34944#>'<#34944#><#34945#>?<#34945#><#34946#>))<#34946#> 
Similarly, the file
<#34954#>(list<#34954#> <#34955#>'<#34955#><#34956#>a<#34956#> <#34957#>'<#34957#><#34958#>b<#34958#> <#34959#>'<#34959#><#34960#>c<#34960#> <#34961#>'<#34961#><#34962#>NL<#34962#>
      <#34963#>'<#34963#><#34964#>d<#34964#> <#34965#>'<#34965#><#34966#>e<#34966#> <#34967#>'<#34967#><#34968#>NL<#34968#> 
      <#34969#>'<#34969#><#34970#>f<#34970#> <#34971#>'<#34971#><#34972#>g<#34972#> <#34973#>'<#34973#><#34974#>h<#34974#> <#34975#>'<#34975#><#34976#>NL)<#34976#> 
is also represented as a list of three lines
<#34984#>(list<#34984#> <#34985#>(list<#34985#> <#34986#>'<#34986#><#34987#>a<#34987#> <#34988#>'<#34988#><#34989#>b<#34989#> <#34990#>'<#34990#><#34991#>c)<#34991#>
      <#34992#>(list<#34992#> <#34993#>'<#34993#><#34994#>d<#34994#> <#34995#>'<#34995#><#34996#>e)<#34996#> 
      <#34997#>(list<#34997#> <#34998#>'<#34998#><#34999#>f<#34999#> <#35000#>'<#35000#><#35001#>g<#35001#> <#35002#>'<#35002#><#35003#>h))<#35003#> 
because, by convention, an empty line at the end is ignored.
<#35009#>Exercise 27.2.1<#35009#> Determine what the list-of-lines representation for <#66495#><#35011#>empty<#35011#><#66495#>, <#66496#><#35012#>(list<#35012#>\ <#35013#>'<#35013#><#35014#>NL)<#35014#><#66496#>, and <#66497#><#35015#>(list<#35015#>\ <#35016#>'<#35016#><#35017#>NL<#35017#>\ <#35018#>'<#35018#><#35019#>NL)<#35019#><#66497#> should be. Why are these examples important test cases? <#35020#>Hint:<#35020#> \ Keep in mind, that an empty line at the end is ignored.~ external Solution<#66498#><#66498#>
Here are the contract, purpose statement, and header:
<#72249#>;; <#71494#><#66499#><#35032#>file<#35032#><#66499#><#66500#><#35033#><#35033#><#35034#>-;SPMgt;<#35034#><#35035#><#35035#><#66500#><#66501#><#35036#>list-of-lines<#35036#><#66501#> <#35037#>:<#35037#> <#35038#>file<#35038#> <#35039#><#35039#><#35040#>-;SPMgt;<#35040#><#35041#><#35041#> <#35042#>(listof<#35042#> <#35043#>(listof<#35043#> <#35044#>symbols))<#35044#><#71494#><#72249#>
<#35045#>;; to convert a file into a list of lines <#35045#> 
<#35046#>(define<#35046#> <#35047#>(<#35047#><#66502#><#35048#>file<#35048#><#66502#><#66503#><#35049#><#35049#><#35050#>-;SPMgt;<#35050#><#35051#><#35051#><#66503#><#66504#><#35052#>list-of-lines<#35052#><#66504#> <#35053#>afile)<#35053#> <#35054#>...)<#35054#> 
Describing the process of separating a file into a list of lines is easy. The problem is trivially solvable if the file is <#66505#><#35058#>empty<#35058#><#66505#>; in that case, the file doesn't contain a line. Otherwise, the file contains at least one symbol and thus at least one line. This line must be separated from the rest of the file, and then the rest of the file must be translated into a list of lines. Let us sketch this process description in Scheme:
<#35063#>(d<#35063#><#35064#>efine<#35064#> <#35065#>(<#35065#><#66506#><#35066#>file<#35066#><#66506#><#66507#><#35067#><#35067#><#35068#>-;SPMgt;<#35068#><#35069#><#35069#><#66507#><#66508#><#35070#>list-of-lines<#35070#><#66508#> <#35071#>afile)<#35071#>
  <#35072#>(c<#35072#><#35073#>ond<#35073#> 
    <#35074#>[<#35074#><#35075#>(empty?<#35075#> <#35076#>afile)<#35076#> <#35077#>...]<#35077#> 
    <#35078#>[<#35078#><#35079#>e<#35079#><#35080#>lse<#35080#> 
      <#35081#>...<#35081#> <#35082#>(first-line<#35082#> <#35083#>afile)<#35083#> <#35084#>...<#35084#> 
      <#35085#>...<#35085#> <#35086#>(<#35086#><#66509#><#35087#>file<#35087#><#66509#><#66510#><#35088#><#35088#><#35089#>-;SPMgt;<#35089#><#35090#><#35090#><#66510#><#66511#><#35091#>list-of-lines<#35091#><#66511#> <#35092#>(remove-first-line<#35092#> <#35093#>afile))<#35093#> <#35094#>...]<#35094#><#35095#>))<#35095#> 
Because the separation of the first line from the rest of the file requires a scan of an arbitrarily long list of symbols, we add two auxiliary functions to our wish list: <#66512#><#35099#>first-line<#35099#><#66512#>, which collects all symbols up to, but excluding, the first occurrence of <#66513#><#35100#>'<#35100#><#35101#>NL<#35101#><#66513#> or the end of the list; and <#66514#><#35102#>remove-first-line<#35102#><#66514#>, which removes all those symbols and produces the remainder of <#66515#><#35103#>afile<#35103#><#66515#>.
<#72250#>;; <#71495#><#66516#><#35108#>file<#35108#><#66516#><#66517#><#35109#><#35109#><#35110#>-;SPMgt;<#35110#><#35111#><#35111#><#66517#><#66518#><#35112#>list-of-lines<#35112#><#66518#> <#35113#>:<#35113#> <#35114#>file<#35114#> <#35115#><#35115#><#35116#>-;SPMgt;<#35116#><#35117#><#35117#> <#35118#>(listof<#35118#> <#35119#>(listof<#35119#> <#35120#>symbol))<#35120#><#71495#><#72250#>
<#35121#>;; to convert a file into a list of lines <#35121#> 
<#35122#>(d<#35122#><#35123#>efine<#35123#> <#35124#>(<#35124#><#66519#><#35125#>file<#35125#><#66519#><#66520#><#35126#><#35126#><#35127#>-;SPMgt;<#35127#><#35128#><#35128#><#66520#><#66521#><#35129#>list-of-lines<#35129#><#66521#> <#35130#>afile)<#35130#> 
  <#35131#>(c<#35131#><#35132#>ond<#35132#> 
    <#35133#>[<#35133#><#35134#>(empty?<#35134#> <#35135#>afile)<#35135#> <#35136#>empty]<#35136#> 
    <#35137#>[<#35137#><#35138#>e<#35138#><#35139#>lse<#35139#> 
      <#35140#>(cons<#35140#> <#35141#>(first-line<#35141#> <#35142#>afile)<#35142#> 
            <#35143#>(<#35143#><#66522#><#35144#>file<#35144#><#66522#><#66523#><#35145#><#35145#><#35146#>-;SPMgt;<#35146#><#35147#><#35147#><#66523#><#66524#><#35148#>list-of-lines<#35148#><#66524#> <#35149#>(remove-first-line<#35149#> <#35150#>afile)))]<#35150#><#35151#>))<#35151#> 
<#71496#>;; <#66525#><#35152#>first-line<#35152#> <#35153#>:<#35153#> <#35154#>file<#35154#> <#35155#><#35155#><#35156#>-;SPMgt;<#35156#><#35157#><#35157#> <#35158#>(listof<#35158#> <#35159#>symbol)<#35159#><#66525#><#71496#> 
<#71497#>;; to compute the prefix of <#66526#><#35160#>afile<#35160#><#66526#> up to the first occurrence of <#66527#><#35161#>NEWLINE<#35161#><#66527#><#71497#> 
<#35162#>(d<#35162#><#35163#>efine<#35163#> <#35164#>(first-line<#35164#> <#35165#>afile)<#35165#> 
  <#35166#>(c<#35166#><#35167#>ond<#35167#> 
    <#35168#>[<#35168#><#35169#>(empty?<#35169#> <#35170#>afile)<#35170#> <#35171#>empty]<#35171#> 
    <#35172#>[<#35172#><#35173#>else<#35173#> <#35174#>(c<#35174#><#35175#>ond<#35175#> 
            <#35176#>[<#35176#><#35177#>(symbol=?<#35177#> <#35178#>(first<#35178#> <#35179#>afile)<#35179#> <#35180#>NEWLINE)<#35180#> <#35181#>empty]<#35181#> 
            <#35182#>[<#35182#><#35183#>else<#35183#> <#35184#>(cons<#35184#> <#35185#>(first<#35185#> <#35186#>afile)<#35186#> <#35187#>(first-line<#35187#> <#35188#>(rest<#35188#> <#35189#>afile)))]<#35189#><#35190#>)]<#35190#><#35191#>))<#35191#> 
<#71498#>;; <#66528#><#35192#>remove-first-line<#35192#> <#35193#>:<#35193#> <#35194#>file<#35194#> <#35195#><#35195#><#35196#>-;SPMgt;<#35196#><#35197#><#35197#> <#35198#>(listof<#35198#> <#35199#>symbol)<#35199#><#66528#><#71498#> 
<#71499#>;; to compute the suffix of <#66529#><#35200#>afile<#35200#><#66529#> behind the first occurrence of <#66530#><#35201#>NEWLINE<#35201#><#66530#><#71499#> 
<#35202#>(d<#35202#><#35203#>efine<#35203#> <#35204#>(remove-first-line<#35204#> <#35205#>afile)<#35205#> 
  <#35206#>(c<#35206#><#35207#>ond<#35207#> 
    <#35208#>[<#35208#><#35209#>(empty?<#35209#> <#35210#>afile)<#35210#> <#35211#>empty]<#35211#> 
    <#35212#>[<#35212#><#35213#>else<#35213#> <#35214#>(c<#35214#><#35215#>ond<#35215#> 
            <#35216#>[<#35216#><#35217#>(symbol=?<#35217#> <#35218#>(first<#35218#> <#35219#>afile)<#35219#> <#35220#>NEWLINE)<#35220#> <#35221#>(rest<#35221#> <#35222#>afile)]<#35222#> 
            <#35223#>[<#35223#><#35224#>else<#35224#> <#35225#>(remove-first-line<#35225#> <#35226#>(rest<#35226#> <#35227#>afile))]<#35227#><#35228#>)]<#35228#><#35229#>))<#35229#> 
<#35230#>(define<#35230#> <#35231#>NEWLINE<#35231#> <#35232#>'<#35232#><#35233#>NL)<#35233#> 
<#35237#>Figure: Translating a file into a list of lines<#35237#>
From here, we can fill the gaps easily. In <#71500#><#66531#><#35239#>file<#35239#><#66531#><#66532#><#35240#><#35240#><#35241#>-;SPMgt;<#35241#><#35242#><#35242#><#66532#><#66533#><#35243#>list-of-lines<#35243#><#66533#><#71500#>, the answer in the first clause must be <#66534#><#35244#>empty<#35244#><#66534#> because an empty file does not contain any lines. The answer in the second clause must <#66535#><#35245#>cons<#35245#><#66535#> the value of <#66536#><#35246#>(first-line<#35246#>\ <#35247#>afile)<#35247#><#66536#> onto the value <#71501#><#35248#>(<#35248#><#66537#><#35249#>file<#35249#><#66537#><#66538#><#35250#><#35250#><#35251#>-;SPMgt;<#35251#><#35252#><#35252#><#66538#><#66539#><#35253#>list-of-lines<#35253#><#66539#>\ <#35254#>(remove-first-line<#35254#>\ <#35255#>afile))<#35255#><#71501#>, because the first expression computes the first line and the second one computes the rest of the lines. Finally, the auxiliary functions process their inputs in a structurally recursive manner; their development is a straightforward exercise. Figure~#figfile2list#35256> collects the three function definitions and a variable definition for <#66540#><#35257#>NEWLINE<#35257#><#66540#>. Let us take a look at the process of turning the first file from above into a list of lines:
  <#35262#>(<#35262#><#66541#><#35263#>file<#35263#><#66541#><#66542#><#35264#><#35264#><#35265#>-;SPMgt;<#35265#><#35266#><#35266#><#66542#><#66543#><#35267#>list-of-lines<#35267#><#66543#> <#35268#>(list<#35268#> <#35269#>'<#35269#><#35270#>a<#35270#> <#35271#>'<#35271#><#35272#>b<#35272#> <#35273#>'<#35273#><#35274#>c<#35274#> <#35275#>'<#35275#><#35276#>NL<#35276#> <#35277#>'<#35277#><#35278#>d<#35278#> <#35279#>'<#35279#><#35280#>e<#35280#> <#35281#>'<#35281#><#35282#>NL<#35282#> <#35283#>'<#35283#><#35284#>f<#35284#> <#35285#>'<#35285#><#35286#>g<#35286#> <#35287#>'<#35287#><#35288#>h<#35288#> <#35289#>'<#35289#><#35290#>NL))<#35290#>
<#35291#>=<#35291#> <#35292#>(cons<#35292#> <#35293#>(list<#35293#> <#35294#>'<#35294#><#35295#>a<#35295#> <#35296#>'<#35296#><#35297#>b<#35297#> <#35298#>'<#35298#><#35299#>c)<#35299#> <#35300#>(<#35300#><#66544#><#35301#>file<#35301#><#66544#><#66545#><#35302#><#35302#><#35303#>-;SPMgt;<#35303#><#35304#><#35304#><#66545#><#66546#><#35305#>list-of-lines<#35305#><#66546#> <#35306#>(list<#35306#> <#35307#>'<#35307#><#35308#>d<#35308#> <#35309#>'<#35309#><#35310#>e<#35310#> <#35311#>'<#35311#><#35312#>NL<#35312#> <#35313#>'<#35313#><#35314#>f<#35314#> <#35315#>'<#35315#><#35316#>g<#35316#> <#35317#>'<#35317#><#35318#>h<#35318#> <#35319#>'<#35319#><#35320#>NL)))<#35320#> 
<#35321#>=<#35321#> <#35322#>(cons<#35322#> <#35323#>(list<#35323#> <#35324#>'<#35324#><#35325#>a<#35325#> <#35326#>'<#35326#><#35327#>b<#35327#> <#35328#>'<#35328#><#35329#>c)<#35329#> 
        <#35330#>(cons<#35330#> <#35331#>(list<#35331#> <#35332#>'<#35332#><#35333#>d<#35333#> <#35334#>'<#35334#><#35335#>e)<#35335#> 
              <#35336#>(<#35336#><#66547#><#35337#>file<#35337#><#66547#><#66548#><#35338#><#35338#><#35339#>-;SPMgt;<#35339#><#35340#><#35340#><#66548#><#66549#><#35341#>list-of-lines<#35341#><#66549#> <#35342#>(list<#35342#> <#35343#>'<#35343#><#35344#>f<#35344#> <#35345#>'<#35345#><#35346#>g<#35346#> <#35347#>'<#35347#><#35348#>h<#35348#> <#35349#>'<#35349#><#35350#>NL))))<#35350#> 
<#35351#>=<#35351#> <#35352#>(cons<#35352#> <#35353#>(list<#35353#> <#35354#>'<#35354#><#35355#>a<#35355#> <#35356#>'<#35356#><#35357#>b<#35357#> <#35358#>'<#35358#><#35359#>c)<#35359#> 
        <#35360#>(cons<#35360#> <#35361#>(list<#35361#> <#35362#>'<#35362#><#35363#>d<#35363#> <#35364#>'<#35364#><#35365#>e)<#35365#> 
              <#35366#>(cons<#35366#> <#35367#>(list<#35367#> <#35368#>'<#35368#><#35369#>f<#35369#> <#35370#>'<#35370#><#35371#>g<#35371#> <#35372#>'<#35372#><#35373#>h)<#35373#> 
                    <#35374#>(<#35374#><#66550#><#35375#>file<#35375#><#66550#><#66551#><#35376#><#35376#><#35377#>-;SPMgt;<#35377#><#35378#><#35378#><#66551#><#66552#><#35379#>list-of-lines<#35379#><#66552#> <#35380#>empty))))<#35380#> 
<#35381#>=<#35381#> <#35382#>(cons<#35382#> <#35383#>(list<#35383#> <#35384#>'<#35384#><#35385#>a<#35385#> <#35386#>'<#35386#><#35387#>b<#35387#> <#35388#>'<#35388#><#35389#>c)<#35389#> 
        <#35390#>(cons<#35390#> <#35391#>(list<#35391#> <#35392#>'<#35392#><#35393#>d<#35393#> <#35394#>'<#35394#><#35395#>e)<#35395#> 
              <#35396#>(cons<#35396#> <#35397#>(list<#35397#> <#35398#>'<#35398#><#35399#>f<#35399#> <#35400#>'<#35400#><#35401#>g<#35401#> <#35402#>'<#35402#><#35403#>h)<#35403#> 
                    <#35404#>empty)))<#35404#> 
<#35405#>=<#35405#> <#35406#>(list<#35406#> <#35407#>(list<#35407#> <#35408#>'<#35408#><#35409#>a<#35409#> <#35410#>'<#35410#><#35411#>b<#35411#> <#35412#>'<#35412#><#35413#>c)<#35413#> 
        <#35414#>(list<#35414#> <#35415#>'<#35415#><#35416#>d<#35416#> <#35417#>'<#35417#><#35418#>e)<#35418#> 
        <#35419#>(list<#35419#> <#35420#>'<#35420#><#35421#>f<#35421#> <#35422#>'<#35422#><#35423#>g<#35423#> <#35424#>'<#35424#><#35425#>h))<#35425#> 
From this evaluation we can easily tell that the argument of the recursive application of <#71502#><#66553#><#35429#>file<#35429#><#66553#><#66554#><#35430#><#35430#><#35431#>-;SPMgt;<#35431#><#35432#><#35432#><#66554#><#66555#><#35433#>list-of-lines<#35433#><#66555#><#71502#> is almost never the rest of the given file. That is, it is basically never an immediate component of the given file but always a proper suffix. The only exception occurs when <#66556#><#35434#>'<#35434#><#35435#>NL<#35435#><#66556#> occurs twice in a row. Finally, the evaluation and the definition of <#71503#><#66557#><#35436#>file<#35436#><#66557#><#66558#><#35437#><#35437#><#35438#>-;SPMgt;<#35438#><#35439#><#35439#><#66558#><#66559#><#35440#>list-of-lines<#35440#><#66559#><#71503#> show that its generative recursion is simple. Every recursive application consumes a list that is shorter than the given one. Hence, the recursive process eventually stops because the function consumes <#66560#><#35441#>empty<#35441#><#66560#>.
<#35444#>Exercise 27.2.2<#35444#> Organize the program in figure~#figfile2list#35446> using <#66561#><#35447#>local<#35447#><#66561#>. Abstract the functions <#66562#><#35448#>first-line<#35448#><#66562#> and <#66563#><#35449#>remove-first-line<#35449#><#66563#>. Then organize the resulting program using a <#66564#><#35450#>local<#35450#><#66564#> again.~ external Solution<#66565#><#66565#> <#35456#>Exercise 27.2.3<#35456#> Design <#71504#><#66566#><#35458#>file<#35458#><#66566#><#66567#><#35459#><#35459#><#35460#>-;SPMgt;<#35460#><#35461#><#35461#><#66567#><#66568#><#35462#>list-of-checks<#35462#><#66568#><#71504#>. The function consumes a file of numbers and the symbol <#66569#><#35463#>'<#35463#><#35464#>table<#35464#><#66569#> and outputs a list of restaurant records.
A <#66570#><#35466#>file of numbers<#35466#><#66570#> is either
  1. <#66571#><#35468#>empty<#35468#><#66571#>, or
  2. <#66572#><#35469#>(cons<#35469#>\ <#35470#>N<#35470#>\ <#35471#>F)<#35471#><#66572#> where <#66573#><#35472#>N<#35472#><#66573#> is a number and <#66574#><#35473#>F<#35473#><#66574#> is a file, or
  3. <#66575#><#35474#>(cons<#35474#>\ <#35475#>'<#35475#><#35476#>NL<#35476#>\ <#35477#>F)<#35477#><#66575#>, where <#66576#><#35478#>F<#35478#><#66576#> is a file.
The output of <#71505#><#66577#><#35481#>file<#35481#><#66577#><#66578#><#35482#><#35482#><#35483#>-;SPMgt;<#35483#><#35484#><#35484#><#66578#><#66579#><#35485#>list-of-checks<#35485#><#66579#><#71505#> is a list of restaurant structures:
<#35490#>(define-struct<#35490#> <#35491#>rr<#35491#> <#35492#>(table<#35492#> <#35493#>costs))<#35493#>
The first field represents a table number, the second one a list of amounts charged to that table. Example:
  <#35501#>(<#35501#><#66580#><#35502#>file<#35502#><#66580#><#66581#><#35503#><#35503#><#35504#>-;SPMgt;<#35504#><#35505#><#35505#><#66581#><#66582#><#35506#>list-of-checks<#35506#><#66582#>
                             <#35507#>(list<#35507#>  <#35508#>1<#35508#> <#35509#>2.30<#35509#> <#35510#>4.00<#35510#> <#35511#>12.50<#35511#> <#35512#>13.50<#35512#> <#35513#>'<#35513#><#35514#>NL<#35514#> 
                                    <#35515#>2<#35515#> <#35516#>4.00<#35516#> <#35517#>18.00<#35517#> <#35518#>'<#35518#><#35519#>NL<#35519#> 
                                    <#35520#>4<#35520#> <#35521#>2.30<#35521#> <#35522#>12.50))<#35522#> 
<#35523#>=<#35523#> <#35524#>(list<#35524#> <#35525#>(make-rr<#35525#> <#35526#>1<#35526#> <#35527#>(list<#35527#> <#35528#>2.30<#35528#> <#35529#>4.00<#35529#> <#35530#>12.50<#35530#> <#35531#>13.50))<#35531#> 
        <#35532#>(make-rr<#35532#> <#35533#>2<#35533#> <#35534#>(list<#35534#> <#35535#>4.00<#35535#> <#35536#>18.00))<#35536#> 
        <#35537#>(make-rr<#35537#> <#35538#>4<#35538#> <#35539#>(list<#35539#> <#35540#>2.30<#35540#> <#35541#>12.50)))<#35541#> 
external Solution<#66583#><#66583#> <#35550#>Exercise 27.2.4<#35550#> Develop the function <#66584#><#35552#>create-matrix<#35552#><#66584#>. It consumes a number <#66585#><#35553#>n<#35553#><#66585#> and a list of #tex2html_wrap_inline73620# numbers. It produces a list of <#66586#><#35554#>n<#35554#><#66586#> lists of <#66587#><#35555#>n<#35555#><#66587#> numbers. Example:
  <#35560#>(create-matrix<#35560#> <#35561#>2<#35561#> <#35562#>(list<#35562#> <#35563#>1<#35563#> <#35564#>2<#35564#> <#35565#>3<#35565#> <#35566#>4))<#35566#>
<#35567#>=<#35567#> <#35568#>(list<#35568#> <#35569#>(list<#35569#> <#35570#>1<#35570#> <#35571#>2)<#35571#> 
        <#35572#>(list<#35572#> <#35573#>3<#35573#> <#35574#>4))<#35574#> 
external Solution<#66588#><#66588#>