emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Gavin Downard <gavin.downard@runbox.com>
To: Max Nikulin <manikulin@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: [PATCH] lisp/org-table.el: Allow named columns on lhs
Date: Wed, 26 Jul 2023 14:50:21 -0700	[thread overview]
Message-ID: <87pm4exobn.fsf@runbox.com> (raw)
In-Reply-To: <8b17c390-4aa7-f988-aa9c-54479b8b4461@gmail.com>

Max Nikulin <manikulin@gmail.com> writes:
> The regexp for parsing formulas does not allow named references after @.
> I have no idea if other code should be modified as well. I consider it
> as more important than detection of duplicated definitions.

Yeah, besides changing the regexp, the main thing that will need to be
changed is the interface of `org-table-get-stored-formulas'. Currently,
a field name on the lhs can only exist by itself (that is, it can't be a
part of any other expression, such as a range), so the leading '$' is
removed. So, '$name=1+2' is parsed as '("name" . "1+2")'. This is at
odds with field/column names in the middle of an expression.

I think the best way to do this is to change
`org-table-get-stored-formulas' to not strip the leading '$', and
instead of using '(assoc FIELD-NAME org-table-named-field-locations)' or
'(assoc COL-NAME org-table-column-names)', we can a modified* version of
`org-table-formula-substitute-names' (which is used for field and column
names on the rhs of a formula). That would work as a replacement for the
existent handling of field names that would also work for column names
as we want them.

As a side note, this would allow ranges on the lhs that contain field
names in them:

|   |     1 | 2 |   3 |
| # |       |   |     |
| ^ | begin |   | end |
#+TBLFM: $begin..$end=@1*@1

(*): the issue with `org-table-formula-substitute-names' as it is, is
that it will replace field names with the field /value/, not the field
index. Hopefully modifying the function to replace field names with
their indices won't break anything, so we can use the same function for
both sides of the formula.

> A crazy idea: several columns may have the same name:
>
> |   | Jun sum | Jun count | Jun avg | Jul sum | Jul count | Jul avg |
> | ! |         |           | average |         |           | average |
> |---+---------+-----------+---------+---------+-----------+---------|
> |   |  150    | 10        |         | 200     |        14 |         |
>
> #+tblfm: $average=$-2/$-1
>
> It has no sense for numeric references but with names it can help to
> avoid repeated expressions.

Or, if you want to get really crazy, we can let fields and columns with
the same name share a formula. :)

| ! | Apple budget |  Pear Budget | Orange Budget |         total |
|---+--------------+--------------+---------------+---------------|
| # |            1 |            2 |             3 |             6 |
| # |            4 |            5 |             6 |            15 |
|---+--------------+--------------+---------------+---------------|
| # |            2 |            3 |             5 |            26 |
| ^ | extra-cost-1 | extra-cost-2 |         total | ultimatetotal |
#+TBLFM: $total=vsum($<<..$-1) :: $ultimatetotal=vsum(@I..II) + $-1

But in all seriousness, that does seem like it could be useful. I guess
on the rhs we could give each of those "shared names" the value of an array of
that name's connected columns (or fields). But I think support for that should
probably be added in a separate patch, since it's a bit separate from
the main issue.


  reply	other threads:[~2023-07-26 23:17 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-19  2:36 [PATCH] lisp/org-table.el: Allow named columns on lhs Gavin Downard
2023-07-19  7:44 ` Ihor Radchenko
2023-07-21 15:15   ` Max Nikulin
2023-07-21 18:33     ` Gavin Downard
2023-07-22  2:12       ` Max Nikulin
2023-07-22  7:25         ` Ihor Radchenko
2023-07-22 13:16           ` Max Nikulin
2023-07-22 13:25             ` Ihor Radchenko
2023-07-22 12:45 ` Max Nikulin
2023-07-22 18:21   ` Gavin Downard
2023-07-23  6:50     ` Ihor Radchenko
2023-07-24  3:25       ` Gavin Downard
2023-07-24  7:23         ` Ihor Radchenko
2023-07-24 15:17 ` Max Nikulin
2023-07-24 20:29   ` Gavin Downard
2023-07-25 15:01     ` Max Nikulin
2023-07-26 21:50       ` Gavin Downard [this message]
2023-07-27  7:36         ` Ihor Radchenko
2023-08-29  9:58 ` Ihor Radchenko
2023-08-31 14:19   ` Gavin Downard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87pm4exobn.fsf@runbox.com \
    --to=gavin.downard@runbox.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=manikulin@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).