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
- <#66489#><#34878#>empty<#34878#><#66489#>, or
- <#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.~ 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.~ 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
- <#66571#><#35468#>empty<#35468#><#66571#>, or
- <#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
- <#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#>
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#>
Solution<#66588#><#66588#>