* Tangling without clutter?
@ 2012-03-14 17:34 Jos'h Fuller
2012-03-14 18:22 ` Thomas S. Dye
0 siblings, 1 reply; 10+ messages in thread
From: Jos'h Fuller @ 2012-03-14 17:34 UTC (permalink / raw)
To: emacs-orgmode@gnu.org
Hi!
I was writing some documentation about how to use a Python function, so I decided to try the tangling feature. However, the result, when exported to PDF, is unsatisfactory because the referenced code block is included twice -- first in the original location, then again where I referenced it with <<function-definition>>.
This is, of course, exactly what it needs to do to be able to execute the code properly and show the result. But it doesn't look nice. Is there any way to suppress the second printing inside the function-demo block?
If this isn't clear from the example below, I can provide examples of the duplication in action as well as what I'd like the output to look like.
Thanks very much!
Example file:
#+TITLE: Tangle Test
#+LANGUAGE: en
#+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
* Tangled Code
I want to show the definition of a function first:
#+name: function-definition
#+begin_src python :tangle yes :exports code
def entable(data):
if not data: return "/No data./"
columns = len(data[0])
sizes = [0,]*columns
for row in data:
sizes = [max(x) for x in zip(sizes, [len(str(t)) for t in row])]
format = "| " + " | ".join(["%%%ds" % x for x in sizes])+" |"
return "\n".join([format % tuple(row) for row in data])
#+end_src
Now I want to show a demonstration of how the function might be
called. I need the function to be included so that demonstration
code can be executed, but I don't want to include the function
definition twice:
#+name: function-demo
#+begin_src python :tangle yes :exports both :noweb yes :results output
<<function-definition>>
print entable([["One", 2, 3],["Four", 5, 6], ["Seven", 8, 9]])
#+end_src
Which gives us this result:
#+results: function-demo
: | One | 2 | 3 |
: | Four | 5 | 6 |
: | Seven | 8 | 9 |
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 17:34 Tangling without clutter? Jos'h Fuller
@ 2012-03-14 18:22 ` Thomas S. Dye
2012-03-14 18:39 ` Jos'h Fuller
0 siblings, 1 reply; 10+ messages in thread
From: Thomas S. Dye @ 2012-03-14 18:22 UTC (permalink / raw)
To: Jos'h Fuller; +Cc: emacs-orgmode@gnu.org
Jos'h Fuller <Jos'h.Fuller@arcproductions.com> writes:
> Hi!
>
> I was writing some documentation about how to use a Python function, so I decided to try the tangling feature. However, the result, when exported to PDF, is unsatisfactory because the referenced code block is included twice -- first in the original location, then again where I referenced it with <<function-definition>>.
>
> This is, of course, exactly what it needs to do to be able to execute the code properly and show the result. But it doesn't look nice. Is there any way to suppress the second printing inside the function-demo block?
>
> If this isn't clear from the example below, I can provide examples of the duplication in action as well as what I'd like the output to look like.
>
> Thanks very much!
>
> Example file:
> #+TITLE: Tangle Test
> #+LANGUAGE: en
> #+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
> #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
>
> * Tangled Code
> I want to show the definition of a function first:
> #+name: function-definition
> #+begin_src python :tangle yes :exports code
> def entable(data):
> if not data: return "/No data./"
>
> columns = len(data[0])
> sizes = [0,]*columns
> for row in data:
> sizes = [max(x) for x in zip(sizes, [len(str(t)) for t in row])]
>
> format = "| " + " | ".join(["%%%ds" % x for x in sizes])+" |"
> return "\n".join([format % tuple(row) for row in data])
> #+end_src
>
> Now I want to show a demonstration of how the function might be
> called. I need the function to be included so that demonstration
> code can be executed, but I don't want to include the function
> definition twice:
>
> #+name: function-demo
> #+begin_src python :tangle yes :exports both :noweb yes :results output
> <<function-definition>>
>
> print entable([["One", 2, 3],["Four", 5, 6], ["Seven", 8, 9]])
> #+end_src
>
> Which gives us this result:
>
> #+results: function-demo
> : | One | 2 | 3 |
> : | Four | 5 | 6 |
> : | Seven | 8 | 9 |
>
>
Aloha!
Does the :no-expand header argument do what you want? See
http://orgmode.org/manual/no_002dexpand.html#no_002dexpand.
hth,
Tom
--
Thomas S. Dye
http://www.tsdye.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 19:35 ` Jos'h Fuller
@ 2012-03-14 18:34 ` Eric Schulte
2012-03-14 22:08 ` Jos'h Fuller
2012-03-15 6:25 ` Viktor Rosenfeld
1 sibling, 1 reply; 10+ messages in thread
From: Eric Schulte @ 2012-03-14 18:34 UTC (permalink / raw)
To: Jos'h Fuller; +Cc: emacs-orgmode@gnu.org, Thomas S. Dye
Jos'h Fuller <Jos'h.Fuller@arcproductions.com> writes:
> Hi!
>
>> > It seems like I almost need some variant of the "tangle" argument to
>> > :noweb where syntax references are expanded for evaluation, but not
>> > for anything else.
>> >
>>
>> Why would you want to tangle out a python src file with an un-expanded
>> noweb reference? Either way, who am I to judge. I've just added a new
>> "eval" option to the noweb header argument which will expand noweb
>> references *only* during interactive evaluation.
>
> Please allow me to explain, I think it's a legitimate use case...
>
> I would like to provide a listing of a Python function, then later in
> the document show a demonstration of how it's used. I just did this
> when preparing some documentation for another programmer who is
> porting an application between languages.
>
> So I listed the function, then after a discussion, I had a
> demonstration of how to use the function. I wanted the output from the
> demonstration to be "live", generated from the demonstration
> code. Therefore, I needed to reference the function defined
> above. Unfortunately, the reference was expanded during export so that
> the same block of code appeared /twice/, presenting the reader with
> something like this:
>
> : Here's a function:
> : def gorking():
> : return "gork"
> :
> : Here's how to use the function:
> : def gorking():
> : return "gork"
> :
> : print gorking()
> :
> : Which gives us:
> : gork
>
> As you can see, it's rather clumsy to have the function in the output
> twice. It's not too bad for this example, but anything more than a few
> lines becomes quite a distraction! This would have been preferable:
>
> : Here's a function:
> : def gorking():
> : return "gork"
> :
> : Here's how to use the function:
> : <<function-gorking>>
> :
> : print gorking()
> :
> : Which gives us:
> : gork
>
> The original %.org file would look like this:
>
> : Here's a function:
> : #+name: function-gorking
> : #+begin_src python :tangle yes
> : def gorking():
> : return "gork"
> : #+end_src
> :
> : Here's how to use the function:
> : #+name: function-gorking-demo
> : #+begin_src python :tangle yes
> : <<function-gorking>>
> :
> : print gorking()
> : #+end_src
> :
> : Which gives us:
> : #+results: function-gorking-demo
> : gork
>
> Does that explain it better?
>
Yes, although it seems that the existing "no-export" or "strip-export"
options to the :noweb header argument may better suit your purposes.
These are described in the Org-mode manual, however, they are not
mentioned in the online version of the manual which is out of date.
Cheers,
>
> Thanks!
>
> Jos'h
>
>
>
--
Eric Schulte
http://cs.unm.edu/~eschulte/
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 18:22 ` Thomas S. Dye
@ 2012-03-14 18:39 ` Jos'h Fuller
2012-03-14 19:13 ` Eric Schulte
0 siblings, 1 reply; 10+ messages in thread
From: Jos'h Fuller @ 2012-03-14 18:39 UTC (permalink / raw)
To: Thomas S. Dye; +Cc: emacs-orgmode@gnu.org
Hi!
> Does the :no-expand header argument do what you want? See
> http://orgmode.org/manual/no_002dexpand.html#no_002dexpand.
I tried using it like this:
#+name: function-demo
#+begin_src python :exports both :noweb yes :results output :no-expand
<<function-definition>>
print entable([["One", 2, 59],["Four", 5, 27], ["Seven", 8, 9]])
#+end_src
But it didn't seem to affect the results at all. I may be using it wrong, the documentation is a bit sparse, without any examples...
It seems like I almost need some variant of the "tangle" argument to :noweb where syntax references are expanded for evaluation, but not for anything else.
Thanks for taking a look!
Jos'h
> -----Original Message-----
> From: Thomas S. Dye [mailto:tsd@tsdye.com]
> Sent: Wednesday, March 14, 2012 2:23 PM
> To: Jos'h Fuller
> Cc: emacs-orgmode@gnu.org
> Subject: Re: Tangling without clutter?
>
> Jos'h Fuller <Jos'h.Fuller@arcproductions.com> writes:
>
> > Hi!
> >
> > I was writing some documentation about how to use a Python function,
> so I decided to try the tangling feature. However, the result, when
> exported to PDF, is unsatisfactory because the referenced code block is
> included twice -- first in the original location, then again where I
> referenced it with <<function-definition>>.
> >
> > This is, of course, exactly what it needs to do to be able to execute
> the code properly and show the result. But it doesn't look nice. Is
> there any way to suppress the second printing inside the function-demo
> block?
> >
> > If this isn't clear from the example below, I can provide examples of
> the duplication in action as well as what I'd like the output to look
> like.
> >
> > Thanks very much!
> >
> > Example file:
> > #+TITLE: Tangle Test
> > #+LANGUAGE: en
> > #+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t
> <:t
> > #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-
> toc
> >
> > * Tangled Code
> > I want to show the definition of a function first:
> > #+name: function-definition
> > #+begin_src python :tangle yes :exports code
> > def entable(data):
> > if not data: return "/No data./"
> >
> > columns = len(data[0])
> > sizes = [0,]*columns
> > for row in data:
> > sizes = [max(x) for x in zip(sizes, [len(str(t)) for t in
> row])]
> >
> > format = "| " + " | ".join(["%%%ds" % x for x in sizes])+" |"
> > return "\n".join([format % tuple(row) for row in data])
> > #+end_src
> >
> > Now I want to show a demonstration of how the function might be
> > called. I need the function to be included so that demonstration
> > code can be executed, but I don't want to include the function
> > definition twice:
> >
> > #+name: function-demo
> > #+begin_src python :tangle yes :exports both :noweb yes :results
> output
> > <<function-definition>>
> >
> > print entable([["One", 2, 3],["Four", 5, 6], ["Seven", 8, 9]])
> > #+end_src
> >
> > Which gives us this result:
> >
> > #+results: function-demo
> > : | One | 2 | 3 |
> > : | Four | 5 | 6 |
> > : | Seven | 8 | 9 |
> >
> >
> Aloha!
>
> Does the :no-expand header argument do what you want? See
> http://orgmode.org/manual/no_002dexpand.html#no_002dexpand.
>
> hth,
> Tom
> --
> Thomas S. Dye
> http://www.tsdye.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 18:39 ` Jos'h Fuller
@ 2012-03-14 19:13 ` Eric Schulte
2012-03-14 19:35 ` Jos'h Fuller
0 siblings, 1 reply; 10+ messages in thread
From: Eric Schulte @ 2012-03-14 19:13 UTC (permalink / raw)
To: Jos'h Fuller; +Cc: emacs-orgmode@gnu.org, Thomas S. Dye
Jos'h Fuller <Jos'h.Fuller@arcproductions.com> writes:
> Hi!
>
>> Does the :no-expand header argument do what you want? See
>> http://orgmode.org/manual/no_002dexpand.html#no_002dexpand.
>
> I tried using it like this:
>
> #+name: function-demo
> #+begin_src python :exports both :noweb yes :results output :no-expand
> <<function-definition>>
>
> print entable([["One", 2, 59],["Four", 5, 27], ["Seven", 8, 9]])
> #+end_src
>
> But it didn't seem to affect the results at all. I may be using it
> wrong, the documentation is a bit sparse, without any examples...
>
> It seems like I almost need some variant of the "tangle" argument to
> :noweb where syntax references are expanded for evaluation, but not
> for anything else.
>
Why would you want to tangle out a python src file with an un-expanded
noweb reference? Either way, who am I to judge. I've just added a new
"eval" option to the noweb header argument which will expand noweb
references *only* during interactive evaluation.
Best,
>
> Thanks for taking a look!
>
> Jos'h
>
>
>> -----Original Message-----
>> From: Thomas S. Dye [mailto:tsd@tsdye.com]
>> Sent: Wednesday, March 14, 2012 2:23 PM
>> To: Jos'h Fuller
>> Cc: emacs-orgmode@gnu.org
>> Subject: Re: Tangling without clutter?
>>
>> Jos'h Fuller <Jos'h.Fuller@arcproductions.com> writes:
>>
>> > Hi!
>> >
>> > I was writing some documentation about how to use a Python function,
>> so I decided to try the tangling feature. However, the result, when
>> exported to PDF, is unsatisfactory because the referenced code block is
>> included twice -- first in the original location, then again where I
>> referenced it with <<function-definition>>.
>> >
>> > This is, of course, exactly what it needs to do to be able to execute
>> the code properly and show the result. But it doesn't look nice. Is
>> there any way to suppress the second printing inside the function-demo
>> block?
>> >
>> > If this isn't clear from the example below, I can provide examples of
>> the duplication in action as well as what I'd like the output to look
>> like.
>> >
>> > Thanks very much!
>> >
>> > Example file:
>> > #+TITLE: Tangle Test
>> > #+LANGUAGE: en
>> > #+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:nil -:t f:t *:t
>> <:t
>> > #+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-
>> toc
>> >
>> > * Tangled Code
>> > I want to show the definition of a function first:
>> > #+name: function-definition
>> > #+begin_src python :tangle yes :exports code
>> > def entable(data):
>> > if not data: return "/No data./"
>> >
>> > columns = len(data[0])
>> > sizes = [0,]*columns
>> > for row in data:
>> > sizes = [max(x) for x in zip(sizes, [len(str(t)) for t in
>> row])]
>> >
>> > format = "| " + " | ".join(["%%%ds" % x for x in sizes])+" |"
>> > return "\n".join([format % tuple(row) for row in data])
>> > #+end_src
>> >
>> > Now I want to show a demonstration of how the function might be
>> > called. I need the function to be included so that demonstration
>> > code can be executed, but I don't want to include the function
>> > definition twice:
>> >
>> > #+name: function-demo
>> > #+begin_src python :tangle yes :exports both :noweb yes :results
>> output
>> > <<function-definition>>
>> >
>> > print entable([["One", 2, 3],["Four", 5, 6], ["Seven", 8, 9]])
>> > #+end_src
>> >
>> > Which gives us this result:
>> >
>> > #+results: function-demo
>> > : | One | 2 | 3 |
>> > : | Four | 5 | 6 |
>> > : | Seven | 8 | 9 |
>> >
>> >
>> Aloha!
>>
>> Does the :no-expand header argument do what you want? See
>> http://orgmode.org/manual/no_002dexpand.html#no_002dexpand.
>>
>> hth,
>> Tom
>> --
>> Thomas S. Dye
>> http://www.tsdye.com
>
--
Eric Schulte
http://cs.unm.edu/~eschulte/
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 19:13 ` Eric Schulte
@ 2012-03-14 19:35 ` Jos'h Fuller
2012-03-14 18:34 ` Eric Schulte
2012-03-15 6:25 ` Viktor Rosenfeld
0 siblings, 2 replies; 10+ messages in thread
From: Jos'h Fuller @ 2012-03-14 19:35 UTC (permalink / raw)
To: Eric Schulte; +Cc: emacs-orgmode@gnu.org, Thomas S. Dye
Hi!
> > It seems like I almost need some variant of the "tangle" argument to
> > :noweb where syntax references are expanded for evaluation, but not
> > for anything else.
> >
>
> Why would you want to tangle out a python src file with an un-expanded
> noweb reference? Either way, who am I to judge. I've just added a new
> "eval" option to the noweb header argument which will expand noweb
> references *only* during interactive evaluation.
Please allow me to explain, I think it's a legitimate use case...
I would like to provide a listing of a Python function, then later in the document show a demonstration of how it's used. I just did this when preparing some documentation for another programmer who is porting an application between languages.
So I listed the function, then after a discussion, I had a demonstration of how to use the function. I wanted the output from the demonstration to be "live", generated from the demonstration code. Therefore, I needed to reference the function defined above. Unfortunately, the reference was expanded during export so that the same block of code appeared /twice/, presenting the reader with something like this:
: Here's a function:
: def gorking():
: return "gork"
:
: Here's how to use the function:
: def gorking():
: return "gork"
:
: print gorking()
:
: Which gives us:
: gork
As you can see, it's rather clumsy to have the function in the output twice. It's not too bad for this example, but anything more than a few lines becomes quite a distraction! This would have been preferable:
: Here's a function:
: def gorking():
: return "gork"
:
: Here's how to use the function:
: <<function-gorking>>
:
: print gorking()
:
: Which gives us:
: gork
The original %.org file would look like this:
: Here's a function:
: #+name: function-gorking
: #+begin_src python :tangle yes
: def gorking():
: return "gork"
: #+end_src
:
: Here's how to use the function:
: #+name: function-gorking-demo
: #+begin_src python :tangle yes
: <<function-gorking>>
:
: print gorking()
: #+end_src
:
: Which gives us:
: #+results: function-gorking-demo
: gork
Does that explain it better?
Thanks!
Jos'h
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 22:08 ` Jos'h Fuller
@ 2012-03-14 20:52 ` Eric Schulte
0 siblings, 0 replies; 10+ messages in thread
From: Eric Schulte @ 2012-03-14 20:52 UTC (permalink / raw)
To: Jos'h Fuller; +Cc: emacs-orgmode@gnu.org, Thomas S. Dye
Jos'h Fuller <Jos'h.Fuller@arcproductions.com> writes:
> Hi!
>
>> Yes, although it seems that the existing "no-export" or "strip-export"
>> options to the :noweb header argument may better suit your purposes.
>> These are described in the Org-mode manual, however, they are not
>> mentioned in the online version of the manual which is out of date.
>
> I thought I had the latest at 7.8.03... Are you referring to a
> development version? I don't see a reference to those in the
> documentation that came with that version.
>
I was referring to the head of the git repository, which can be
installed following the instructions from the main org-mode page.
Best,
--
Eric Schulte
http://cs.unm.edu/~eschulte/
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 18:34 ` Eric Schulte
@ 2012-03-14 22:08 ` Jos'h Fuller
2012-03-14 20:52 ` Eric Schulte
0 siblings, 1 reply; 10+ messages in thread
From: Jos'h Fuller @ 2012-03-14 22:08 UTC (permalink / raw)
To: Eric Schulte; +Cc: emacs-orgmode@gnu.org, Thomas S. Dye
Hi!
> Yes, although it seems that the existing "no-export" or "strip-export"
> options to the :noweb header argument may better suit your purposes.
> These are described in the Org-mode manual, however, they are not
> mentioned in the online version of the manual which is out of date.
I thought I had the latest at 7.8.03... Are you referring to a development version? I don't see a reference to those in the documentation that came with that version.
Thanks!
Jos'h
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-14 19:35 ` Jos'h Fuller
2012-03-14 18:34 ` Eric Schulte
@ 2012-03-15 6:25 ` Viktor Rosenfeld
2012-03-15 8:42 ` Jacek Generowicz
1 sibling, 1 reply; 10+ messages in thread
From: Viktor Rosenfeld @ 2012-03-15 6:25 UTC (permalink / raw)
To: emacs-orgmode
Hi Jos'h,
have you looked at the :session header argument? I use it to define
environment variables in bash that are used in later code blocks.
Something like this:
#+BEGIN_SRC sh :session foo
export W="world."
#+END_SRC
#+RESULTS:
#+BEGIN_SRC sh :session foo
echo Hello $W
#+END_SRC
If these code blocks are executed in order, the latter returns "Hello
world."
Not sure though, how it interacts with Python.
Cheers,
Viktor
Jos'h Fuller wrote:
> Hi!
>
> > > It seems like I almost need some variant of the "tangle" argument to
> > > :noweb where syntax references are expanded for evaluation, but not
> > > for anything else.
> > >
> >
> > Why would you want to tangle out a python src file with an un-expanded
> > noweb reference? Either way, who am I to judge. I've just added a new
> > "eval" option to the noweb header argument which will expand noweb
> > references *only* during interactive evaluation.
>
> Please allow me to explain, I think it's a legitimate use case...
>
> I would like to provide a listing of a Python function, then later in the document show a demonstration of how it's used. I just did this when preparing some documentation for another programmer who is porting an application between languages.
>
> So I listed the function, then after a discussion, I had a demonstration of how to use the function. I wanted the output from the demonstration to be "live", generated from the demonstration code. Therefore, I needed to reference the function defined above. Unfortunately, the reference was expanded during export so that the same block of code appeared /twice/, presenting the reader with something like this:
>
> : Here's a function:
> : def gorking():
> : return "gork"
> :
> : Here's how to use the function:
> : def gorking():
> : return "gork"
> :
> : print gorking()
> :
> : Which gives us:
> : gork
>
> As you can see, it's rather clumsy to have the function in the output twice. It's not too bad for this example, but anything more than a few lines becomes quite a distraction! This would have been preferable:
>
> : Here's a function:
> : def gorking():
> : return "gork"
> :
> : Here's how to use the function:
> : <<function-gorking>>
> :
> : print gorking()
> :
> : Which gives us:
> : gork
>
> The original %.org file would look like this:
>
> : Here's a function:
> : #+name: function-gorking
> : #+begin_src python :tangle yes
> : def gorking():
> : return "gork"
> : #+end_src
> :
> : Here's how to use the function:
> : #+name: function-gorking-demo
> : #+begin_src python :tangle yes
> : <<function-gorking>>
> :
> : print gorking()
> : #+end_src
> :
> : Which gives us:
> : #+results: function-gorking-demo
> : gork
>
> Does that explain it better?
>
> Thanks!
>
> Jos'h
>
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Tangling without clutter?
2012-03-15 6:25 ` Viktor Rosenfeld
@ 2012-03-15 8:42 ` Jacek Generowicz
0 siblings, 0 replies; 10+ messages in thread
From: Jacek Generowicz @ 2012-03-15 8:42 UTC (permalink / raw)
To: emacs-orgmode
At Thu, 15 Mar 2012 07:25:47 +0100,
Viktor Rosenfeld wrote:
>
> Hi Jos'h,
>
> have you looked at the :session header argument? I use it to define
> environment variables in bash that are used in later code blocks.
>
> Something like this:
>
> #+BEGIN_SRC sh :session foo
> export W="world."
> #+END_SRC
>
> #+RESULTS:
>
> #+BEGIN_SRC sh :session foo
> echo Hello $W
> #+END_SRC
>
> If these code blocks are executed in order, the latter returns "Hello
> world."
Which is exactly how I was planning to use org babel to prepare a lot
of Python-based teaching material. Unfortunately ...
> Not sure though, how it interacts with Python.
... it interacts with Python in a less than ideal way. In effect, it
pretends you typed the code in the Python source block, into Python's
standard interactive shell. This leads to problems: Imagine that you
want to demonstrate how to write a simple class in Python, and that
you wish to follow Python's style guide, which states that "Method
definitions inside a class are separated by a single blank line."
So you present this example code
#+begin_src python :session :results output
class Foo:
def __init__(self, state):
self.state = state
def get(self):
return self.state
#+end_src
in the hope of writing some explanatory notes about it, before
demonstrating its use
#+begin_src python :session :results output
f = Foo('frustrated')
print f.get()
#+end_src
Unfortunately, the plan is foiled because the class definiton in the
first block fails to execute properly. This happens because Python's
standard interactive shell (in contrast to Python's non interactive
mode) understands blank lines to close all currently open blocks. This
results in the =class Foo:= block being closed before any of its
components have been defined, at which point the whole thing goes
pear-shaped.
Currently there are two things you can do to get around this problem.
1. Remove any blank lines which are inside any block in any of your
code (resulting in very ugly and heterodox formatting of your
Python code: not the sort of thing you want to be doing in
tutorials, lectures, documentation, etc.).
2. Hunt down all blank lines which are inside a block, and add enough
whitespace to match the indentation of the next non-whitespace line
in that block (very tedious and very fragile).
Last week I had a short exchange about this, on list, with Eric
Schulte, and seem to have persuaded him that the current state of
affairs is not the desired one.
I am planning to have a look at how the situation can be improved with
the aim of providing a patch, but
1. I have zero time to devote to this in the next few weeks.
2. I have never tinkered with babel's internals before, so I cannot
guarantee success, or quality of output.
In the meantime, I have *slightly* changed my position, since the
exchange with Eric. Last week I claimed that what the session mode
should do is, essentially, emulate Emacs' python-mode's C-c C-c
(execute the code block in the context of the session without choking
on blank lines, and without echoing any of the code itself). I stand
by this being the desired primary behaviour, but I do admit that an
alternative valid (though less important) use case would be to have
the code in the src block be 'typed' into a standard interactive
session, and have the whole session (prompt, input, output) be
produced as the result. (IIRC, this currently doesn't work properly
either: the prompts and the inputs are out of sync, and you get a
horrible mess.)
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-03-15 8:42 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-14 17:34 Tangling without clutter? Jos'h Fuller
2012-03-14 18:22 ` Thomas S. Dye
2012-03-14 18:39 ` Jos'h Fuller
2012-03-14 19:13 ` Eric Schulte
2012-03-14 19:35 ` Jos'h Fuller
2012-03-14 18:34 ` Eric Schulte
2012-03-14 22:08 ` Jos'h Fuller
2012-03-14 20:52 ` Eric Schulte
2012-03-15 6:25 ` Viktor Rosenfeld
2012-03-15 8:42 ` Jacek Generowicz
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).