- From: Alex Miłowski <alex@milowski.com>
- Date: Thu, 18 Feb 2016 12:41:21 -0800
- To: XProc WG <public-xml-processing-model-wg@w3.org>
Maybe we should define everything as steps and just not really have an
expression language?
The only issue with that is syntax (e.g., embedding quotes in quotes)
and having a good multiline literal can help:
'''
...really long
complicated expression..
''' → xpath() ≫ $complicated
if ($complicated) then ... else ...
On Wed, Feb 17, 2016 at 1:43 PM, James Fuller <jim@webcomposite.com> wrote:
> These are interesting ideas though after thinking about it for a few
> days I am less sure about how we would spec this and what it gives our
> users.
>
> I think we both agree that getting rid of the expr language does not
> get rid of the need for choose/if switching.
>
> I would prefer simple eg. steps to evaluate expressions.
>
> xpath('....')=>$condition1
>
> js('....')=>$condition2
>
> cobol('....')=>$condition3
>
> I think that just means (in pseudocode) supporting if/choose.
>
> if($condition)
> then
> else if($condition)
> then
> else
>
> and
>
> choose($condition1)
> when(true) then
> when(false) then
> default then
>
> and define active expr language as some kind of defaulted to xpath
> option which means its not dynamic (I think its a distraction to try
> and make it dynamic).
>
> make sense ? J
>
> On 13 February 2016 at 15:25, Alex Miłowski <alex@milowski.com> wrote:
>> I've been thinking about this more and removing the expression
>> language complicates the simple cases far too much. Yet, I really
>> don't want to require embedding XPath for environments where there is
>> no need for it. Meanwhile, it those environments, the expression
>> language might be something else (e.g., a chunk of JavaScript).
>>
>> We can still conceptualize an expression as something like step that
>> acts on inputs and produces outputs. In all our uses, the results of
>> expressions have contextual uses (e.g., controlling the flo via a
>> conditional).
>>
>> First, let's observe that in scripting languages, it is common to
>> evaluate expressions with some syntax or function call. We can
>> certainly choose to evaluate expressions as step invocations where the
>> step is passed the script as a parameter:
>>
>> eval("xs:decimal($1/*/@version) < 2.0")
>>
>> We can shorten this by a specialized syntax:
>>
>> (`xs:decimal($1/*/@version) < 2.0`)
>>
>> and then we need to define the parameters:
>>
>> [$x as document-node()](`xs:decimal($x/*/@version) < 2.0`)
>>
>> Now, it a JavaScript, that might be:
>>
>> [$x as document-node()](`parseFloat(x.documentElement.getAttribute("version"))<2.0`)
>>
>> Finally, we need a declaration that indicates the scripting language used:
>>
>> declare default script "text/javascript";
>>
>> I'm not sure it is a good idea to mix scripting languages. We may
>> want to allow that for extensibility.
>>
>> So, our example 3 becomes:
>>
>> xproc version = "2.0";
>>
>> declare default script "application/xquery";
>>
>> inputs $source as document-node();
>> outputs $result as document-node();
>>
>> $source → { if ([$x as document-node](`xs:int($x/*/@version) < 2.0`)($source))
>> then [$source,"v1schema.xsd"] →
>> validate-with-xml-schema() ≫ $result
>> else [$source,"v2schema.xsd"] →
>> validate-with-xml-schema() ≫ $result
>> }
>> → [$1,"stylesheet.xsl"] → xslt() ≫ $result
>>
>> That syntax might be more verbose when used inline but if we allowed
>> the current in-scope output ports by default:
>>
>> $source → { if ((`xs:int($source/*/@version) < 2.0`))
>> then [$source,"v1schema.xsd"] →
>> validate-with-xml-schema() ≫ $result
>> else [$source,"v2schema.xsd"] →
>> validate-with-xml-schema() ≫ $result
>> }
>> → [$1,"stylesheet.xsl"] → xslt() ≫ $result
>>
>> Because we have flow declarations, you can package scripts without a
>> step declaration:
>>
>> declare flow check-version()
>> inputs $source as document-node()
>> outputs $result as xs:boolean
>> {
>> if ((`xs:int($source/*/@version) < 2.0`))
>> then true ≫ $result
>> else false ≫ $result
>> }
>>
>> assuming we have a way for atomic values to be literals (e.g. a boolean value).
>>
>> Finally, it would be nice to be able to write this:
>>
>> declare flow check-version()
>> inputs $source as document-node()
>> outputs $result as xs:boolean
>> {
>> (`xs:int($source/*/@version) < 2.0`) ≫ $result
>> }
>>
>> On Fri, Feb 12, 2016 at 4:01 PM, Alex Miłowski <alex@milowski.com> wrote:
>>> One of the risks we have is that the use of XPath as an expression
>>> language makes XProc difficult for non-XML environments where no such
>>> implementation exists.
>>>
>>> We have several uses of XPath:
>>>
>>> 1. Projections (e.g., $in//section)
>>> 2. replace ($in//section) { ...}
>>> 3. variables
>>> 4. conditionals
>>>
>>> For (1) we make projects a step specific to the data format.
>>>
>>> For (2) ... not sure.
>>>
>>> For (3): variables are output port variables and we dump let. You
>>> need to use a step to do manipulations. We need to make embedding
>>> steps or mapping them to implementations possible.
>>>
>>> For (4):
>>>
>>> I think we can get rid of the expression language by enhancing the
>>> step description so the expressions can be put into a step as its
>>> implementation and the step gets used in a flow.
>>>
>>> So, we currently have this:
>>>
>>> if (xs:decimal($1/*/@version) < 2.0)
>>> then [$1,"v1schema.xsd"] → validate-with-xml-schema() ≫ @1
>>> else [$1,"v2schema.xsd"] → validate-with-xml-schema() ≫ @1
>>>
>>> we would now have:
>>>
>>> step check-version1()
>>> inputs $source as document-node()
>>> outputs $result as xs:boolean
>>> from "my:check-version1" in "script.xq";
>>>
>>> $1 → check-version1() ≫ $isv1
>>> if ($isv1)
>>> then [$1,"v1schema.xsd"] → validate-with-xml-schema() ≫ @1
>>> else [$1,"v2schema.xsd"] → validate-with-xml-schema() ≫ @1
>>>
>>> and "script.xq" is:
>>>
>>> function my:check-version1($source) as xs:boolean
>>> {
>>> return xs:decimal($1/*/@version) < 2.0 d
>>> }
>>>
>>>
>>> Now, this is now two files instead of one. We can fix this by
>>> allowing embedding of the script. It is unclear how the parsing would
>>> work:
>>>
>>> step check-version1()
>>> inputs $source as document-node()
>>> outputs $result as xs:boolean
>>> script "application/xquery"
>>> {
>>> return xs:decimal($1/*/@version) < 2.0 d
>>> }
>>>
>>> Also, when there is more than one output port, the return will be more
>>> complicated and need to be a map. In other languages, it will be a
>>> similar construct.
>>>
>>> We probably want simple literal comparisons to enable steps to return
>>> emulated values that then control which flow is executed.
>>>
>>>
>>> --
>>> --Alex Miłowski
>>> "The excellence of grammar as a guide is proportional to the paucity of the
>>> inflexions, i.e. to the degree of analysis effected by the language
>>> considered."
>>>
>>> Bertrand Russell in a footnote of Principles of Mathematics
>>
>>
>>
>> --
>> --Alex Miłowski
>> "The excellence of grammar as a guide is proportional to the paucity of the
>> inflexions, i.e. to the degree of analysis effected by the language
>> considered."
>>
>> Bertrand Russell in a footnote of Principles of Mathematics
>>
--
--Alex Miłowski
"The excellence of grammar as a guide is proportional to the paucity of the
inflexions, i.e. to the degree of analysis effected by the language
considered."
Bertrand Russell in a footnote of Principles of Mathematics
Received on Thursday, 18 February 2016 20:41:55 UTC