<div dir="ltr"><div><font face="monospace, monospace">While attempting to extend the Crud demos, I need to do destructuring on a record of records, eg on a value 'theCols' of type 'colsMeta(int, string)' (slightly abbreviated below):</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val theCols : colsMeta(int, string)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val theCols = [   </font></div><div><font face="monospace, monospace">    FooColumn = [ </font></div><div><font face="monospace, monospace">      Nam = "foo", </font></div><div><font face="monospace, monospace">      Show = (fn s => s),</font></div><div><font face="monospace, monospace">      Widget = (fn w => w) ],</font></div><div><font face="monospace, monospace">    BarColumn = [ </font></div><div><font face="monospace, monospace">      Nam = "bar", </font></div><div><font face="monospace, monospace">      Show = (fn s => s),</font></div><div><font face="monospace, monospace">      Widget = (fn w => w) ]</font></div><div><font face="monospace, monospace">  ]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">In this case, I have a value of type `string` (eg, "bar") which corresponds to the value of one of the fields of one of the "inner" records of 'theCols'. </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Using just the string "bar" and the value 'theCols', I want to use pattern-matching and destructuring, to do a kind of lookup on "bar" (to find the field whose 'Nam' field = "bar"), and then assign two values:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  (a) myCol</font></div><div><font face="monospace, monospace">  (b) myColNam</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">So, given a record of records, eg:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val theCols = [   </font></div><div><font face="monospace, monospace">    FooColumn = [ </font></div><div><font face="monospace, monospace">      Nam = "foo", </font></div><div><font face="monospace, monospace">      Show = (fn s => s),</font></div><div><font face="monospace, monospace">      Widget = (fn w => w) ],</font></div><div><font face="monospace, monospace">    BarColumn = [ </font></div><div><font face="monospace, monospace">      Nam = "bar", </font></div><div><font face="monospace, monospace">      Show = (fn s => sh),</font></div><div><font face="monospace, monospace">      Widget = (fn w => w) ]</font></div><div><font face="monospace, monospace">  ]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">And given a *string* which equals one of the 'Nam' fields, eg: </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  "bar"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">The goal is to do the following two things:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(a) Assign 'myCol' to the entire field BarColumn (ie, the field name, and the field value):</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val myCol = </font></div><div><font face="monospace, monospace">    [ BarColumn = [</font></div><div><font face="monospace, monospace">        Nam = "bar", </font></div><div><font face="monospace, monospace">        Show = (fn s => s),</font></div><div><font face="monospace, monospace">        Widget = (fn w => w) ]</font></div><div><font face="monospace, monospace">    ]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(b) And assign 'myNam' to *just* the field name:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">   val myColNam = #BarColumn</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I think the two functions below should do the trick:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  fun getCol aNam someCols =</font></div><div><font face="monospace, monospace">    case someCols of</font></div><div><font face="monospace, monospace">        { colNam = { </font></div><div><font face="monospace, monospace">            Nam = aNam, </font></div><div><font face="monospace, monospace">            Show = sh,</font></div><div><font face="monospace, monospace">            Widget = wg }, </font></div><div><font face="monospace, monospace">          otherOuterFields } => </font></div><div><font face="monospace, monospace">        [ colNam = [ </font></div><div><font face="monospace, monospace">            Nam = aNam, </font></div><div><font face="monospace, monospace">            Show = sh,</font></div><div><font face="monospace, monospace">            Widget = wg ] ]</font></div><div><font face="monospace, monospace">      | _ => error</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  fun getNam aNam someCols = </font></div><div><font face="monospace, monospace">    case someCols of </font></div><div><font face="monospace, monospace">        { colNam = { </font></div><div><font face="monospace, monospace">            Nam = aNam , </font></div><div><font face="monospace, monospace">            otherInnerFields }, </font></div><div><font face="monospace, monospace">          otherOuterfields } => #colNam</font></div><div><font face="monospace, monospace">      | _ => error</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val myCol = getCol "bar" theCols</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val myColNam = getNam "bar" theCols</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Remark:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">The patterns 'otherOuterFields' and 'otherInnerField' could probably be replaced by wildcards `_`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Questions:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(1) I'm concerned about 'colNam', because it is of kind `Name`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(a) Is it possible to have a function which returns something of kind `Name`?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(b) Is it possible to say something like:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  val myColNam = getNam "bar" theCols</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">which attempts to assign something of kind `Name` to the identifier 'myColNam'?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(2) In function getCol, am I using { } and [ ] correctly - ie:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- { } for record *patterns*, and </font></div><div><font face="monospace, monospace">- [ ] for record *expressions* (values) ?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Syntax error:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">So far, the above fragments (currently part of a larger body of code) aren't parsing - I'm getting a syntax error on the 'of' in the 'case' statement, saying "replacing  OF with  LPAREN".</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I'm going to keep whittling my code down to make it smaller and smaller until I can isolate the syntax error.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Question:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Aside from the syntax errors, is the overall approach above approximately correct?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Comparison with the `as` keyword in ML:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Initially I though I could use something similar to ML's "layered patterns", which use the keyword `as`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Citations:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(1) "Tips for Computer Scientists on Standard ML (Revised)" by Mads Tofte, page 6:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><a href="https://www.itu.dk/people/tofte/publ/tips.pdf">https://www.itu.dk/people/tofte/publ/tips.pdf</a> </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(2) "Elementary Standard ML", by G. Michaelson, section 6.9, page 138:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><a href="https://books.google.com.br/books?id=Zf0aq8BtSLAC&pg=PA138&lpg=PA138&dq=ML++%22layered+patterns%22&source=bl&ots=g2aDg-Ma6Q&sig=mAHDVFIRTWkqRAJt5zJj0nH7fvQ&hl=en&sa=X&redir_esc=y#v=onepage&q=ML%20%20%22layered%20patterns%22&f=false">https://books.google.com.br/books?id=Zf0aq8BtSLAC&pg=PA138&lpg=PA138&dq=ML++%22layered+patterns%22&source=bl&ots=g2aDg-Ma6Q&sig=mAHDVFIRTWkqRAJt5zJj0nH7fvQ&hl=en&sa=X&redir_esc=y#v=onepage&q=ML%20%20%22layered%20patterns%22&f=false</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">But I don't think Ur/Web supports ML's "layered patterns" using the `as` keyword, so the above functions 'getCol' and 'getNam' do the destructuring using a "bigger" pattern.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">###</font></div></div>