|
|
@@ -207,7 +207,139 @@ would then be [[#sandbox][the sandbox]].
|
|
|
#+end_src
|
|
|
|
|
|
|
|
|
-* Tasks [32/50]
|
|
|
+* Tasks [35/57]
|
|
|
+** PROPOSED implement fully recursive evaluation machinery
|
|
|
+ The current parser / evaluator fails with greater levels of nested
|
|
|
+ function block calls (example below). If we want to overcome this I
|
|
|
+ think we'd have to redesign some of the evaluation
|
|
|
+ mechanism. Seeing as we are also facing issues like dealing with
|
|
|
+ default argument values, and seeing as we now know how we want the
|
|
|
+ library of babel to behave in addition to the source blocks, now
|
|
|
+ might be a good time to think about this. It would be nice to do
|
|
|
+ the full thing at some point, but otoh we may not consider it a
|
|
|
+ massive priority.
|
|
|
+
|
|
|
+ AIui, there are two stages: (i) construct a parse tree, and (ii)
|
|
|
+ evaluate it and return the value at the root. In the parse tree
|
|
|
+ each node represents an unevaluated value (either a literal value
|
|
|
+ or a reference). Node v may have descendent nodes, which represent
|
|
|
+ values upon which node v's evaluation depends. Once that tree is
|
|
|
+ constructed, then we evaluate the nodes from the tips towards the
|
|
|
+ root (a post-order traversal).
|
|
|
+
|
|
|
+ [This would also provide a solution for concatenating the STDOUTs
|
|
|
+ of called blocks, which is a [[*allow%20output%20mode%20to%20return%20stdout%20as%20value][task below]]; we concatenate them in
|
|
|
+ whatever order the traversal is done in.]
|
|
|
+
|
|
|
+ In addition to the variable references (i.e. daughter nodes), each
|
|
|
+ node would contain the information needed to evaluate that node
|
|
|
+ (e.g. lang body). Then we would pass a function postorder over the
|
|
|
+ tree which would call o-b-execute-src-block at each node, finally
|
|
|
+ returning the value at the root.
|
|
|
+
|
|
|
+ Fwiw I made a very tentative small start at stubbing this out in
|
|
|
+ org-babel-call.el in the 'evaluation' branch. And I've made a start
|
|
|
+ at sketching a parsing algorithm below.
|
|
|
+
|
|
|
+*** Parse tree algorithm
|
|
|
+ Seeing as we're just trying to parse a string like
|
|
|
+ f(a=1,b=g(c=2,d=3)) it shouldn't be too hard. But of course there
|
|
|
+ are 'proper' parsers written in elisp out there,
|
|
|
+ e.g. [[http://cedet.sourceforge.net/semantic.shtml][Semantic]]. Perhaps we can find what we need -- our syntax is
|
|
|
+ pretty much the same as python and R isn't it?
|
|
|
+
|
|
|
+ Or, a complete hack, but maybe it would be we easy to transform it
|
|
|
+ to XML and then parse that with some existing tool?
|
|
|
+
|
|
|
+ But if we're doing it ourselves, something very vaguely like this?
|
|
|
+ (I'm sure there're lots of problems with this)
|
|
|
+
|
|
|
+#+srcname: org-babel-call-parse(call)
|
|
|
+#+begin_src python
|
|
|
+ ## we are currently reading a reference name: the name of the root function
|
|
|
+ whereami = "refname"
|
|
|
+ node = root = Node()
|
|
|
+ for c in call_string:
|
|
|
+ if c == '(':
|
|
|
+ varnum = 0
|
|
|
+ whereami = "varname" # now we're reading a variable name
|
|
|
+ if c == '=':
|
|
|
+ new = Node()
|
|
|
+ node.daughters = [node.daughters, new]
|
|
|
+ new.parent = node
|
|
|
+ node = new
|
|
|
+ whereami = "refname"
|
|
|
+ if c == ',':
|
|
|
+ whereami = "varname"
|
|
|
+ varnum += 1
|
|
|
+ elif c == ')':
|
|
|
+ node = node.parent
|
|
|
+ elif c == ' ':
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ if whereami = "varname":
|
|
|
+ node.varnames[varnum] += c
|
|
|
+ elif whereami = "refname":
|
|
|
+ node.name += c
|
|
|
+#+end_src
|
|
|
+
|
|
|
+*** Example that fails
|
|
|
+
|
|
|
+#+srcname: adder(a=0, b=0)
|
|
|
+#+begin_src python
|
|
|
+a+b
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+srcname: one()
|
|
|
+#+begin_src python :results silent
|
|
|
+1
|
|
|
+#+end_src
|
|
|
+
|
|
|
+This works
|
|
|
+#+srcname: level-one-nesting
|
|
|
+#+begin_src python :var arg=adder(a=one(),b=one())
|
|
|
+arg
|
|
|
+#+end_src
|
|
|
+
|
|
|
+But this doesn't
|
|
|
+#+srcname: level-one-nesting
|
|
|
+#+begin_src python :var arg=adder(a=adder(a=one(),b=one()),b=adder(a=one(),b=one()))
|
|
|
+arg
|
|
|
+#+end_src
|
|
|
+
|
|
|
+** PROPOSED Default args
|
|
|
+ This would be good thing to address soon. I'm imagining that
|
|
|
+ e.g. here, the 'caller' block would return the answer 30. I believe
|
|
|
+ there's a few issues here: i.e. the naked 'a' without a reference
|
|
|
+ is not understood; the default arg b=6 is not understood.
|
|
|
+
|
|
|
+#+srcname: adder(a, b=6)
|
|
|
+#+begin_src python
|
|
|
+a+b
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+srcname: caller(var=adder(a=24))
|
|
|
+#+begin_src python
|
|
|
+var
|
|
|
+#+end_src
|
|
|
+
|
|
|
+** PROPOSED allow `anonymous' function block with function call args?
|
|
|
+ My question here is simply whether we're going to allow
|
|
|
+#+begin_src python(arg=ref)
|
|
|
+# whatever
|
|
|
+#+end_src
|
|
|
+
|
|
|
+but with preference given to
|
|
|
+#+srcname blockname(arg=ref)
|
|
|
+** PROPOSED allow :result as synonym for :results?
|
|
|
+** PROPOSED allow 'output mode to return stdout as value?
|
|
|
+ Maybe we should allow this. In fact, if block x is called
|
|
|
+ with :results output, and it references blocks y and z, then
|
|
|
+ shouldn't the output of x contain a concatenation of the outputs of
|
|
|
+ y and z, together with x's own output? That would raise the
|
|
|
+ question of what happens if y is defined with :results output and z
|
|
|
+ with :results value. I guess z's (possibly vector/tabular) output
|
|
|
+ would be inside a literal example block containing the whole lot.
|
|
|
** PROPOSED optional timestamp for output
|
|
|
Add option to place an (inactive) timestamp at the #+resname, to
|
|
|
record when that output was generated.
|
|
|
@@ -341,7 +473,7 @@ org-mode core
|
|
|
org-src-mode would be better.
|
|
|
**** DONE Changed minor mode name and added hooks
|
|
|
|
|
|
-**** DEFERRED a hook called when the src edit buffer is created
|
|
|
+**** DONE a hook called when the src edit buffer is created
|
|
|
This should be implemented in the org-mode core
|
|
|
|
|
|
** TODO resolve references to other org buffers/files
|
|
|
@@ -357,6 +489,13 @@ org-mode core
|
|
|
similar status to a source code block?
|
|
|
- Would be nice to allow org and non-org files to be remote
|
|
|
** TODO figure out how to handle errors during evaluation
|
|
|
+ I expect it will be hard to do this properly, but ultimately it
|
|
|
+ would be nice to be able to specify somewhere to receive STDERR,
|
|
|
+ and to be warned if it is non-empty.
|
|
|
+
|
|
|
+ Probably simpler in non-session evaluation than session? At least
|
|
|
+ the mechanism will be different I guess.
|
|
|
+
|
|
|
R has a try function, with error handling, along the lines of
|
|
|
python. I bet ruby does too. Maybe more of an issue for functional
|
|
|
style; in my proposed scripting style the error just gets dumped to
|
|
|
@@ -435,7 +574,6 @@ This could also act reasonably with other results types...
|
|
|
- file :: use org-open-at-point to open the file
|
|
|
- scalar :: open results unquoted in a new buffer
|
|
|
- tabular :: export the table to a new buffer and open that buffer
|
|
|
-
|
|
|
** TODO Finalise behaviour regarding vector/scalar output
|
|
|
*** DONE Stop spaces causing vector output
|
|
|
This simple example of multilingual chaining produces vector output if
|
|
|
@@ -535,17 +673,86 @@ we should color these blocks differently
|
|
|
*** TODO refine html exportation
|
|
|
should use a span class, and should show original source in tool-tip
|
|
|
|
|
|
-** STARTED Column (and row) names of tables in R input/output
|
|
|
-*** DONE column names
|
|
|
- This has been implemented: Automatic on input to R; optional in output.
|
|
|
-*** TODO row names
|
|
|
- Perhaps add a :rownames header arg. This would be an integer
|
|
|
+** TODO LoB: re-implement plotting and analysis functions from org-R
|
|
|
+ I'll do this soon, now that we things are a bit more settled and we
|
|
|
+ have column names in R.
|
|
|
+** PROPOSED conversion between org-babel and noweb (e.g. .Rnw) format
|
|
|
+ I haven't thought about this properly. Just noting it down. What
|
|
|
+ Sweave uses is called "R noweb" (.Rnw).
|
|
|
+
|
|
|
+ I found a good description of noweb in the following article (see
|
|
|
+ the [[http://www.cs.tufts.edu/~nr/pubs/lpsimp.pdf][pdf]]).
|
|
|
+
|
|
|
+ I think there are two parts to noweb, the construction of
|
|
|
+ documentation and the extraction of source-code (with notangle).
|
|
|
+
|
|
|
+ *documentation*: org-mode handles all of our documentation needs in
|
|
|
+ a manner that I believe is superior to noweb.
|
|
|
+
|
|
|
+ *source extraction* At this point I don't see anyone writing large
|
|
|
+ applications with 100% of the source code contained in org-babel
|
|
|
+ files, rather I see org-babel files containing things like
|
|
|
+ - notes with active code chunks
|
|
|
+ - interactive tutorials
|
|
|
+ - requirements documents with code running test suites
|
|
|
+ - and of course experimental reports with the code to run the
|
|
|
+ experiment, and perform analysis
|
|
|
+
|
|
|
+ Basically I think the scope of the programs written in org-babel
|
|
|
+ (at least initially) will be small enough that it wont require the
|
|
|
+ addition of a tangle type program to extract all of the source code
|
|
|
+ into a running application.
|
|
|
+
|
|
|
+ On the other hand, since we already have named blocks of source
|
|
|
+ code which reference other blocks on which they rely, this
|
|
|
+ shouldn't be too hard to implement either on our own, or possibly
|
|
|
+ relying on something like noweb/notangle.
|
|
|
+
|
|
|
+** PROPOSED support for passing paths to files between source blocks
|
|
|
+Maybe this should be it's own result type (in addition to scalars and
|
|
|
+vectors). The reason being that some source-code blocks (for example
|
|
|
+ditaa or anything that results in the creation of a file) may want to
|
|
|
+pass a file path back to org-mode which could then be inserted into
|
|
|
+the org-mode buffer as a link to the file...
|
|
|
+
|
|
|
+This would allow for display of images upon export providing
|
|
|
+functionality similar to =org-exp-blocks= only in a more general
|
|
|
+manner.
|
|
|
+** DEFERRED Support rownames and other org babel table features?
|
|
|
+
|
|
|
+ The full org table features are detailed in the manual [[http://orgmode.org/manual/Advanced-features.html#Advanced-features][here]].
|
|
|
+
|
|
|
+*** rownames
|
|
|
+ Perhaps add a :rownames header arg. This would be an integer
|
|
|
(usually 1) which would have the effect of post-processing all the
|
|
|
variables created in the R session in the following way: if the
|
|
|
integer is j, set the row names to the contents of column j and
|
|
|
delete column j. Perhaps it is artificial to allow this integer to
|
|
|
take any value other than 1. The default would be nil which would
|
|
|
mean no such behaviour.
|
|
|
+
|
|
|
+ Actually I don't know about that. If multiple variables are passed
|
|
|
+ in, it's not appropriate to alter them all in the same way. The
|
|
|
+ rownames specification would normally refer to just one of the
|
|
|
+ variables. For now maybe just say this has to be done in R. E.g.
|
|
|
+
|
|
|
+#+TBLNAME: sample-sizes
|
|
|
+ | collection | size | exclude | include | exclude2 | include2 |
|
|
|
+ |-----------------+------+---------+---------+----------+----------|
|
|
|
+ | 58C | 2936 | 8 | 2928 | 256 | 2680 |
|
|
|
+ | MS | 5852 | 771 | 5081 | 771 | 5081 |
|
|
|
+ | NBS | 2929 | 64 | 2865 | 402 | 2527 |
|
|
|
+ | POBI | 2717 | 1 | 2716 | 1 | 2716 |
|
|
|
+ | 58C+MS+NBS+POBI | | | 13590 | | 13004 |
|
|
|
+#+TBLFM: @2$4=@2$2 - @2$3::@2$6=@2$2 - @2$5::@3$4=@3$2-@3$3::@3$6=@3$2 - @3$5::@4$4=@4$2 - @4$3::@4$6=@4$2 - @4$5::@5$4=@5$2-@5$3::@5$6=@5$2 - @5$5::@6$4=vsum(@2$4..@5$4)::@6$6=vsum(@2$6..@5$6)
|
|
|
+
|
|
|
+#+srcname: make-size-table(size=sample-sizes)
|
|
|
+#+begin_src R
|
|
|
+ rownames(size) <- size[,1]
|
|
|
+ size <- size[,-1]
|
|
|
+#+end_src
|
|
|
+
|
|
|
+
|
|
|
*** Old notes
|
|
|
[I don't think it's as problematic as this makes out]
|
|
|
This is non-trivial, but may be worth doing, in particular to
|
|
|
@@ -643,106 +850,6 @@ tabel
|
|
|
|
|
|
Another example is in the [[*operations%20in%20on%20tables][grades example]].
|
|
|
|
|
|
-** TODO re-implement helper functions from org-R
|
|
|
-*** Initial statement [Eric]
|
|
|
- Much of the power of org-R seems to be in it's helper functions for
|
|
|
- the quick graphing of tables. Should we try to re-implement these
|
|
|
- functions on top of org-babel?
|
|
|
-
|
|
|
- I'm thinking this may be useful both to add features to org-babel-R and
|
|
|
- also to potentially suggest extensions of the framework. For example
|
|
|
- one that comes to mind is the ability to treat a source-code block
|
|
|
- like a function which accepts arguments and returns results. Actually
|
|
|
- this can be it's own TODO (see [[* source blocks as functions][source blocks as functions]]).
|
|
|
-*** Objectives [Dan]
|
|
|
- - We want to provide convenient off-the-shelf actions
|
|
|
- (e.g. plotting data) that make use of our new code evaluation
|
|
|
- environment but do not require any actual coding.
|
|
|
-*** Initial Design proposal [Dan]
|
|
|
- - *Input data* will be specified using the same mechanism as :var
|
|
|
- references, thus the input data may come from a table, or
|
|
|
- another source block, and it is initially available as an elisp
|
|
|
- data structure.
|
|
|
- - We introduce a new #+ line, e.g. #+BABELDO. C-c C-c on that
|
|
|
- line will apply an *action* to the referenced data.
|
|
|
- - *Actions correspond to source blocks*: our library of available
|
|
|
- actions will be a library of org-babel source blocks. Thus the
|
|
|
- code for executing an action, and the code for dealing with the
|
|
|
- output of the action will be the same code as for executing
|
|
|
- source blocks in general
|
|
|
- - Optionally, the user can have the relevant source block inserted
|
|
|
- into the org buffer after the (say) #+BABELDO line. This will
|
|
|
- allow the user to fine tune the action by modifying the code
|
|
|
- (especially useful for plots).
|
|
|
- - So maybe a #+BABELDO line will have header args
|
|
|
- - :data (a reference to a table or source code block)
|
|
|
- - :action (or should that be :srcname?) which will be something
|
|
|
- like :action pie-chart, referring to a source block which will
|
|
|
- be executed with the :data referent passed in using a :var arg.
|
|
|
- - :showcode or something controlling whether to show the code
|
|
|
-
|
|
|
-*** Modification to design
|
|
|
- I'm implementing this, at least initially, as a new interpreter
|
|
|
- named 'babel', which has an empty body. 'babel' blocks take
|
|
|
- a :srcname header arg, and look for the source-code block with
|
|
|
- that name. They then execute the referenced block, after first
|
|
|
- appending their own header args on to the target block's header
|
|
|
- args.
|
|
|
-
|
|
|
- If the target block is in the library of babel (a.o.t. e.g. the
|
|
|
- current buffer), then the code in the block will refer to the
|
|
|
- input data with a name dictated by convention (e.g. __data__
|
|
|
- (something which is syntactically legal in all languages...). Thus
|
|
|
- the babel block will use a :var __data__ = whatever header arg to
|
|
|
- reference the data to be plotted.
|
|
|
-
|
|
|
-*** Current design
|
|
|
- This is covered by the [[file:library-of-babel.org][Library of Babel]], which will contain
|
|
|
- ready-made source blocks designed to carry out useful common tasks.
|
|
|
-
|
|
|
-** PROPOSED conversion between org-babel and noweb (e.g. .Rnw) format
|
|
|
- I haven't thought about this properly. Just noting it down. What
|
|
|
- Sweave uses is called "R noweb" (.Rnw).
|
|
|
-
|
|
|
- I found a good description of noweb in the following article (see
|
|
|
- the [[http://www.cs.tufts.edu/~nr/pubs/lpsimp.pdf][pdf]]).
|
|
|
-
|
|
|
- I think there are two parts to noweb, the construction of
|
|
|
- documentation and the extraction of source-code (with notangle).
|
|
|
-
|
|
|
- *documentation*: org-mode handles all of our documentation needs in
|
|
|
- a manner that I believe is superior to noweb.
|
|
|
-
|
|
|
- *source extraction* At this point I don't see anyone writing large
|
|
|
- applications with 100% of the source code contained in org-babel
|
|
|
- files, rather I see org-babel files containing things like
|
|
|
- - notes with active code chunks
|
|
|
- - interactive tutorials
|
|
|
- - requirements documents with code running test suites
|
|
|
- - and of course experimental reports with the code to run the
|
|
|
- experiment, and perform analysis
|
|
|
-
|
|
|
- Basically I think the scope of the programs written in org-babel
|
|
|
- (at least initially) will be small enough that it wont require the
|
|
|
- addition of a tangle type program to extract all of the source code
|
|
|
- into a running application.
|
|
|
-
|
|
|
- On the other hand, since we already have named blocks of source
|
|
|
- code which reference other blocks on which they rely, this
|
|
|
- shouldn't be too hard to implement either on our own, or possibly
|
|
|
- relying on something like noweb/notangle.
|
|
|
-
|
|
|
-** PROPOSED support for passing paths to files between source blocks
|
|
|
-Maybe this should be it's own result type (in addition to scalars and
|
|
|
-vectors). The reason being that some source-code blocks (for example
|
|
|
-ditaa or anything that results in the creation of a file) may want to
|
|
|
-pass a file path back to org-mode which could then be inserted into
|
|
|
-the org-mode buffer as a link to the file...
|
|
|
-
|
|
|
-This would allow for display of images upon export providing
|
|
|
-functionality similar to =org-exp-blocks= only in a more general
|
|
|
-manner.
|
|
|
-
|
|
|
** DEFERRED use textConnection to pass tsv to R?
|
|
|
When passing args from the org buffer to R, the following route is
|
|
|
used: arg in buffer -> elisp -> tsv on file -> data frame in R. I
|
|
|
@@ -935,6 +1042,70 @@ to the command if BUFF is not given.)
|
|
|
2) The function is called inside of a =write.table= function call
|
|
|
writing the results to a table
|
|
|
3) The table is read using =org-table-import=
|
|
|
+
|
|
|
+** DONE extensible library of callable source blocks
|
|
|
+*** Current design
|
|
|
+ This is covered by the [[file:library-of-babel.org][Library of Babel]], which will contain
|
|
|
+ ready-made source blocks designed to carry out useful common tasks.
|
|
|
+*** Initial statement [Eric]
|
|
|
+ Much of the power of org-R seems to be in it's helper functions for
|
|
|
+ the quick graphing of tables. Should we try to re-implement these
|
|
|
+ functions on top of org-babel?
|
|
|
+
|
|
|
+ I'm thinking this may be useful both to add features to org-babel-R and
|
|
|
+ also to potentially suggest extensions of the framework. For example
|
|
|
+ one that comes to mind is the ability to treat a source-code block
|
|
|
+ like a function which accepts arguments and returns results. Actually
|
|
|
+ this can be it's own TODO (see [[* source blocks as functions][source blocks as functions]]).
|
|
|
+*** Objectives [Dan]
|
|
|
+ - We want to provide convenient off-the-shelf actions
|
|
|
+ (e.g. plotting data) that make use of our new code evaluation
|
|
|
+ environment but do not require any actual coding.
|
|
|
+*** Initial Design proposal [Dan]
|
|
|
+ - *Input data* will be specified using the same mechanism as :var
|
|
|
+ references, thus the input data may come from a table, or
|
|
|
+ another source block, and it is initially available as an elisp
|
|
|
+ data structure.
|
|
|
+ - We introduce a new #+ line, e.g. #+BABELDO. C-c C-c on that
|
|
|
+ line will apply an *action* to the referenced data.
|
|
|
+ - *Actions correspond to source blocks*: our library of available
|
|
|
+ actions will be a library of org-babel source blocks. Thus the
|
|
|
+ code for executing an action, and the code for dealing with the
|
|
|
+ output of the action will be the same code as for executing
|
|
|
+ source blocks in general
|
|
|
+ - Optionally, the user can have the relevant source block inserted
|
|
|
+ into the org buffer after the (say) #+BABELDO line. This will
|
|
|
+ allow the user to fine tune the action by modifying the code
|
|
|
+ (especially useful for plots).
|
|
|
+ - So maybe a #+BABELDO line will have header args
|
|
|
+ - :data (a reference to a table or source code block)
|
|
|
+ - :action (or should that be :srcname?) which will be something
|
|
|
+ like :action pie-chart, referring to a source block which will
|
|
|
+ be executed with the :data referent passed in using a :var arg.
|
|
|
+ - :showcode or something controlling whether to show the code
|
|
|
+
|
|
|
+*** Modification to design
|
|
|
+ I'm implementing this, at least initially, as a new interpreter
|
|
|
+ named 'babel', which has an empty body. 'babel' blocks take
|
|
|
+ a :srcname header arg, and look for the source-code block with
|
|
|
+ that name. They then execute the referenced block, after first
|
|
|
+ appending their own header args on to the target block's header
|
|
|
+ args.
|
|
|
+
|
|
|
+ If the target block is in the library of babel (a.o.t. e.g. the
|
|
|
+ current buffer), then the code in the block will refer to the
|
|
|
+ input data with a name dictated by convention (e.g. __data__
|
|
|
+ (something which is syntactically legal in all languages...). Thus
|
|
|
+ the babel block will use a :var __data__ = whatever header arg to
|
|
|
+ reference the data to be plotted.
|
|
|
+
|
|
|
+** DONE Column names in R input/output
|
|
|
+ This has been implemented: Automatic on input to R; optional in
|
|
|
+ output. Note that this equates column names with the header row in
|
|
|
+ an org table; whereas org actually has a mechanism whereby a row
|
|
|
+ with a '!' in the first field defines column names. I have not
|
|
|
+ attempted to support these org table mechanisms yet. See [[*Support%20rownames%20and%20other%20org%20babel%20table%20features][this
|
|
|
+ DEFERRED todo item]].
|
|
|
** DONE use example block for large amounts of stdout output?
|
|
|
We're currently `examplizing' with : at the beginning of the line,
|
|
|
but should larger amounts of output be in a
|
|
|
@@ -2178,8 +2349,44 @@ packaged into Library of Babel functions.
|
|
|
(see [[* file result types][file result types]])
|
|
|
|
|
|
|
|
|
-* Bugs [22/34]
|
|
|
-** TODO avoid stripping whitespace from output when :results output
|
|
|
+* Bugs [24/36]
|
|
|
+** TODO allow srcname to omit function call parentheses
|
|
|
+ Someone needs to revisit those regexps. Is there an argument for
|
|
|
+ moving some of the regexps used to match function calls into
|
|
|
+ defvars? (i.e. in o-b.el and o-b-ref.el)
|
|
|
+
|
|
|
+** TODO creeping blank lines
|
|
|
+ There's still inappropriate addition of blank lines in some circumstances.
|
|
|
+
|
|
|
+ Hmm, it's a bit confusing. It's to do with o-b-remove-result. LoB
|
|
|
+ removes the entire (#+resname and result) and starts from scratch,
|
|
|
+ whereas #+begin_src only removes the result. I haven't worked out
|
|
|
+ what the correct fix is yet. Maybe the right thing to do is to make
|
|
|
+ sure that those functions (o-b-remove-result et al.) are neutral
|
|
|
+ with respect to newlines. Sounds easy, but...
|
|
|
+
|
|
|
+ E.g.
|
|
|
+
|
|
|
+#+begin_src sh
|
|
|
+b=5
|
|
|
+#+end_src
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Compare the results of
|
|
|
+#+lob: python-add(a=5, b=17)
|
|
|
+
|
|
|
+#+resname: python-add(a=5, b=17)
|
|
|
+: 22
|
|
|
+--------------------------------
|
|
|
+
|
|
|
+#+begin_src python
|
|
|
+23
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname:
|
|
|
+: 23
|
|
|
+---------------------
|
|
|
** TODO problem with newlines in output when :results value
|
|
|
#+begin_src python :results value
|
|
|
'\n'.join(map(str, range(4)))
|
|
|
@@ -2187,6 +2394,87 @@ packaged into Library of Babel functions.
|
|
|
|
|
|
#+resname:
|
|
|
: 0
|
|
|
+
|
|
|
+Whereas I was hoping for
|
|
|
+
|
|
|
+| 0 |
|
|
|
+| 1 |
|
|
|
+| 2 |
|
|
|
+| 3 |
|
|
|
+
|
|
|
+This is some sort of non-printing char / quoting issue I think. Note
|
|
|
+that
|
|
|
+
|
|
|
+#+begin_src python :results value
|
|
|
+'\\n'.join(map(str, range(4)))
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname:
|
|
|
+: 0\n1\n2\n3
|
|
|
+
|
|
|
+Also, note that
|
|
|
+#+begin_src python :results output
|
|
|
+print('\n'.join(map(str, range(4))))
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname:
|
|
|
+: 0
|
|
|
+: 1
|
|
|
+: 2
|
|
|
+: 3
|
|
|
+
|
|
|
+*** collapsing consecutive newlines in string output
|
|
|
+
|
|
|
+ This is an example of the same bug
|
|
|
+
|
|
|
+#+srcname: multi-line-string-output
|
|
|
+#+begin_src ruby :results output
|
|
|
+"the first line ends here
|
|
|
+
|
|
|
+
|
|
|
+ and this is the second one
|
|
|
+
|
|
|
+even a third"
|
|
|
+#+end_src
|
|
|
+
|
|
|
+This doesn't produce anything at all now. I believe that's because
|
|
|
+I've changed things so that :results output really does *not* get the
|
|
|
+value of the block, only the STDOUT. So if we add a print statement
|
|
|
+this works OK.
|
|
|
+
|
|
|
+#+srcname: multi-line-string-output
|
|
|
+#+begin_src ruby :results output
|
|
|
+print "the first line ends here
|
|
|
+
|
|
|
+
|
|
|
+ and this is the second one
|
|
|
+
|
|
|
+even a third"
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname:
|
|
|
+: the first line ends here
|
|
|
+:
|
|
|
+:
|
|
|
+: and this is the second one
|
|
|
+:
|
|
|
+: even a third
|
|
|
+
|
|
|
+However, the behaviour with :results value is wrong
|
|
|
+
|
|
|
+#+srcname: multi-line-string-value
|
|
|
+#+begin_src ruby
|
|
|
+"the first line ends here
|
|
|
+
|
|
|
+
|
|
|
+ and this is the second one
|
|
|
+
|
|
|
+even a third"
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname:
|
|
|
+: 0
|
|
|
+
|
|
|
** TODO prompt characters appearing in output with R
|
|
|
#+begin_src R :session *R* :results output
|
|
|
x <- 6
|
|
|
@@ -2219,20 +2507,6 @@ for example
|
|
|
#+end_src
|
|
|
|
|
|
#+resname: this-doesn't-match-orgtbl
|
|
|
-
|
|
|
-** TODO collapsing consecutive newlines in string output
|
|
|
-
|
|
|
-#+srcname: multi-line-string-output
|
|
|
-#+begin_src ruby :results output
|
|
|
-"the first line ends here
|
|
|
-
|
|
|
-
|
|
|
- and this is the second one
|
|
|
-
|
|
|
-even a third"
|
|
|
-#+end_src
|
|
|
-
|
|
|
-#+resname: multi-line-string-output
|
|
|
|
|
|
** PROPOSED external shell execution can't isolate return values
|
|
|
I have no idea how to do this as of yet. The result is that when
|
|
|
@@ -2261,36 +2535,13 @@ the same for the other languages. [Dan]
|
|
|
not org-babel-ruby-evaluate
|
|
|
** TODO use new merge function [[file:lisp/org-babel-ref.el::t%20nil%20org%20combine%20plists%20args%20nil][here]]?
|
|
|
And at other occurrences of org-combine-plists?
|
|
|
-** TODO creeping blank lines
|
|
|
- There's still inappropriate addition of blank lines in some circumstances. E.g.
|
|
|
-
|
|
|
-#+begin_src sh
|
|
|
-b=5
|
|
|
-#+end_src
|
|
|
-
|
|
|
-
|
|
|
- Compare the results of
|
|
|
-#+lob: python-add(a=5, b=17)
|
|
|
-
|
|
|
-#+resname: python-add(a=5, b=17)
|
|
|
-: 22
|
|
|
---------------------------------
|
|
|
-
|
|
|
-#+begin_src python
|
|
|
-23
|
|
|
-#+end_src
|
|
|
-
|
|
|
-#+resname:
|
|
|
-: 23
|
|
|
----------------------
|
|
|
-
|
|
|
- Hmm, it's a bit confusing. I think it's to do with the fact that
|
|
|
- LoB removes the entire (#+resname and result) and starts from
|
|
|
- scratch, whereas #+begin_src only removes the result. I haven't
|
|
|
- worked out what the correct fix is yet.
|
|
|
** TODO LoB is not populated on startup
|
|
|
org-babel-library-of-babel is nil for me on startup. I have to
|
|
|
evaluate the [[file:lisp/org-babel-lob.el::][org-babel-lob-ingest]] line manually.
|
|
|
+
|
|
|
+** DONE avoid stripping whitespace from output when :results output
|
|
|
+ This may be partly solved by using o-b-chomp rather than o-b-trim
|
|
|
+ in the o-b-LANG-evaluate functions.
|
|
|
** DEFERRED weird escaped characters in shell prompt break shell evaluation
|
|
|
E.g. this doesn't work. Should the shell sessions set a sane prompt
|
|
|
when they start up? Or is it a question of altering
|
|
|
@@ -2319,6 +2570,48 @@ b=5
|
|
|
the user's regular emacs init. I can't think of a way for us to
|
|
|
set this automatically, and we are SOL without a regexp to match
|
|
|
the prompt.
|
|
|
+** DONE function calls in #+srcname: refs
|
|
|
+
|
|
|
+ My srcname references don't seem to be working for function
|
|
|
+ calls. This needs fixing.
|
|
|
+
|
|
|
+#+srcname: called()
|
|
|
+#+begin_src python
|
|
|
+59
|
|
|
+#+end_src
|
|
|
+
|
|
|
+srcname function call doesn't work for calling a source block
|
|
|
+#+srcname: caller(var1=called())
|
|
|
+#+begin_src python
|
|
|
+var1
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname: caller
|
|
|
+: 59
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+They do work for a simple reference
|
|
|
+#+srcname: caller2(var1=56)
|
|
|
+#+begin_src python
|
|
|
+var1
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname: caller2
|
|
|
+: 59
|
|
|
+
|
|
|
+
|
|
|
+and they do work for :var header arg
|
|
|
+#+srcname: caller3
|
|
|
+#+begin_src python :var var1=called()
|
|
|
+var1
|
|
|
+#+end_src
|
|
|
+
|
|
|
+#+resname:
|
|
|
+: 58
|
|
|
** DONE LoB: with output to buffer, not working in buffers other than library-of-babel.org
|
|
|
*** Initial report
|
|
|
I haven't fixed this yet. org-babel-ref-resolve-reference moves
|
|
|
@@ -2771,6 +3064,7 @@ of these tests may fail.
|
|
|
#+TBLFM: $5='(if (= (length $3) 1) (progn (message (format "running %S" '(sbe $2 (n $3)))) (sbe $2 (n $3))) (sbe $2))::$6='(if (string= $4 $5) "pass" (format "expected %S but was %S" $4 $5))
|
|
|
#+TBLFM: $5=""::$6=""
|
|
|
|
|
|
+
|
|
|
The second TBLFM line (followed by replacing '[]' with '') can be used
|
|
|
to blank out the table results, in the absence of a better method.
|
|
|
|