emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
@ 2011-08-29  8:00 Major A
  2011-08-29  8:47 ` Nicolas Goaziou
  2011-08-29  9:05 ` Nick Dokos
  0 siblings, 2 replies; 23+ messages in thread
From: Major A @ 2011-08-29  8:00 UTC (permalink / raw)
  To: emacs-orgmode


Hi,

I'd like to use asymptote to plot the values in an Org table.  The table
has cells with numbers but also cells with strings in them.  This table
gets converted to an array of strings in the resulting asymptote file,
with the strings escaped with double-quotes but not the numbers.  In
asymptote, this is an error, so that no plot is produced.

Here's the code:

  #+data: values
  | 0 | 0 | a |
  | 1 | 1 | b |
  | 2 | 3 | c |
  
  #+begin_src asymptote :file asy.png :var v=values
    size(100);
    draw((0,0)--(1,1));
  #+end_src

The temporary asymptote file created during evaluation or export looks
like this:

  string[][] v={
  {0,0,"a"},
  {1,1,"b"},
  {2,3,"c"}
  };

"asy" complains about this file like this:

  asymptote-12652XAo: 2.2: cannot cast 'int' to 'string'
  asymptote-12652XAo: 2.4: cannot cast 'int' to 'string'
  asymptote-12652XAo: 3.2: cannot cast 'int' to 'string'
  asymptote-12652XAo: 3.4: cannot cast 'int' to 'string'
  asymptote-12652XAo: 4.2: cannot cast 'int' to 'string'
  asymptote-12652XAo: 4.4: cannot cast 'int' to 'string'

Am I doing something wrong here?

I actually need this to work ASAP, so if anyone has any workable
solution, then please let me know.

  András




------------------------------------------------------------------------



Emacs  : GNU Emacs 23.3.1 (i486-pc-linux-gnu, GTK+ Version 2.24.3)
 of 2011-04-10 on raven, modified by Debian
Package: Org-mode version 7.7 (release_7.7.205.gce02a)

current state:
==============
(setq
 org-export-latex-after-initial-vars-hook '(org-beamer-after-initial-vars)
 org-speed-command-hook '(org-speed-command-default-hook org-babel-speed-command-hook)
 org-babel-load-languages '((asymptote . t) (ditaa . t) (dot . t) (gnuplot . t) (haskell . t) (latex . t) (octave . t)
 			  	           (R . t) (ruby . t) (scheme . t) (sh . t))
 org-metaup-hook '(org-babel-load-in-session-maybe)
 org-after-todo-state-change-hook '(org-clock-out-if-current)
 org-babel-tangle-lang-exts '(("ruby" . "rb") ("latex" . "tex") ("haskell" . "hs") ("asymptote" . "asy")
 			    	            ("emacs-lisp" . "el"))
 org-export-blocks-postblock-hook '(org-exp-res/src-name-cleanup)
 org-export-latex-format-toc-function 'org-export-latex-format-toc-default
 org-tab-first-hook '(org-hide-block-toggle-maybe org-src-native-tab-command-maybe org-babel-hide-result-toggle-maybe)
 org-src-mode-hook '(org-src-babel-configure-edit-buffer org-src-mode-configure-edit-buffer)
 org-confirm-shell-link-function 'yes-or-no-p
 org-export-first-hook '(org-beamer-initialize-open-trackers)
 org-agenda-before-write-hook '(org-agenda-add-entry-text)
 org-blank-before-new-entry nil
 org-babel-pre-tangle-hook '(save-buffer)
 org-cycle-hook '(org-cycle-hide-archived-subtrees org-cycle-hide-drawers org-cycle-show-empty-lines
 		  org-optimize-window-after-visibility-change)
 org-export-preprocess-before-normalizing-links-hook '(org-remove-file-link-modifiers)
 org-mode-hook '(#[nil "\300\301\302\303\304$\207" [org-add-hook change-major-mode-hook org-show-block-all append local]
 	          5]
			 #[nil "\300\301\302\303\304$\207"
			          [org-add-hook change-major-mode-hook org-babel-show-result-all append local] 5]
				  		 org-babel-result-hide-spec org-babel-hide-all-hashes)
 org-ctrl-c-ctrl-c-hook '(org-babel-hash-at-point org-babel-execute-safely-maybe)
 org-confirm-elisp-link-function 'yes-or-no-p
 org-export-interblocks '((lob org-babel-exp-lob-one-liners) (src org-babel-exp-inline-src-blocks))
 org-clock-out-hook '(org-clock-remove-empty-clock-drawer)
 org-occur-hook '(org-first-headline-recenter)
 org-from-is-user-regexp nil
 org-export-preprocess-before-selecting-backend-code-hook '(org-beamer-select-beamer-code)
 org-confirm-babel-evaluate nil
 org-export-latex-final-hook '(org-beamer-amend-header org-beamer-fix-toc org-beamer-auto-fragile-frames
 			     			              org-beamer-place-default-actions-for-lists)
 org-metadown-hook '(org-babel-pop-to-session-maybe)
 org-export-blocks '((src org-babel-exp-src-block nil) (comment org-export-blocks-format-comment t)
 		        (ditaa org-export-blocks-format-ditaa nil) (dot org-export-blocks-format-dot nil))
 )

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29  8:00 Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table Major A
@ 2011-08-29  8:47 ` Nicolas Goaziou
  2011-08-29  9:12   ` András Major
  2011-08-29  9:05 ` Nick Dokos
  1 sibling, 1 reply; 23+ messages in thread
From: Nicolas Goaziou @ 2011-08-29  8:47 UTC (permalink / raw)
  To: Major A; +Cc: emacs-orgmode

Hello,

Major A <andras.g.major@gmail.com> writes:

> I'd like to use asymptote to plot the values in an Org table.  The table
> has cells with numbers but also cells with strings in them.  This table
> gets converted to an array of strings in the resulting asymptote file,
> with the strings escaped with double-quotes but not the numbers.  In
> asymptote, this is an error, so that no plot is produced.

I'm not sure to understand. Your array must have all its elements of the
same type. In this case, it detects that common type should be
"string". What else should it do in that case?

That being said, you can have rownames and colnames even in an array of
ints (see :rownames and :colnames headers arguments for your source
block).

In others words, you can plot, for example, the following table without
any problem:

| x | 1 | 2 | 3 |
| y | 1 | 4 | 9 |

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29  8:00 Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table Major A
  2011-08-29  8:47 ` Nicolas Goaziou
@ 2011-08-29  9:05 ` Nick Dokos
  2011-08-29  9:40   ` András Major
  1 sibling, 1 reply; 23+ messages in thread
From: Nick Dokos @ 2011-08-29  9:05 UTC (permalink / raw)
  To: Major A; +Cc: nicholas.dokos, emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 2679 bytes --]

Major A <andras.g.major@gmail.com> wrote:

> 
> Hi,
> 
> I'd like to use asymptote to plot the values in an Org table.  The table
> has cells with numbers but also cells with strings in them.  This table
> gets converted to an array of strings in the resulting asymptote file,
> with the strings escaped with double-quotes but not the numbers.  In
> asymptote, this is an error, so that no plot is produced.
> 
> Here's the code:
> 
>   #+data: values
>   | 0 | 0 | a |
>   | 1 | 1 | b |
>   | 2 | 3 | c |
>  =20
>   #+begin_src asymptote :file asy.png :var v=3Dvalues
>     size(100);
>     draw((0,0)--(1,1));
>   #+end_src
> 
> The temporary asymptote file created during evaluation or export looks
> like this:
> 
>   string[][] v=3D{
>   {0,0,"a"},
>   {1,1,"b"},
>   {2,3,"c"}
>   };
> 
> "asy" complains about this file like this:
> 
>   asymptote-12652XAo: 2.2: cannot cast 'int' to 'string'
>   asymptote-12652XAo: 2.4: cannot cast 'int' to 'string'
>   asymptote-12652XAo: 3.2: cannot cast 'int' to 'string'
>   asymptote-12652XAo: 3.4: cannot cast 'int' to 'string'
>   asymptote-12652XAo: 4.2: cannot cast 'int' to 'string'
>   asymptote-12652XAo: 4.4: cannot cast 'int' to 'string'
> 
> Am I doing something wrong here?
> 

I don't know anything about asymptote and I am not sure whether this
will help: it does produce a temp file with everything quoted and
running asy on the temp file produces an .eps file that contains the
diagonal line, but it produces a png file which seems somewhat peculiar
to me but maybe it'll work for you.

You have to do

(setq org-babel-min-lines-for-block-output 0)

in order to get the example block result.

I just added a python block to produce another table with everything
quoted.  The second table is then give to asymptote:

--8<---------------cut here---------------start------------->8---
#+data: values
| 0 | 0 | a |
| 1 | 1 | b |
| 2 | 3 | c |

#+begin_src python :results output :var table=values
  print "#+data: qvalues"
  for row in table:
      print "|%s|" % ("|".join(map(lambda x: "\"%s\"" % (x), row)))
  
#+end_src

#+results:
#+begin_example
#+data: qvalues
|"0"|"0"|"a"|
|"1"|"1"|"b"|
|"2"|"3"|"c"|
#+end_example

#+begin_src asymptote :file asy.png :var v=qvalues
   size(100);
   draw((0,0)--(1,1));

#+end_src

#+results:
[[file:asy.png]]
--8<---------------cut here---------------end--------------->8---


The temp file looks like this:


--8<---------------cut here---------------start------------->8---
string[][] v={
{"0","0","a"},
{"1","1","b"},
{"2","3","c"}
};
size(100);
draw((0,0)--(1,1));
--8<---------------cut here---------------end--------------->8---

I attach the asy.png file I get.

Nick


[-- Attachment #2: asy.png --]
[-- Type: image/png, Size: 680 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29  8:47 ` Nicolas Goaziou
@ 2011-08-29  9:12   ` András Major
  2011-08-29  9:50     ` Nicolas Goaziou
  0 siblings, 1 reply; 23+ messages in thread
From: András Major @ 2011-08-29  9:12 UTC (permalink / raw)
  To: emacs-orgmode

Hi Nicolas,

> > I'd like to use asymptote to plot the values in an Org table.  The table
> > has cells with numbers but also cells with strings in them.  This table
> > gets converted to an array of strings in the resulting asymptote file,
> > with the strings escaped with double-quotes but not the numbers.  In
> > asymptote, this is an error, so that no plot is produced.
> 
> I'm not sure to understand. Your array must have all its elements of the
> same type. In this case, it detects that common type should be
> "string". What else should it do in that case?
> 
> That being said, you can have rownames and colnames even in an array of
> ints (see :rownames and :colnames headers arguments for your source
> block).
> 
> In others words, you can plot, for example, the following table without
> any problem:
> 
> | x | 1 | 2 | 3 |
> | y | 1 | 4 | 9 |

This isn't what I need.  What I want is to make a graph of certain columns
of a table which contains both ints and strings.  Ideally, there should be
no constraint about which columns contain ints and which contain strings.

Since the table usually comes first (you collect your research in such,
for instance), reformatting afterwards only so that asymptote works is
not an option.

Why isn't it possible to force ob-asymptote to make all cells strings?
Then one could easily convert the strings back to floats or so within
asymptote as needed.

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29  9:05 ` Nick Dokos
@ 2011-08-29  9:40   ` András Major
  0 siblings, 0 replies; 23+ messages in thread
From: András Major @ 2011-08-29  9:40 UTC (permalink / raw)
  To: emacs-orgmode

Hi Nick,

> I don't know anything about asymptote and I am not sure whether this
> will help: it does produce a temp file with everything quoted and
> running asy on the temp file produces an .eps file that contains the
> diagonal line, but it produces a png file which seems somewhat peculiar
> to me but maybe it'll work for you.

Thanks for the example, good idea.  Yes, the diagonal line is OK,
that's what my asymptote example creates, as the code I posted doesn't
actually make use of the array (its mere presence is enough to trigger
the error).

> You have to do
> 
> (setq org-babel-min-lines-for-block-output 0)
> 
> in order to get the example block result.

#+begin_rant

Is it just me, or are there other people who think that this kind of
approach is wrong?  In my view, per-user configuration can affect
the look-and-feel of org-mode, the paths, etc., but I think having
options that affect the result in any way (most babel options, in
fact) should be configurable from within the Org file itself.

After all, most work I do (now in Org) is supposed to be passed
to other people who can then continue doing this work.  I can't
expect them to change "global" settings just so they can reproduce
my output.

I love most software I use exactly because it doesn't rely too
much on global (per-user) configuration.  I think Org should also
reduce the set of global options to the absolute minimum.

#+end_rant

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29  9:12   ` András Major
@ 2011-08-29  9:50     ` Nicolas Goaziou
  2011-08-29 10:42       ` András Major
  0 siblings, 1 reply; 23+ messages in thread
From: Nicolas Goaziou @ 2011-08-29  9:50 UTC (permalink / raw)
  To: András Major; +Cc: emacs-orgmode

András Major <andras.g.major@gmail.com> writes:

> This isn't what I need.  What I want is to make a graph of certain
> columns of a table which contains both ints and strings.  Ideally,
> there should be no constraint about which columns contain ints and
> which contain strings.

Again, this is a limitation of Asymptote. An array _must_ contain
elements of a single type. That beast you want doesn't exist (unless you
typedef it, but then you cannot pass arguments anymore).

> Since the table usually comes first (you collect your research in
> such, for instance), reformatting afterwards only so that asymptote
> works is not an option.

Why? You can always write an intermediary step to "stringify" every
cell. Choose your language. Nick Dokos showed you one way.

> Why isn't it possible to force ob-asymptote to make all cells strings?

It is possible to force ob-asymptote to make all cells strings. But
I don't think ob-asymptote should try that hard to compensate users'
misuses of data types.

Now, I may be totally wrong.

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29  9:50     ` Nicolas Goaziou
@ 2011-08-29 10:42       ` András Major
  2011-08-29 12:50         ` Nicolas Goaziou
  0 siblings, 1 reply; 23+ messages in thread
From: András Major @ 2011-08-29 10:42 UTC (permalink / raw)
  To: emacs-orgmode

> Why? You can always write an intermediary step to "stringify" every
> cell. Choose your language. Nick Dokos showed you one way.

Apparently, only if you set a global/per-user option in .emacs or suchlike,
which I think is a bad way of doing it.

> > Why isn't it possible to force ob-asymptote to make all cells strings?
> 
> It is possible to force ob-asymptote to make all cells strings. But
> I don't think ob-asymptote should try that hard to compensate users'
> misuses of data types.

I don't think this is misuse in any way.  Consider a table which is a
result of your research:  the columns are the maker (e.g., "Mazda"), the
type (e.g., "MX-5"), engine displacement (a number), the mileage/fuel
consumption (a number), etc., and I want to create some asymptote plot
from this data.

If there is no way of doing this without requiring global/per-user
settings, then I think that something must be changed.

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 10:42       ` András Major
@ 2011-08-29 12:50         ` Nicolas Goaziou
  2011-08-29 16:35           ` Nicolas Goaziou
  0 siblings, 1 reply; 23+ messages in thread
From: Nicolas Goaziou @ 2011-08-29 12:50 UTC (permalink / raw)
  To: András Major; +Cc: emacs-orgmode

András Major <andras.g.major@gmail.com> writes:

>> Why? You can always write an intermediary step to "stringify" every
>> cell. Choose your language. Nick Dokos showed you one way.
>
> Apparently, only if you set a global/per-user option in .emacs or suchlike,
> which I think is a bad way of doing it.
-----
#+tblname: mixed-types
|1|x|5|
|3|y|4|

#+source: stringify(table=mixed-types)
#+begin_src emacs-lisp
(concat "string[][] myvar={{"
        (mapconcat
         (lambda (row)
           (when (listp row)
             (concat (mapconcat (lambda (el) (format "\"%s\"" el)) row ",") "}")))
         table
         ",{")
        "};")
#+end_src

#+source: myplot
#+begin_src asymptote :noweb yes :file myplot.png
<<stringify(mixed-types)>>
unitsize(3cm);
draw((0,0)--(1,1));
#+end_src

#+results: myplot
[[file:myplot.png]]
----

It may be ugly, but it works.

> I don't think this is misuse in any way.  Consider a table which is a
> result of your research:  the columns are the maker (e.g., "Mazda"), the
> type (e.g., "MX-5"), engine displacement (a number), the mileage/fuel
> consumption (a number), etc., and I want to create some asymptote plot
> from this data.

How would you would you specify it to Asymptote? You can't.

You would probably use:

                string[][] cars={{"Mazda","MX-5","1.5"}};

And that's exactly my point: engine displacement may be a number, but
you would have to enter it as a string.

Though, you insist on being able to enter it as a number anyway, hoping
ob-asymptote will do the magic behind. How could it, since the language
can't itself?

Perhaps there should be a way in Babel (not specifically in Asymptote)
to output a table with raw strings. Because want you really want to use
is:

|"1"|"x"|"5"|
|"3"|"y"|"4"|


Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 12:50         ` Nicolas Goaziou
@ 2011-08-29 16:35           ` Nicolas Goaziou
  2011-08-29 16:52             ` Eric Schulte
  0 siblings, 1 reply; 23+ messages in thread
From: Nicolas Goaziou @ 2011-08-29 16:35 UTC (permalink / raw)
  To: András Major; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 477 bytes --]

Completing myself.

> Though, you insist on being able to enter it as a number anyway,
> hoping ob-asymptote will do the magic behind. How could it, since the
> language can't itself?

Actually, the attached patch does that magic: if there's any string in
the table, every cell will be turned into a string and the array will be
of type string.

I still think a more general way would be better. I'll let Eric Schulte
decide what to do about it.

Regards,

-- 
Nicolas Goaziou

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-asymptote-mixed-types-tables-default-to-string-ar.patch --]
[-- Type: text/x-patch, Size: 4165 bytes --]

From 72dfd3c98c535ea595be053fe321e195cd08c070 Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou <n.goaziou@gmail.com>
Date: Mon, 29 Aug 2011 17:24:07 +0200
Subject: [PATCH] ob-asymptote: mixed-types tables default to string arrays

* lisp/ob-asymptote.el (org-babel-asymptote-table-to-array): Require a
new argument TYPE specifying the detected type of array.  If it's a
string array, make sure every element is returned as a string. Also
improve doc-string.
(org-babel-asymptote-var-to-asymptote): Fill new argument.  Small
refactoring.
(org-babel-asymptote-define-type): Rewrite to avoid stopping search at
first float found, as strings have precedence over floats.
---
 lisp/ob-asymptote.el |   50 ++++++++++++++++++++++++++++----------------------
 1 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/lisp/ob-asymptote.el b/lisp/ob-asymptote.el
index 1cf6db4..0e9b449 100644
--- a/lisp/ob-asymptote.el
+++ b/lisp/ob-asymptote.el
@@ -108,23 +108,29 @@ a variable of the same value."
      ((stringp val)
       (format "string %S=\"%s\";" var val))
      ((listp val)
-      (let* ((dimension-2-p (not (null (cdr val))))
+      (let* ((dimension-2-p (cdr val))
              (dim (if dimension-2-p "[][]" "[]"))
              (type (org-babel-asymptote-define-type val))
              (array (org-babel-asymptote-table-to-array
-                     val
+                     val type
                      (if dimension-2-p '(:lstart "{" :lend "}," :llend "}")))))
         (format "%S%s %S=%s;" type dim var array))))))
 
-(defun org-babel-asymptote-table-to-array (table params)
-  "Convert values of an elisp table into a string of an asymptote array.
+(defun org-babel-asymptote-table-to-array (table type params)
+  "Convert values of TABLE into a string of an asymptote array.
+
+TABLE is a list whose atoms are assumed to be of type
+TYPE. PARAMS is a plist of parameters that can influence the
+conversion.
+
 Empty cells are ignored."
   (labels ((atom-to-string (table)
                            (cond
                             ((null table) '())
                             ((not (listp (car table)))
-                             (cons (if (and (stringp (car table))
-                                            (not (string= (car table) "")))
+                             (cons (if (or (eq type 'string)
+                                           (and (stringp (car table))
+                                                (not (string= (car table) ""))))
                                        (format "\"%s\"" (car table))
                                      (format "%s" (car table)))
                                    (atom-to-string (cdr table))))
@@ -140,22 +146,22 @@ Empty cells are ignored."
 
 (defun org-babel-asymptote-define-type (data)
   "Determine type of DATA.
-DATA is a list. Type symbol is returned as 'symbol. The type is
-usually the type of the first atom encountered, except for arrays
-of int, where every cell must be of int type."
-  (labels ((anything-but-int (el)
-                             (cond
-                              ((null el) nil)
-                              ((not (listp (car el)))
-                               (cond
-                                ((floatp (car el)) 'real)
-                                ((stringp (car el)) 'string)
-                                (t
-                                 (anything-but-int (cdr el)))))
-                              (t
-                               (or (anything-but-int (car el))
-                                   (anything-but-int (cdr el)))))))
-    (or (anything-but-int data) 'int)))
+
+DATA is a list.  Return type as a symbol.
+
+The type is `string' if any element in DATA is
+a string. Otherwise, it is either `float', if some elements are
+floats, or `int'."
+  (let* ((type 'int)
+	 (find-type
+	  (lambda (row)
+	    (catch 'exit
+	      (mapc (lambda (el)
+		      (cond ((listp el) (funcall find-type el))
+			    ((stringp el) (throw 'exit (setq type 'string)))
+			    ((floatp el) (setq type 'float))))
+		    row)))))
+    (funcall find-type data) type))
 
 (provide 'ob-asymptote)
 
-- 
1.7.6.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 16:35           ` Nicolas Goaziou
@ 2011-08-29 16:52             ` Eric Schulte
  2011-08-29 17:27               ` Nicolas Goaziou
  0 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-08-29 16:52 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: András Major, emacs-orgmode

Nicolas Goaziou <n.goaziou@gmail.com> writes:

> Completing myself.
>
>> Though, you insist on being able to enter it as a number anyway,
>> hoping ob-asymptote will do the magic behind. How could it, since the
>> language can't itself?
>
> Actually, the attached patch does that magic: if there's any string in
> the table, every cell will be turned into a string and the array will be
> of type string.
>
> I still think a more general way would be better. I'll let Eric Schulte
> decide what to do about it.
>

I don't know asymptote well enough to know if you would /always/ want a
heterogeneous table to be converted to all strings, or if there would
ever be a case where you would want mixed types in a table.  If a later
then perhaps this behavior should be tucked behind a header argument,
e.g., :mixed-table-all-strings (or somesuch) which could default to
either true or false depending on which use cases is more common.

Let me know which would be most useful and least surprising and I'll
gladly apply the patch.

Thanks -- Eric

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 16:52             ` Eric Schulte
@ 2011-08-29 17:27               ` Nicolas Goaziou
  2011-08-29 18:02                 ` Eric Schulte
  0 siblings, 1 reply; 23+ messages in thread
From: Nicolas Goaziou @ 2011-08-29 17:27 UTC (permalink / raw)
  To: Eric Schulte; +Cc: András Major, emacs-orgmode

Hello,

Eric Schulte <schulte.eric@gmail.com> writes:

> I don't know asymptote well enough to know if you would /always/ want a
> heterogeneous table to be converted to all strings, or if there would
> ever be a case where you would want mixed types in a table.

There are no mixed types arrays in Asymptote, hence the problem of the
OP. You can choose between int[][], real[][] or string[][] (and other
types specific to Asymptote and, as such, irrelevant here), but you
never want an heterogeneous table.

So, the real question is: what should Org do when an user tries to fit
a mixed array into an Asymptote var? Until now, it was throwing an
error. With this patch, _one_ string in the table will trigger the
string type for every other cell.

But this kind of an hidden feature. The user has to be aware that, under
some circumstances, ints in his table will become strings.

On the other hand, an user knowing he can't mix types in Asymptote (as
he should) can't do much about it, as far as I know.

As I said in this thread, an elegant solution would be to have a way to
specify Babel to output tables of strings easily:

| x | "1" | "2" | "3" |
| y | "1" | "4" | "9" |

That would be the less surprising, as the user would get the type he
sees in his table.


Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 17:27               ` Nicolas Goaziou
@ 2011-08-29 18:02                 ` Eric Schulte
  2011-08-29 18:50                   ` András Major
  0 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-08-29 18:02 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: András Major, emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1907 bytes --]

Nicolas Goaziou <n.goaziou@gmail.com> writes:

> Hello,
>
> Eric Schulte <schulte.eric@gmail.com> writes:
>
>> I don't know asymptote well enough to know if you would /always/ want a
>> heterogeneous table to be converted to all strings, or if there would
>> ever be a case where you would want mixed types in a table.
>
> There are no mixed types arrays in Asymptote, hence the problem of the
> OP. You can choose between int[][], real[][] or string[][] (and other
> types specific to Asymptote and, as such, irrelevant here), but you
> never want an heterogeneous table.
>
> So, the real question is: what should Org do when an user tries to fit
> a mixed array into an Asymptote var? Until now, it was throwing an
> error. With this patch, _one_ string in the table will trigger the
> string type for every other cell.
>
> But this kind of an hidden feature. The user has to be aware that, under
> some circumstances, ints in his table will become strings.
>
> On the other hand, an user knowing he can't mix types in Asymptote (as
> he should) can't do much about it, as far as I know.
>
> As I said in this thread, an elegant solution would be to have a way to
> specify Babel to output tables of strings easily:
>
> | x | "1" | "2" | "3" |
> | y | "1" | "4" | "9" |
>
> That would be the less surprising, as the user would get the type he
> sees in his table.
>

Given that asymptote can not make use of heterogeneous tables, it seems
that it would be easiest to simply silently converted any table
containing a single string element to a table of all strings.  I've just
applied your previous patch (thanks for the patch!).  If this proves
confounding in the future we can always revisit the decision.

Additionally, I've just added a new function to the library of babel
which can be used to convert all elements of a table to strings.  It is
not needed here, but it could be useful in the future.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: all-to-string.org --]
[-- Type: text/x-org, Size: 714 bytes --]

** Convert every element of a table to a string

#+tblname: hetero-table
| 1 | 2 | 3 |
| a | b | c |

#+source: all-to-string
#+begin_src emacs-lisp :var tbl='()
  (defun all-to-string (tbl)
    (if (listp tbl)
        (mapcar #'all-to-string tbl)
      (if (stringp tbl)
          tbl
        (format "%s" tbl))))
  (all-to-string tbl)
#+end_src

#+begin_src emacs-lisp :var tbl=hetero-table
  (mapcar (lambda (row) (mapcar (lambda (cell) (stringp cell)) row)) tbl)
#+end_src

#+results:
| nil | nil | nil |
| t   | t   | t   |

#+begin_src emacs-lisp :var tbl=all-to-string(hetero-table)
  (mapcar (lambda (row) (mapcar (lambda (cell) (stringp cell)) row)) tbl)
#+end_src

#+results:
| t | t | t |
| t | t | t |

[-- Attachment #3: Type: text/plain, Size: 79 bytes --]


Cheers -- Eric

>
>
> Regards,

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 18:02                 ` Eric Schulte
@ 2011-08-29 18:50                   ` András Major
  2011-08-29 19:02                     ` Eric Schulte
  0 siblings, 1 reply; 23+ messages in thread
From: András Major @ 2011-08-29 18:50 UTC (permalink / raw)
  To: emacs-orgmode

Hi Eric,

> Given that asymptote can not make use of heterogeneous tables, it seems
> that it would be easiest to simply silently converted any table
> containing a single string element to a table of all strings.  I've just
> applied your previous patch (thanks for the patch!).  If this proves
> confounding in the future we can always revisit the decision.

I've been away since my last post and now you've already applied a patch
-- wow!  Here's another thought though: change the behaviour of the :var
header argument such that you can specify a range of rows, columns, or
a rectangle just like in table references.  I agree that wildly mixing
cell types in a table should be a felony, but "mixing" them the way I'd
like to makes perfect sense.  You would then simply make more than one
:var to specify multiple subtables, each with its own type.  I think
this might be better than brute-forcing everything to string just so
that the asymptote program has to parse the values back to numbers.

What do you think?

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 18:50                   ` András Major
@ 2011-08-29 19:02                     ` Eric Schulte
  2011-08-29 19:11                       ` Nick Dokos
  2011-08-30 19:12                       ` András Major
  0 siblings, 2 replies; 23+ messages in thread
From: Eric Schulte @ 2011-08-29 19:02 UTC (permalink / raw)
  To: András Major; +Cc: emacs-orgmode

András Major <andras.g.major@gmail.com> writes:

> Hi Eric,
>
>> Given that asymptote can not make use of heterogeneous tables, it seems
>> that it would be easiest to simply silently converted any table
>> containing a single string element to a table of all strings.  I've just
>> applied your previous patch (thanks for the patch!).  If this proves
>> confounding in the future we can always revisit the decision.
>
> I've been away since my last post and now you've already applied a patch
> -- wow!  Here's another thought though: change the behaviour of the :var
> header argument such that you can specify a range of rows, columns, or
> a rectangle just like in table references.

This is already possible, see "Indexable variable values" [1].

> I agree that wildly mixing cell types in a table should be a felony,
> but "mixing" them the way I'd like to makes perfect sense.  You would
> then simply make more than one :var to specify multiple subtables,
> each with its own type.  I think this might be better than
> brute-forcing everything to string just so that the asymptote program
> has to parse the values back to numbers.
>
> What do you think?
>

I must admit by the time I got to this thread is was already many
messages deep, and I haven't read the initial messages, so I don't know
what your way of mixing was, but from my current understanding of
asymptote the behavior implemented by Nick's patch seems to make the
most sense, in that it allows tables of ints and floats, but when a
single string is present it converts the table to all strings.

Best -- Eric

>
>   András
>
>
>


Footnotes: 
[1]  http://orgmode.org/manual/var.html

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 19:02                     ` Eric Schulte
@ 2011-08-29 19:11                       ` Nick Dokos
  2011-08-30 19:12                       ` András Major
  1 sibling, 0 replies; 23+ messages in thread
From: Nick Dokos @ 2011-08-29 19:11 UTC (permalink / raw)
  To: Eric Schulte; +Cc: =?utf-8?Q?Andr=C3=A1s?= Major, nicholas.dokos, emacs-orgmode

Eric Schulte <schulte.eric@gmail.com> wrote:

> András Major <andras.g.major@gmail.com> writes:
> 
> > Hi Eric,
> >
> >> Given that asymptote can not make use of heterogeneous tables, it seems
> >> that it would be easiest to simply silently converted any table
> >> containing a single string element to a table of all strings.  I've just
> >> applied your previous patch (thanks for the patch!).  If this proves
> >> confounding in the future we can always revisit the decision.
> >
> > I've been away since my last post and now you've already applied a patch
> > -- wow!  Here's another thought though: change the behaviour of the :var
> > header argument such that you can specify a range of rows, columns, or
> > a rectangle just like in table references.
> 
> This is already possible, see "Indexable variable values" [1].
> 
> > I agree that wildly mixing cell types in a table should be a felony,
> > but "mixing" them the way I'd like to makes perfect sense.  You would
> > then simply make more than one :var to specify multiple subtables,
> > each with its own type.  I think this might be better than
> > brute-forcing everything to string just so that the asymptote program
> > has to parse the values back to numbers.
> >
> > What do you think?
> >
> 
> I must admit by the time I got to this thread is was already many
> messages deep, and I haven't read the initial messages, so I don't know
> what your way of mixing was, but from my current understanding of
> asymptote the behavior implemented by Nick's patch seems to make the
                                     ^^^Nicolas Goaziou's patch^^^

Nick

> most sense, in that it allows tables of ints and floats, but when a
> single string is present it converts the table to all strings.
> 
> Best -- Eric
> 
> >
> >   András
> >
> >
> >
> 
> 
> Footnotes: 
> [1]  http://orgmode.org/manual/var.html
> 
> -- 
> Eric Schulte
> http://cs.unm.edu/~eschulte/
> 

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-29 19:02                     ` Eric Schulte
  2011-08-29 19:11                       ` Nick Dokos
@ 2011-08-30 19:12                       ` András Major
  2011-08-30 19:34                         ` Eric Schulte
  1 sibling, 1 reply; 23+ messages in thread
From: András Major @ 2011-08-30 19:12 UTC (permalink / raw)
  To: emacs-orgmode

Hi Eric,

> > I've been away since my last post and now you've already applied a patch
> > -- wow!  Here's another thought though: change the behaviour of the :var
> > header argument such that you can specify a range of rows, columns, or
> > a rectangle just like in table references.
> 
> This is already possible, see "Indexable variable values" [1].

Oh, sorry that I missed that.  I'll try it with indexed variables then.
Still the question arises why the syntax here is different from usual
table indexing -- why can't I use something along the lines of
":var t=table(@II$2..@>$4)"?

That would be really really nice.  Would it be hard to implement?

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-30 19:12                       ` András Major
@ 2011-08-30 19:34                         ` Eric Schulte
  2011-08-30 20:45                           ` András Major
  0 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-08-30 19:34 UTC (permalink / raw)
  To: András Major; +Cc: emacs-orgmode

András Major <andras.g.major@gmail.com> writes:

> Hi Eric,
>
>> > I've been away since my last post and now you've already applied a patch
>> > -- wow!  Here's another thought though: change the behaviour of the :var
>> > header argument such that you can specify a range of rows, columns, or
>> > a rectangle just like in table references.
>> 
>> This is already possible, see "Indexable variable values" [1].
>
> Oh, sorry that I missed that.  I'll try it with indexed variables then.
> Still the question arises why the syntax here is different from usual
> table indexing -- why can't I use something along the lines of
> ":var t=table(@II$2..@>$4)"?
>

The table indexing syntax is specifically used for 2-dimensional arrays
while the variable indexing can be used to index into any number of
dimensions.

>
> That would be really really nice.  Would it be hard to implement?
>

It would be nice to be able to use the familiar table syntax in the case
of 2-D arrays.  This shouldn't be hard to implement, the indexing
behavior is defined in the `org-babel-ref-index-list' function which
could be extended to read in org-table type syntax, or it may not be
difficult to write a function which translates the table syntax to the
variable syntax.

Although ultimately it may be simpler just to keep the two separate.

Best -- Eric

>
>   András
>
>
>

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-30 19:34                         ` Eric Schulte
@ 2011-08-30 20:45                           ` András Major
  2011-08-30 20:55                             ` Eric Schulte
  0 siblings, 1 reply; 23+ messages in thread
From: András Major @ 2011-08-30 20:45 UTC (permalink / raw)
  To: emacs-orgmode

Hi Eric,

> >> This is already possible, see "Indexable variable values" [1].

Just tried, without success.  Using the example from my original post,
I appended "[,0]" as per the manual to use the first column only, and
when I execute the code block, org throws an error

  "Wrong type argument: listp, "0"".

Any ideas?

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-30 20:45                           ` András Major
@ 2011-08-30 20:55                             ` Eric Schulte
  2011-08-31  6:48                               ` András Major
  0 siblings, 1 reply; 23+ messages in thread
From: Eric Schulte @ 2011-08-30 20:55 UTC (permalink / raw)
  To: András Major; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 462 bytes --]

András Major <andras.g.major@gmail.com> writes:

> Hi Eric,
>
>> >> This is already possible, see "Indexable variable values" [1].
>
> Just tried, without success.  Using the example from my original post,
> I appended "[,0]" as per the manual to use the first column only, and
> when I execute the code block, org throws an error
>
>   "Wrong type argument: listp, "0"".
>
> Any ideas?
>

Can you post an example?  Here is a working example.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: simple-indexing.org --]
[-- Type: text/x-org, Size: 176 bytes --]

** simple indexing
#+data: list-o-numbers
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |

#+begin_src sh :var column=list-o-numbers[,0]
  echo $column
#+end_src

#+results:
: 1 4 7

[-- Attachment #3: Type: text/plain, Size: 94 bytes --]


Best -- Eric

>
>   András
>
>
>

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-30 20:55                             ` Eric Schulte
@ 2011-08-31  6:48                               ` András Major
  2011-08-31  8:17                                 ` Nick Dokos
  0 siblings, 1 reply; 23+ messages in thread
From: András Major @ 2011-08-31  6:48 UTC (permalink / raw)
  To: emacs-orgmode

Hi Eric,

> Can you post an example?  Here is a working example.

In your example, simply write "asymptote" in place of "sh" and replace the
code by "size(100);" just to make sure it's valid asymptote (though the
error occurs even if you don't).  In fact, I'm quite sure that asy never
gets executed in this case.

  András

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-31  6:48                               ` András Major
@ 2011-08-31  8:17                                 ` Nick Dokos
  2011-08-31  9:35                                   ` Nicolas Goaziou
  0 siblings, 1 reply; 23+ messages in thread
From: Nick Dokos @ 2011-08-31  8:17 UTC (permalink / raw)
  To: =?utf-8?b?QW5kcsOhcw==?= Major; +Cc: nicholas.dokos, emacs-orgmode

András Major <andras.g.major@gmail.com> wrote:

> Hi Eric,
> 
> > Can you post an example?  Here is a working example.
> 
> In your example, simply write "asymptote" in place of "sh" and replace the
> code by "size(100);" just to make sure it's valid asymptote (though the
> error occurs even if you don't).  In fact, I'm quite sure that asy never
> gets executed in this case.
> 

Yes, even without any asymptote code, this breaks. But there seem to be
multiple problems. One is fix-empty-lines, a local routine defines
inside org-babel-asymptote-table-to-array: it seems to assume that the table
is a list of lists, whereas in this case it's a list of strings. The
following patch (which probably is wrong, in that it cures the symptom
rather than the disease):

diff --git a/lisp/ob-asymptote.el b/lisp/ob-asymptote.el
index 89aecb7..39156d2 100644
--- a/lisp/ob-asymptote.el
+++ b/lisp/ob-asymptote.el
@@ -139,7 +139,7 @@ (defun org-babel-asymptote-table-to-array (table type params)
                                    (atom-to-string (cdr table))))))
            ;; Remove any empty row
            (fix-empty-lines (table)
-                            (delq nil (mapcar (lambda (l) (delq "" l)) table))))
+                            (delq nil (mapcar (lambda (l) (if (listp l) (delq "" l) l)) table))))
     (orgtbl-to-generic
      (fix-empty-lines (atom-to-string table))
      (org-combine-plists '(:hline nil :sep "," :tstart "{" :tend "}") params))))


lets things go a bit further, but there is mayhem in orgtbl-format-line,
which is called by orgtbl-format-section, which is called by
orgtbl-to-generic above, and I didn't go any further: I just don't know
what the preconditions are on these routines.

Nick

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-31  8:17                                 ` Nick Dokos
@ 2011-08-31  9:35                                   ` Nicolas Goaziou
  2011-08-31 12:14                                     ` Eric Schulte
  0 siblings, 1 reply; 23+ messages in thread
From: Nicolas Goaziou @ 2011-08-31  9:35 UTC (permalink / raw)
  To: nicholas.dokos; +Cc: András Major, emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1273 bytes --]

Hello,

Nick Dokos <nicholas.dokos@hp.com> writes:

> András Major <andras.g.major@gmail.com> wrote:
>
>> Hi Eric,
>> 
>> > Can you post an example?  Here is a working example.
>> 
>> In your example, simply write "asymptote" in place of "sh" and replace the
>> code by "size(100);" just to make sure it's valid asymptote (though the
>> error occurs even if you don't).  In fact, I'm quite sure that asy never
>> gets executed in this case.
>> 
>
> Yes, even without any asymptote code, this breaks. But there seem to be
> multiple problems. One is fix-empty-lines, a local routine defines
> inside org-babel-asymptote-table-to-array: it seems to assume that the table
> is a list of lists, whereas in this case it's a list of strings. The
> following patch (which probably is wrong, in that it cures the symptom
> rather than the disease):

Yes, the problem is more general: uni-dimensional lists are not handled
correctly.

I attach a patch that should fix the problem (and simplify a lot that
whole process).

One thing, though. Now,

| 1 | 2 |

and (but this was already the case)

| 1 |
| 2 |

are treated as bi-dimensional arrays, because that's how they really are
passed to ob-asymptote.

Regards,

-- 
Nicolas Goaziou

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-asymptote-full-support-for-uni-dimensional-lists.patch --]
[-- Type: text/x-patch, Size: 2172 bytes --]

From 82ae786a8ed1248a62912272edec6f8fa7df4d12 Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou <n.goaziou@gmail.com>
Date: Wed, 31 Aug 2011 11:11:31 +0200
Subject: [PATCH 1/2] ob-asymptote: full support for uni-dimensional lists

* lisp/ob-asymptote.el (org-babel-asymptote-var-to-asymptote):
  recognize non-nested lists as uni-dimensional arrays.
---
 lisp/ob-asymptote.el |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/lisp/ob-asymptote.el b/lisp/ob-asymptote.el
index 89aecb7..f90bb85 100644
--- a/lisp/ob-asymptote.el
+++ b/lisp/ob-asymptote.el
@@ -97,9 +97,8 @@ Asymptote does not support sessions"
 The elisp value PAIR is converted into Asymptote code specifying
 a variable of the same value."
   (let ((var (car pair))
-        (val (if (symbolp (cdr pair))
-                 (symbol-name (cdr pair))
-               (cdr pair))))
+        (val (let ((v (cdr pair)))
+	       (if (symbolp v) (symbol-name v) v))))
     (cond
      ((integerp val)
       (format "int %S=%S;" var val))
@@ -107,14 +106,17 @@ a variable of the same value."
       (format "real %S=%S;" var val))
      ((stringp val)
       (format "string %S=\"%s\";" var val))
+     ((and (listp val) (not (listp (car val))))
+      (let* ((type (org-babel-asymptote-define-type val))
+	     (fmt (if (eq 'string type) "\"%s\"" "%s"))
+	     (vect (mapconcat (lambda (e) (format fmt e)) val ", ")))
+	(format "%s[] %S={%s};" type var vect)))
      ((listp val)
-      (let* ((dimension-2-p (cdr val))
-             (dim (if dimension-2-p "[][]" "[]"))
-             (type (org-babel-asymptote-define-type val))
+      (let* ((type (org-babel-asymptote-define-type val))
              (array (org-babel-asymptote-table-to-array
                      val type
-                     (if dimension-2-p '(:lstart "{" :lend "}," :llend "}")))))
-        (format "%S%s %S=%s;" type dim var array))))))
+                     '(:lstart "{" :lend "}," :llend "}"))))
+        (format "%S[][] %S=%s;" type var array))))))
 
 (defun org-babel-asymptote-table-to-array (table type params)
   "Convert values of TABLE into a string of an asymptote array.
-- 
1.7.6.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-ob-asymptote-simplify-table-to-array-conversion-proc.patch --]
[-- Type: text/x-patch, Size: 2731 bytes --]

From 2e3b7579649ead40128e3c8e31ca75ced139285d Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou <n.goaziou@gmail.com>
Date: Wed, 31 Aug 2011 11:26:29 +0200
Subject: [PATCH 2/2] ob-asymptote: simplify table to array conversion process

* lisp/ob-asymptote.el (org-babel-asymptote-var-to-asymptote):
  refactor code.
(org-babel-asymptote-table-to-array): removed function.
---
 lisp/ob-asymptote.el |   40 ++++++++--------------------------------
 1 files changed, 8 insertions(+), 32 deletions(-)

diff --git a/lisp/ob-asymptote.el b/lisp/ob-asymptote.el
index f90bb85..2219e03 100644
--- a/lisp/ob-asymptote.el
+++ b/lisp/ob-asymptote.el
@@ -113,38 +113,14 @@ a variable of the same value."
 	(format "%s[] %S={%s};" type var vect)))
      ((listp val)
       (let* ((type (org-babel-asymptote-define-type val))
-             (array (org-babel-asymptote-table-to-array
-                     val type
-                     '(:lstart "{" :lend "}," :llend "}"))))
-        (format "%S[][] %S=%s;" type var array))))))
-
-(defun org-babel-asymptote-table-to-array (table type params)
-  "Convert values of TABLE into a string of an asymptote array.
-
-TABLE is a list whose atoms are assumed to be of type
-TYPE. PARAMS is a plist of parameters that can influence the
-conversion.
-
-Empty cells are ignored."
-  (labels ((atom-to-string (table)
-                           (cond
-                            ((null table) '())
-                            ((not (listp (car table)))
-                             (cons (if (or (eq type 'string)
-                                           (and (stringp (car table))
-                                                (not (string= (car table) ""))))
-                                       (format "\"%s\"" (car table))
-                                     (format "%s" (car table)))
-                                   (atom-to-string (cdr table))))
-                            (t
-                             (cons (atom-to-string (car table))
-                                   (atom-to-string (cdr table))))))
-           ;; Remove any empty row
-           (fix-empty-lines (table)
-                            (delq nil (mapcar (lambda (l) (delq "" l)) table))))
-    (orgtbl-to-generic
-     (fix-empty-lines (atom-to-string table))
-     (org-combine-plists '(:hline nil :sep "," :tstart "{" :tend "}") params))))
+	     (fmt (if (eq 'string type) "\"%s\"" "%s"))
+             (array (mapconcat (lambda (row)
+				 (concat "{"
+					 (mapconcat (lambda (e) (format fmt e))
+						    row ", ")
+					 "}"))
+			       val ",")))
+        (format "%S[][] %S={%s};" type var array))))))
 
 (defun org-babel-asymptote-define-type (data)
   "Determine type of DATA.
-- 
1.7.6.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table
  2011-08-31  9:35                                   ` Nicolas Goaziou
@ 2011-08-31 12:14                                     ` Eric Schulte
  0 siblings, 0 replies; 23+ messages in thread
From: Eric Schulte @ 2011-08-31 12:14 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: András Major, nicholas.dokos, emacs-orgmode

Nicolas Goaziou <n.goaziou@gmail.com> writes:

> Hello,
>
> Nick Dokos <nicholas.dokos@hp.com> writes:
>
>> András Major <andras.g.major@gmail.com> wrote:
>>
>>> Hi Eric,
>>> 
>>> > Can you post an example?  Here is a working example.
>>> 
>>> In your example, simply write "asymptote" in place of "sh" and replace the
>>> code by "size(100);" just to make sure it's valid asymptote (though the
>>> error occurs even if you don't).  In fact, I'm quite sure that asy never
>>> gets executed in this case.
>>> 
>>
>> Yes, even without any asymptote code, this breaks. But there seem to be
>> multiple problems. One is fix-empty-lines, a local routine defines
>> inside org-babel-asymptote-table-to-array: it seems to assume that the table
>> is a list of lists, whereas in this case it's a list of strings. The
>> following patch (which probably is wrong, in that it cures the symptom
>> rather than the disease):
>
> Yes, the problem is more general: uni-dimensional lists are not handled
> correctly.
>
> I attach a patch that should fix the problem (and simplify a lot that
> whole process).
>
> One thing, though. Now,
>
> | 1 | 2 |
>
> and (but this was already the case)
>
> | 1 |
> | 2 |
>
> are treated as bi-dimensional arrays, because that's how they really are
> passed to ob-asymptote.
>

Thanks Nicolas, both of these patches are now applied.

-- Eric

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

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2011-08-31 12:14 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-29  8:00 Bug: Babel: asymptote: erroneous conversion of heterogeneous-typed table Major A
2011-08-29  8:47 ` Nicolas Goaziou
2011-08-29  9:12   ` András Major
2011-08-29  9:50     ` Nicolas Goaziou
2011-08-29 10:42       ` András Major
2011-08-29 12:50         ` Nicolas Goaziou
2011-08-29 16:35           ` Nicolas Goaziou
2011-08-29 16:52             ` Eric Schulte
2011-08-29 17:27               ` Nicolas Goaziou
2011-08-29 18:02                 ` Eric Schulte
2011-08-29 18:50                   ` András Major
2011-08-29 19:02                     ` Eric Schulte
2011-08-29 19:11                       ` Nick Dokos
2011-08-30 19:12                       ` András Major
2011-08-30 19:34                         ` Eric Schulte
2011-08-30 20:45                           ` András Major
2011-08-30 20:55                             ` Eric Schulte
2011-08-31  6:48                               ` András Major
2011-08-31  8:17                                 ` Nick Dokos
2011-08-31  9:35                                   ` Nicolas Goaziou
2011-08-31 12:14                                     ` Eric Schulte
2011-08-29  9:05 ` Nick Dokos
2011-08-29  9:40   ` András Major

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).