emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] [BUG] :colnames not applied to #+call input


From: Rick Frankel
Subject: Re: [O] [BUG] :colnames not applied to #+call input
Date: Tue, 02 Jul 2013 10:32:07 -0400
User-agent: Roundcube Webmail/0.9.0

On 2013-06-30 19:21, Eric Schulte wrote:
Rick Frankel <address@hidden> 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 |







reply via email to

[Prev in Thread] Current Thread [Next in Thread]