From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Schulte Subject: Re: [BUG] :colnames not applied to #+call input Date: Wed, 03 Jul 2013 11:23:03 -0600 Message-ID: <87d2qzo8w8.fsf@gmail.com> References: <3b90682f4749fc6cd9a5db0981f7f20a@mail.rickster.com> <8761wvkv0b.fsf@gmail.com> <7280541f4853fd4d21eeb275148fc4e8@mail.rickster.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:60943) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UuQnO-0000BK-8t for emacs-orgmode@gnu.org; Wed, 03 Jul 2013 13:24:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UuQnL-0008BH-Aq for emacs-orgmode@gnu.org; Wed, 03 Jul 2013 13:24:46 -0400 Received: from mail-pd0-x234.google.com ([2607:f8b0:400e:c02::234]:55737) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UuQnK-0008AZ-Us for emacs-orgmode@gnu.org; Wed, 03 Jul 2013 13:24:43 -0400 Received: by mail-pd0-f180.google.com with SMTP id 10so290836pdi.25 for ; Wed, 03 Jul 2013 10:24:42 -0700 (PDT) In-Reply-To: <7280541f4853fd4d21eeb275148fc4e8@mail.rickster.com> (Rick Frankel's message of "Tue, 02 Jul 2013 10:32:07 -0400") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Rick Frankel Cc: emacs-orgmode , Eric Schulte 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 writes: > On 2013-06-30 19:21, Eric Schulte wrote: >> Rick Frankel 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