From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Schulte Subject: Re: [Bug] #+call does not respect :colnames argument Date: Fri, 26 Jul 2013 11:53:33 -0600 Message-ID: <87vc3xgqa5.fsf@gmail.com> References: <1e44d3b3697f439e425399908547d946@mail.rickster.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:42024) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V2mGm-000279-Pt for emacs-orgmode@gnu.org; Fri, 26 Jul 2013 13:57:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V2mGk-0006Gb-O4 for emacs-orgmode@gnu.org; Fri, 26 Jul 2013 13:57:36 -0400 Received: from mail-pb0-x231.google.com ([2607:f8b0:400e:c01::231]:48221) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V2mGk-0006Fz-C4 for emacs-orgmode@gnu.org; Fri, 26 Jul 2013 13:57:34 -0400 Received: by mail-pb0-f49.google.com with SMTP id jt11so2304515pbb.22 for ; Fri, 26 Jul 2013 10:57:33 -0700 (PDT) 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 --=-=-= Content-Type: text/plain Rick Frankel writes: > Eric- > > I have debugged why the :colnames argument is not respected as to > removing the header from a table var. > > * Given > #+name: with-hline > | A | B | C | > |---+---+---| > | 1 | 2 | 3 | > | 4 | 5 | 6 | > > #+name: with-hline2 > | B | C | D | > |---+---+---| > | 2 | 3 | 4 | > | 5 | 6 | 7 | > > #+name: emacs-echo > #+BEGIN_SRC emacs-lisp :var table=with-hline :colnames yes > (mapcar (lambda (x) (mapcar '1+ x)) table) > #+END_SRC > > #+call: emacs-echo(table=with-hline2)[:colnames yes] > > * Evaluation > When the `#+call' line is executed, `org-babel-process-params' is > called multiple times. When it is called the last time to process > the actual input (here, calling =emacs-echo= with the param > =with-hline2=), the `:colname-names' parameter has already been (to > =(table "A" "B" "C")=, taken from the variable in the source blocks > header) as a side-effect of the call to > `org-babel-get-src-block-info'. So, when the block is executed later > in the function, then next call to `org-babel-process-params' does > not call disassemble table (taking into account the value of > `:colnames') but uses =processed-vars= directly instead, causing the > full > table to be used without calling `org-babel-disassemble-tables'. > > Here's the relevant section of code from `org-babel-process-params': > > #+BEGIN_SRC emacs-lisp > (if (and (assoc :colname-names params) > (assoc :rowname-names params)) > (list processed-vars) > (org-babel-disassemble-tables > processed-vars > (cdr (assoc :hlines params)) > (cdr (assoc :colnames params)) > (cdr (assoc :rownames params)))) > #+END_SRC > > And here's a cleaned-up debug trace: > > #+BEGIN_EXAMPLE > (list processed-vars) > ;; called again later in execute-src-block, does not properly parse > =with-hline2= var > org-babel-process-params(((:comments . "") (:shebang . "") (:cache . > "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . > "results") (:results . "silent") (:var . "table=with-hline2") (:hlines . > "yes") (:padnewline . "yes") (:session . "none") (:colnames . "yes") > (:result-type . value) (:result-params "replace") (:rowname-names) > (:colname-names (table "A" "B" "C")))) > ;; calls disassemble-tables and returns with :colname-names set > org-babel-process-params(((:comments . "") (:shebang . "") (:cache . > "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . > "results") (:results . "replace") (:var . "table=with-hline") (:colnames > . "yes") (:session . "none") (:padnewline . "yes") (:hlines . "yes"))) > org-babel-get-src-block-info() > org-babel-execute-src-block(nil nil ((:var . "table=with-hline2") > (:results . "silent"))) > org-babel-ref-resolve("emacs-echo(table=with-hline2)[:colnames yes]") > org-babel-ref-parse("results=emacs-echo(table=with-hline2)[:colnames > yes]") > org-babel-process-params(((:comments . "") (:shebang . "") (:cache . > "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . > "results") (:results . "replace") (:var . > "results=emacs-echo(table=with-hline2)[:colnames yes]") (:colnames . > "no") (:hlines . "yes") (:padnewline . "yes") (:session . "none"))) > org-babel-lob-execute(("emacs-echo(table=with-hline2)[:colnames yes]" > nil 0 nil)) > #+END_EXAMPLE > > rick Hi Rick, Thanks for taking the time to find the root of this problem. I believe I've fixed this by change the `org-babel-merge-params' function so that when the value of a variable is update, then colname-names and rowname-names values saved for that variable are removed. In my local tests the attached patch fixes this issue. If it works for you as well then I'll apply it. Thanks, --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-delete-colnames-rownames-for-replaced-variables.patch >From e789367e7ec4badd74e9aafb0249aa8798842f65 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Fri, 26 Jul 2013 11:48:51 -0600 Subject: [PATCH] delete colnames/rownames for replaced variables Thanks to Rick Frankel for help debugging this problem. * lisp/ob-core.el (org-babel-merge-params): When merging parameters, if a variable is replaced with a new value, then delete colnames/rownames for the original value of that variable. --- lisp/ob-core.el | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index b213c2a..c2722db 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -2269,7 +2269,8 @@ parameters when merging lists." new-params)) result-params) output))) - params results exports tangle noweb cache vars shebang comments padline) + params results exports tangle noweb cache vars shebang comments padline + clearnames) (mapc (lambda (plist) @@ -2286,21 +2287,25 @@ parameters when merging lists." (setq vars (append (if (member name (mapcar #'car vars)) - (delq nil - (mapcar - (lambda (p) - (unless (equal (car p) name) p)) - vars)) + (progn + (push name clearnames) + (delq nil + (mapcar + (lambda (p) + (unless (equal (car p) name) p)) + vars))) vars) (list (cons name pair)))) ;; if no name is given and we already have named variables ;; then assign to named variables in order (if (and vars (nth variable-index vars)) - (prog1 (setf (cddr (nth variable-index vars)) - (concat (symbol-name - (car (nth variable-index vars))) - "=" (cdr pair))) - (incf variable-index)) + (let ((name (car (nth variable-index vars)))) + (push name clearnames) ; clear out colnames + ; and rownames + ; for replace vars + (prog1 (setf (cddr (nth variable-index vars)) + (concat (symbol-name name) "=" (cdr pair))) + (incf variable-index))) (error "Variable \"%s\" must be assigned a default value" (cdr pair)))))) (:results @@ -2347,6 +2352,19 @@ parameters when merging lists." plists) (setq vars (reverse vars)) (while vars (setq params (cons (cons :var (cddr (pop vars))) params))) + ;; clear out col-names and row-names for replaced variables + (mapc + (lambda (name) + (mapc + (lambda (param) + (setf (cdr (assoc param params)) + (remove-if (lambda (pair) (equal (car pair) name)) + (cdr (assoc param params)))) + (setf params (remove-if (lambda (pair) (and (equal (car pair) param) + (null (cdr pair)))) + params))) + (list :colname-names :rowname-names))) + clearnames) (mapc (lambda (hd) (let ((key (intern (concat ":" (symbol-name hd)))) -- 1.8.3.3 --=-=-= Content-Type: text/plain -- Eric Schulte http://cs.unm.edu/~eschulte --=-=-=--