QT4CG meeting 159 draft minutes, 7 April 2026

Hello,

Here are today’s minutes.

   https://qt4cg.org/meeting/minutes/2026/04-07.html

QT4 CG Meeting 159 Minutes 2026-04-07

   [1]Meeting index / [2]QT4CG.org / [3]Dashboard / [4]GH Issues / [5]GH
   Pull Requests

Table of Contents

     * [6]Summary of new and continuing actions [0/8]
     * [7]Draft Minutes
     * [8]1. Administrivia
          + [9]1.1. Roll call [7/10]
          + [10]1.2. Accept the agenda
          + [11]1.3. Approve minutes of the previous meeting
          + [12]1.4. Next meeting
          + [13]1.5. Review of open action items [3/10]
          + [14]1.6. Review of open pull requests and issues
               o [15]1.6.1. substantive PRs
     * [16]2. Technical agenda
          + [17]2.1. PR #2566: 1979 Records with type annotations
          + [18]2.2. What about get and put?
          + [19]2.3. What about instance of?
          + [20]2.4. PR #2572: 2312 Drop map:keys-where
          + [21]2.5. PR #2570: 2553 File Module: delete empty directories
     * [22]3. Any other business

Summary of new and continuing actions [0/8]

     * [ ] QT4CG-143-02: MK to try to recover the ability to extract
       formal equivalences into tests
     * [ ] QT4CG-144-01: MK to consider if any now lost value comparisons
       should be added as examples.
     * [ ] QT4CG-150-04: NW to see about a status update on PR #2345;
       possibly schedule discussion
     * [ ] QT4CG-156-01: MK: add reference to data model in F&O 9.2
     * [ ] QT4CG-156-03: MK to revise PR #2516 in light of the comments.
     * [ ] QT4CG-158-01: MK to revisit the Conformance section to revise
       in light of #2556 error changes
     * [ ] QT4CG-158-02: MK to add system-properties() keys for file and
       binary support

Draft Minutes

1. Administrivia

1.1. Roll call [7/10]

   Regrets: JK, JWL
     * [X] David J Birnbaum (DB)
     * [ ] Reece Dunn (RD)
     * [X] Christian Gr¸n (CG)
     * [ ] Joel Kalvesmaki (JK)
     * [X] Michael Kay (MK)
     * [X] Juri Leino (JLO)
     * [ ] John Lumley (JWL)
     * [X] Alan Painter (AP
     * [X] Wendell Piez (WP)
     * [X] Norm Tovey-Walsh (NW) Scribe. Chair.

1.2. Accept the agenda

   Proposal: Accept [23]the agenda.

1.3. Approve minutes of the previous meeting

   Proposal: Accept [24]the minutes of the previous meeting.

   Accepted.

1.4. Next meeting

   The next meeting is planned for 14 April 2026.

   JWL gives regrets. AP is at risk.

1.5. Review of open action items [3/10]

     * [ ] QT4CG-143-02: MK to try to recover the ability to extract
       formal equivalences into tests
     * [ ] QT4CG-144-01: MK to consider if any now lost value comparisons
       should be added as examples.
     * [X] QT4CG-150-01: NW to ask Jirka for a room at XML Prague for
       Tuesday/Wednesday
          + Done.
     * [ ] QT4CG-150-04: NW to see about a status update on PR #2345;
       possibly schedule discussion
     * [ ] QT4CG-156-01: MK: add reference to data model in F&O 9.2
     * [ ] QT4CG-156-03: MK to revise PR #2516 in light of the comments.
     * [X] QT4CG-157-01: CG to consider the issue of such empty
       directories
     * [X] QT4CG-157-02: CG to propose an editorial change to use the
       fos:notes construct for the Notes. Also relevant to #2546
     * [ ] QT4CG-158-01: MK to revisit the Conformance section to revise
       in light of #2556 error changes
     * [ ] QT4CG-158-02: MK to add system-properties() keys for file and
       binary support

1.6. Review of open pull requests and issues

   This section summarizes all of the issues and pull requests that need
   to be resolved before we can finish. See [25]Technical Agenda below for
   the focus of this meeting.

1.6.1. substantive PRs

   The following substantive PRs were open when this agenda was prepared.
     * PR [26]#2572: 2312 Drop map:keys-where
     * PR [27]#2570: 2553 File Module: delete empty directories
     * PR [28]#2566: 1979 Records with type annotations

2. Technical agenda

2.1. PR #2566: 1979 Records with type annotations

   See PR [29]#2566.

   MK introduces the PR; it's not ready for merging but there are some
   open issues to discuss.
     * MK: This started with the desire to report static errors on records
       if you use fields inappropriately.
          + ... My first attempt introduced some static type checking; but
            that's the thin edge of a very large wedge.
          + ... What happens if we handle records differently from maps?
          + ... Then we can make it an error to attemp to get a field that
            isn't in the type.
          + ... For that, we need to make records a subset of maps (a
            separate type).

   MK begins with the data model.
     * MK: A record is a map item who's keys and values are constrained by
       a record type definition.
          + ... Records get added to the type hierarchy diagram
          + ... Records now have a type annotation, so we have to tweak
            the definition of "type annotation".
          + ... New section, 8.3 Records
               o ... The get and put operations on records are constrained
                    # ... CG proposes that map:put and map:get should
                      respect substitutability and we need new operators
               o ... Not mentioned here, records no longer define optional
                 fields
                    # ... That means you don't have to consider the
                      difference between a missing field and a field with
                      a value that is the empty sequence

   Next, the XQuery spec.
     * MK: Records and record types have a definition.
          + ... And we need a definition of instance of.
          + ... What I've done is still based on the content of the
            record. (So a map matches if it satisfies the constraints;
            rather than checking the type annotation.)
          + ... But instance of, where we have it elsewhere, tends to be
            based on the type annotations.
          + ... Using this formulation, avoids complications in XSLT for
            matching.
          + ... If there's a constructor function for the record type,
            then it does so by invoking the coercion mechanism.
          + ... Record types may be named or anonymous.
          + ... There are record types defined in the fn: namespace.
     * MK: The binary tree example changes because the fields are no
       longer optional, but they may be empty.
     * MK: The subtyping rules change because there's no longer the
       concept of optional fields.
          + ... They're still structural. This might be impacted if we
            based types on the names.
     * MK: Looking at the coercion rules...
          + ... A map J is converted to a record R.
          + ... For every field declaration, the record will contain an
            entry for that field.
          + ... Extra fields are discarded.
     * MK: Lookup expressions change to return a type error because
       they're based on map:get()
          + ... But you don't get the error for path expressions because
            historically they don't give errors if they don't exist.
     * MK: Not allowing optional fields simplifies things.

   In Functions and Operators:
     * MK: It's basically changes to individual functions.
          + ... Optional fields (in, for example, parse-uri, are no longer
            optional, they're only emptiable)
          + ... These changes are all a consequence of basic model
            changes.

   Discussion:
     * NW: What about map:merge and other features that combine maps?
     * MK: Those functions return maps.
     * JLO: I wouldn't want to confine things.

2.2. What about get and put?

     * CG: I proposed in one of the previous issues to allow map:get and
       map:put and raise errors.
          + ... I think it could be interesting to have map:put always
            return a map.
               o ... But we could add a with keyword to explicitly modify
                 record entries.
          + ... For map:get I think it makes sense.
          + ... Removing optional and emptiable record types makes a lot
            of sense.
     * JLO: I agree, merging these feels much better.
     * AP: We were talking about having the lookup operator being
       different from map:get. Why would that be?
     * MK: It is currently equivalent, but it is the most common way of
       doing access to a statically named field of a record. Wheras, you
       tend not to use that when the key is dynamically calculated; that's
       where map:get is used. So having them be equivalent doesn't make
       perfect sense with usage patterns.
     * AP: There could be some surprise to see the difference. That will
       have to be spec'd carefully.
     * WP: A few examples would be good.
     * MK: I'll try to work through making the lookup operator and map:get
       distinct.
          + ... And I'll try to incorporate the proposed with operator...

2.3. What about instance of?

     * CG: If we changed the semantics, would it be limited to named
       records?
     * MK: I don't think so.
          + ... There is a question about whether you change the subtyping
            rules. If you change those to be based on naming, then you'd
            have to introduce the "extends" concept to say that one record
            type is a subtype of another and base it on that.
     * MK: I'm slightly unsure, but I think you could move to type
       annotation based instance of, but still do a structural comparison
       for subtyping.
          + ... You can say that a record is a complex number because it
            was instantiated that way...but does that make it an instance
            of a subtype?
     * MK: We also need to think through how to do XSLT pattern matching.
     * NW: I think the structural comparison is fine; is there something
       I'm missing?
     * MK: It's more of an intuition; if a thing is labeled with a type,
       we use that for instance of elsewhere.
          + ... I don't think what I've done is unworkable.
     * JLO: If instance of is based on named types, could this be cascade?
       If something doesn't have the type label, would it also be an
       instance of?
     * MK: No, it wouldn't be an instance of, but it would match in some
       looser sense.
          + ... I've sometimes been tempted to add "coerciable as"!
     * JLO: How about two separate definitions of the same shape but both
       are anonymous; are those then instance of each other?
     * MK: Only if we have structural typing, or if we have syntax for
       declaring a type hierarchy of named record types.

   The group offers general encouragement to MK to press on!
     * WP: I'm not sure that we need named based typing; we should
       leverage what we have. Stricter typing down deep is nice, but
       having more flexibility is also good.
     * MK: One of the primary use cases here has to be JSON processing.
       When we parse JSON, we aren't going to get strictly typed results
       in any sense.
          + ... Those will be maps; we need to make it easy to invoke
            something more strongly typed.

   JLO suggests that Elixir, an Erlang data binding language, for
   exploring JSON data binding.

2.4. PR #2572: 2312 Drop map:keys-where

   See PR [30]#2572.

   MK introduces the PR. "You either like this or you don't."
     * MK: Motivated by an issue that CG has raised about having too many
       ways to do things.
          + ... I thought we could get rid of this one, but CG says no,
            this is the one he wants!
     * MK: All the proposal does is drop it.

   MK reviews the rational in [31]the PR. There are about four ways to do
   it without map:keys-where.
     * CG: That's fine to me. It was meant to be symmetric with
       index-where which we might also be able to do in several ways. It's
       not obvious to use this function.
     * NW: That's my thinking; I'd probably do something else before I
       remembered that fn:keys-where exists.

   Proposal: accept this PR.

   Accepted.

2.5. PR #2570: 2553 File Module: delete empty directories

   See PR [32]#2570.

   CG introduces the PR.
     * CG: What should you do with file:delete if you pass an empty
       directory without the recursive option.
     * JLO: Even though it clarifies what the current spec says; I'd
       prefer to say the recursive flag is always required.

   Proposal: accept this PR.

   Accepted.

3. Any other business

     * NW: Show of hands, who thinks they'll attend the face-to-face
       meeting before XML Prague?

   About six hands went up.
     * DB: Can we avoid a scheduling conflict with XProc?
     * NW: Alas no.

References

   1. https://qt4cg.org/meeting/minutes/
   2. https://qt4cg.org/
   3. https://qt4cg.org/dashboard
   4. https://github.com/qt4cg/qtspecs/issues
   5. https://github.com/qt4cg/qtspecs/pulls
   6. https://qt4cg.org/meeting/minutes/2026/04-07.html#new-actions
   7. https://qt4cg.org/meeting/minutes/2026/04-07.html#minutes
   8. https://qt4cg.org/meeting/minutes/2026/04-07.html#administrivia
   9. https://qt4cg.org/meeting/minutes/2026/04-07.html#roll-call
  10. https://qt4cg.org/meeting/minutes/2026/04-07.html#agenda
  11. https://qt4cg.org/meeting/minutes/2026/04-07.html#approve-minutes
  12. https://qt4cg.org/meeting/minutes/2026/04-07.html#next-meeting
  13. https://qt4cg.org/meeting/minutes/2026/04-07.html#open-actions
  14. https://qt4cg.org/meeting/minutes/2026/04-07.html#open-pull-requests
  15. https://qt4cg.org/meeting/minutes/2026/04-07.html#substantive
  16. https://qt4cg.org/meeting/minutes/2026/04-07.html#technical-agenda
  17. https://qt4cg.org/meeting/minutes/2026/04-07.html#pr-2566
  18. https://qt4cg.org/meeting/minutes/2026/04-07.html#get-and-put
  19. https://qt4cg.org/meeting/minutes/2026/04-07.html#instance-of
  20. https://qt4cg.org/meeting/minutes/2026/04-07.html#pr-2572
  21. https://qt4cg.org/meeting/minutes/2026/04-07.html#pr-2570
  22. https://qt4cg.org/meeting/minutes/2026/04-07.html#any-other-business
  23. https://qt4cg.org/meeting/agenda/2026/04-07.html
  24. https://qt4cg.org/meeting/minutes/2026/03-31.html
  25. https://qt4cg.org/meeting/minutes/2026/04-07.html#technical-agenda
  26. https://qt4cg.org/dashboard/#pr-2572
  27. https://qt4cg.org/dashboard/#pr-2570
  28. https://qt4cg.org/dashboard/#pr-2566
  29. https://qt4cg.org/dashboard/#pr-2566
  30. https://qt4cg.org/dashboard/#pr-2572
  31. https://qt4cg.org/dashboard/#pr-2572
  32. https://qt4cg.org/dashboard/#pr-2570

                                        Be seeing you,
                                          norm

--
Norm Tovey-Walsh
CEO, Saxonica

Received on Tuesday, 7 April 2026 16:47:38 UTC