[Ur] Correct way to use "computed table names" `{{c}}` & "computed field names" `{c}` in functions?
Stefan Scott
stefanscottalexx at gmail.com
Thu Aug 20 19:54:44 EDT 2015
Page 48 of the manual mentions an interesting syntax for:
- "computed table names" - eg: `{{c}}`
- "computed column names" - eg: `{c}`
...both of kind `Name`.
Also, pages 13 and 15 mention syntax for:
- field names - eg: `#X`
- record field projection - eg: `e.c`
---
I'm attempting create a simple demo using this syntax.
The demo should define a function (eg `table_to_xml aTable aField`) which
accepts a table name and a field name.
Then this function is called using different table names and field names,
to run some SQL queries and generate some XML.
I haven't found any concrete examples of this sort of thing in the manual
or online, so the following is just a wild guess:
(* INCORRECT/tableToXml.ur *)
table t1 : { F1 : string }
table t2 : { F2 : string }
fun table_to_xml
aTable (** OK? **)
aField (** OK? **)
=
queryX1
( SELECT {aField} (** OK? **)
FROM {{aTable}} ) (** OK? **)
( fn r =>
<xml>
{[r.{aField}]} (** Q (1) **)
<br/>
</xml> )
fun main () =
t1x <- table_to_xml t1 #F1 (** Q (2) **)
;
t2x <- table_to_xml t2 #F2 (** Q (2) **)
;
return
<xml><body>
Table 1:<br/>
{t1x}
<br/><br/>
Table 2:<br/>
{t2x}
</body></xml>
This is of course giving compile errors.
---
My two main questions (flagged with comments in the code above) are:
Question (1):
( fn r => <xml> {[r.{aField}]} <br/> </xml> )
The part `r.{aField}` in the body of the anonymous function above appears
to be incorrect.
What is the correct way to use `aField` (the actual parameter of the
function `table_to_xml`, which calls `queryX1`) in the body of this
anonymous function definition?
---
Question (2):
t1x <- table_to_xml t1 #F1 ;
The syntax for the field name `#F1` in the function call above appears to
be incorrect (and the syntax for the table name `t1` might also be
incorrect!).
What is the correct way to pass the table name `t1` and the field name `F1`
to this function call?
---
By the way, as a test, I initially did an even simpler demo using
*constant* table names and field names, and that worked fine - eg:
(* CORRECT/tableToXml.ur *)
table t1 : { F1 : string }
table t2 : { F2 : string }
fun t1_to_xml () =
queryX1
( SELECT t1.F1 FROM t1 )
( fn r => <xml>{[r.F1]}<br/></xml> )
fun t2_to_xml () =
queryX1
( SELECT t2.F2 FROM t2 )
( fn r => <xml>{[r.F2]}<br/></xml> )
fun main () =
t1x <- t1_to_xml ();
t2x <- t2_to_xml ();
return
<xml><body>
Table 1:<br/>
{t1x}
<br/><br/>
Table 2:<br/>
{t2x}
</body></xml>
---
So I'm looking for examples of using "computed table names" and "computed
field names" - specifically the syntax to use in the following situations:
(1) a field name argument `aField` captured in a closure and used in a
field projection `{[r.{aField}]}` inside an anonymous function passed to
another function `queryX1` - eg:
queryX1
( SELECT ... )
( fn r => <xml> {[r.{aField}]} <br/> </xml> )
^^^^^^^^^^
(2) table name and field name arguments `t1` and `#F1` passed to a function
invocation - eg:
t1x <- table_to_xml t1 #F1 ;
^^ ^^^
Thanks for any help!
###
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20150820/f523e257/attachment.html>
More information about the Ur
mailing list