- From: James Fuller <jim@webcomposite.com>
- Date: Thu, 18 Feb 2016 21:51:16 +0100
- To: Alex Miłowski <alex@milowski.com>
- Cc: XProc WG <public-xml-processing-model-wg@w3.org>
modeling expr as steps avoids distraction and avoids introducing
another construction into the syntax ... the work on data literals
should provide direction on what these steps accept as input.
J
On 18 February 2016 at 21:41, Alex Miłowski <alex@milowski.com> wrote:
> 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:51:45 UTC