emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Eric Schulte <schulte.eric@gmail.com>
To: Rick Frankel <rick@rickster.com>
Cc: emacs-orgmode <emacs-orgmode@gnu.org>,
	Eric Schulte <schulte.eric@gmail.com>
Subject: Re: [BUG] :colnames not applied to #+call input
Date: Wed, 03 Jul 2013 11:23:03 -0600	[thread overview]
Message-ID: <87d2qzo8w8.fsf@gmail.com> (raw)
In-Reply-To: <7280541f4853fd4d21eeb275148fc4e8@mail.rickster.com> (Rick Frankel's message of "Tue, 02 Jul 2013 10:32:07 -0400")

Currently colnames are not used for emacs-lisp code blocks (for
historical reasons).  Unfortunately, call lines are executed by
expanding first to a trivial emacs-lisp code block, which is then run to
collect and possibly re-package the results of the called function.
Thus colnames do not work well in call lines.

I think the best solution here is to add colnames support to Emacs Lisp
code blocks.  I can put this on my Org-mode queue, but can't promise to
get to it any time soon.

Cheers,

Rick Frankel <rick@rickster.com> writes:

> On 2013-06-30 19:21, Eric Schulte wrote:
>> Rick Frankel <rick@rickster.com> writes:
>> 
>> it seems that the :colnames header is not being respected on parsing 
>> the
>> input
>> to a `#+call:' line containing arguments, but is being applied to the
>> output!
>> 
>> For example:
>> 
>> #+BEGIN_SRC org
>> * Identity
>> #+name: table
>> | a | b | c |
>> |---+---+---|
>> | 1 | 2 | 3 |
>> 
>> #+name: identity
>> #+BEGIN_SRC emacs-lisp :var table=table :colnames yes
>> (mapcar 'identity table)
>> #+END_SRC
>> 
>> Emacs Lisp handles the :colnames header argument differently than other
>> languages, hence the "Note that the behavior of the ':colnames' header
>> argument may differ across languages." phrase in the manual.  If you
>> remove ":colnames yes" from the emacs-lisp code block in your example
>> everything should work fine.
>
> I understand the differing handling of ':colnames' in different
> langauages, but you "solution" does not address the issue of not being
> able to call the block. It would mean handling the header and
> hline in the called block in all cases. The problem i am addressing is
> that the :colnames argument to the original source block is being
> applied on the reassembly of the output regardless of the value of the
> :colnames argument to the call line. This is a regresssion since 7.9
> (see the 7.9 example at the end of this message). Let's try a
> different example to make the issue clearer.
>
>
> Given the same table, and the method:
>
> #+name: map
> #+BEGIN_SRC emacs-lisp :var table=table :colnames yes
> (mapcar (lambda (row) (mapcar '1+ row)) table)
> #+END_SRC
>
> The results are:
>
> #+RESULTS: map
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
>
>
> If I call the function w/o a table argument i get the same results.
> However, if i try to pass the table argument, i get the following
> errors:
>
> /mapcar: Wrong type argument: number-or-marker-p, "a"/ on:
>
> #+call: map(table=table)
> #+call: map(table=table) :colnames yes
> #+call: map[:colnames yes](table=table) :colnames yes
>
> /Wrong type argument: sequencep, 1/ on:
>
> #+call: map(table=table[2:-1])
>
> (since the (now one row) table is turned into a list.
>
> So there is no way to call this function with a single-row table as an
> argument.
>
> If we have the following table instead:
>
> #+name: table2
> | a | b | c |
> |---+---+---|
> | 1 | 2 | 3 |
> | 4 | 5 | 6 |
>
> we get:
>
> #+name: map2
> #+BEGIN_SRC emacs-lisp :var table=table2 :colnames yes
> (mapcar (lambda (row) (mapcar '1+ row)) table)
> #+END_SRC
>
> #+RESULTS: map2
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
> #+call: map2(x="")
>
> #+RESULTS: map2(x="")
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
> #+call: map(table=table2[2:-1])
>
> #+RESULTS: map(table=table2[2:-1])
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
>
> which looks right, but we shouldn't have any header on the above
> results as we have (supposedly) stripped it from the input with the
> slice).
>
> Here' are the results from 7.9.3f. Note that calling the source block
> with a single row table is still impossible in 7.9, as the slice is
> still turned into a list, and the :colnames argument is also not being
> applied to the input (but is only being applied to the output if
> specified in the call line):
>
> #+name: map2
> #+BEGIN_SRC emacs-lisp :var table=table2 :colnames yes
> (mapcar (lambda (row) (mapcar '1+ row)) table)
> #+END_SRC
>
> #+RESULTS: map2
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
> #+call: map2(x="")
>
> #+RESULTS: map2(x="")
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
> #+call: map2(x="") :colnames yes
>
> #+RESULTS: map2(x=""):colnames yes
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
> #+call: map(table=table2[2:-1])
>
> #+RESULTS: map(table=table2[2:-1])
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
> #+call: map(table=table2[2:-1]) :colnames yes
>
> #+RESULTS: map(table=table2[2:-1]):colnames yes
> | a | b | c |
> |---+---+---|
> | 2 | 3 | 4 |
> | 5 | 6 | 7 |
>
>
>
>

-- 
Eric Schulte
http://cs.unm.edu/~eschulte

  reply	other threads:[~2013-07-03 17:24 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-28 17:23 [BUG] :colnames not applied to #+call input Rick Frankel
2013-06-30 23:21 ` Eric Schulte
2013-07-02 14:32   ` Rick Frankel
2013-07-03 17:23     ` Eric Schulte [this message]
2013-07-09 15:29       ` Rick Frankel

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=87d2qzo8w8.fsf@gmail.com \
    --to=schulte.eric@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=rick@rickster.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).