From mboxrd@z Thu Jan 1 00:00:00 1970 From: Achim Gratz Subject: [PATCH] do not use mapcar* for transposing tables Date: Fri, 21 Jun 2013 22:48:05 +0200 Message-ID: <87k3ln8a2i.fsf@Rainer.invalid> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:58794) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uq8Fr-0008NJ-NX for emacs-orgmode@gnu.org; Fri, 21 Jun 2013 16:48:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uq8Fq-0003Ee-6y for emacs-orgmode@gnu.org; Fri, 21 Jun 2013 16:48:23 -0400 Received: from plane.gmane.org ([80.91.229.3]:37155) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uq8Fq-0003EQ-0y for emacs-orgmode@gnu.org; Fri, 21 Jun 2013 16:48:22 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1Uq8Fo-0002FU-Am for emacs-orgmode@gnu.org; Fri, 21 Jun 2013 22:48:20 +0200 Received: from pd9eb5b3a.dip0.t-ipconnect.de ([217.235.91.58]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 21 Jun 2013 22:48:20 +0200 Received: from Stromeko by pd9eb5b3a.dip0.t-ipconnect.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 21 Jun 2013 22:48:20 +0200 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: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain I've recently stumbled over a mapcar* compiled into Org for transposing tables. This is a function from cl / cl-lib and should not be used at runtime. Since we can make some simplifying assumptions about the data we'll have to deal with, re-implmenting the two uses with plain mapcar was (relatively) painless. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-do-not-use-mapcar-for-transposing-tables.patch >From 8941eb1f7ed2a7f1164a92a957a53560127cc26f Mon Sep 17 00:00:00 2001 From: Achim Gratz Date: Fri, 21 Jun 2013 22:37:51 +0200 Subject: [PATCH] do not use mapcar* for transposing tables * lisp/ob-core.el (org-babel-get-rownames), lisp/org-table.el (org-table-transpose-table-at-point): Replace the inadvertent use of mapcar* (from cl) by plain mapcar and direct cons manipulation. The error was not caught at compilation time since both source files require cl during compilation for using cl macros. These were the only uses of mapcar* in Org, but I didn't check for other cl _functions_ (as opposed to macros, which would need to be checked if their implementation uses cl functions). --- lisp/ob-core.el | 28 ++++++++++++---------------- lisp/org-table.el | 15 ++++++++++----- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index e2cb03b..a22a696 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -1502,22 +1502,18 @@ (defun org-babel-get-colnames (table) (defun org-babel-get-rownames (table) "Return the row names of TABLE. Return a cons cell, the `car' of which contains the TABLE less -colnames, and the `cdr' of which contains a list of the column -names. Note: this function removes any hlines in TABLE." - (let* ((trans (lambda (table) (apply #'mapcar* #'list table))) - (width (apply 'max - (mapcar (lambda (el) (if (listp el) (length el) 0)) table))) - (table (funcall trans (mapcar (lambda (row) - (if (not (equal row 'hline)) - row - (setq row '()) - (dotimes (n width) - (setq row (cons 'hline row))) - row)) - table)))) - (cons (mapcar (lambda (row) (if (equal (car row) 'hline) 'hline row)) - (funcall trans (cdr table))) - (remove 'hline (car table))))) +rownames, and the `cdr' of which contains a list of the rownames. +Note: this function removes any hlines in TABLE." + (let* ((table (org-babel-del-hlines table)) + (rownames (funcall (lambda () + (let ((tp table)) + (mapcar + (lambda (row) + (prog1 + (pop (car tp)) + (setq tp (cdr tp)))) + table)))))) + (cons table rownames))) (defun org-babel-put-colnames (table colnames) "Add COLNAMES to TABLE if they exist." diff --git a/lisp/org-table.el b/lisp/org-table.el index 9468b2b..243449f 100644 --- a/lisp/org-table.el +++ b/lisp/org-table.el @@ -1870,11 +1870,16 @@ (defun org-table-transpose-table-at-point () Note that horizontal lines disappeared." (interactive) - (let ((contents - (apply #'mapcar* #'list - ;; remove 'hline from list - (delq nil (mapcar (lambda (x) (when (listp x) x)) - (org-table-to-lisp)))))) + (let* ((table (delete 'hline (org-table-to-lisp))) + (contents (mapcar (lambda (p) + (let ((tp table)) + (mapcar + (lambda (rown) + (prog1 + (pop (car tp)) + (setq tp (cdr tp)))) + table))) + (car table)))) (delete-region (org-table-begin) (org-table-end)) (insert (mapconcat (lambda(x) (concat "| " (mapconcat 'identity x " | " ) " |\n" )) contents "")) -- 1.8.3 --=-=-= Content-Type: text/plain Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ SD adaptation for Waldorf rackAttack V1.04R1: http://Synth.Stromeko.net/Downloads.html#WaldorfSDada --=-=-=--