|  | @@ -10,10 +10,10 @@ but code to be evaluated. Org files have 3 main export targets: org,
 | 
	
		
			
				|  |  |  html and latex. Once we have implemented a smooth bi-directional flow
 | 
	
		
			
				|  |  |  of data between org-mode formats (including tables, and maybe lists
 | 
	
		
			
				|  |  |  and property values) and source-code blocks, we will be able to use
 | 
	
		
			
				|  |  | -org-mode's built in export to publish this data in any org-supported
 | 
	
		
			
				|  |  | -format using org-mode as an intermediate format.  We have a current
 | 
	
		
			
				|  |  | -focus on R code, but we are regarding that more as a working example
 | 
	
		
			
				|  |  | -than as a defining feature of the project.
 | 
	
		
			
				|  |  | +org-mode's built in export to publish the results of evaluated source
 | 
	
		
			
				|  |  | +code in any org-supported format using org-mode as an intermediate
 | 
	
		
			
				|  |  | +format.  We have a current focus on R code, but we are regarding that
 | 
	
		
			
				|  |  | +more as a working example than as a defining feature of the project.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  The main objectives of this project are...
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -23,16 +23,17 @@ The main objectives of this project are...
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - [[* evaluation of embedded source code][evaluation of embedded source code]]
 | 
	
		
			
				|  |  |    - [[* execution on demand and on export][execution on demand and on export]]
 | 
	
		
			
				|  |  | -  - [[* evaluation of source blocks][evaluation of source blocks]]
 | 
	
		
			
				|  |  | +  - [[* source blocks][source blocks]]
 | 
	
		
			
				|  |  |    - [[* inline source evaluation][inline source evaluation]]
 | 
	
		
			
				|  |  | +  - [[* included source file evaluation][included source file evaluation]] ?? maybe
 | 
	
		
			
				|  |  | +  - [[* caching of evaluation][caching of evaluation]]
 | 
	
		
			
				|  |  |  - [[* interaction with the source-code's process][interaction with the source-code's process]]
 | 
	
		
			
				|  |  |  - [[* output of code evaluation][output of code evaluation]]
 | 
	
		
			
				|  |  |    - [[* textual/numeric output][textual/numeric output]]
 | 
	
		
			
				|  |  |    - [[* graphical output][graphical output]]
 | 
	
		
			
				|  |  |    - [[* file creation][non-graphics file creation]]
 | 
	
		
			
				|  |  |    - [[* side effects][side effects]]
 | 
	
		
			
				|  |  | -- [[* reference to data and evaluation results][reference to data and evaluation results]]: This could happen in many
 | 
	
		
			
				|  |  | -  directions
 | 
	
		
			
				|  |  | +- [[* reference to data and evaluation results][reference to data and evaluation results]]
 | 
	
		
			
				|  |  |    - [[* reference format][reference format]]
 | 
	
		
			
				|  |  |    - [[* source-target pairs][source-target pairs]]
 | 
	
		
			
				|  |  |      - [[* source block output from org tables][source block output from org tables]]
 | 
	
	
		
			
				|  | @@ -42,7 +43,6 @@ The main objectives of this project are...
 | 
	
		
			
				|  |  |      - [[* org table from org table][org table from org table]]
 | 
	
		
			
				|  |  |      - [[* org properties from source block][org properties from source block]]
 | 
	
		
			
				|  |  |      - [[* org properties from org table][org properties from org table]]
 | 
	
		
			
				|  |  | -- [[* caching of evaluation][caching of evaluation]]
 | 
	
		
			
				|  |  |  - [[* export][export]]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -114,10 +114,50 @@ The main objectives of this project are...
 | 
	
		
			
				|  |  |        Like org-R, this achieves org \to org* in elisp by visiting code
 | 
	
		
			
				|  |  |        blocks and using ESS to evaluate R code.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -*** evaluation of source blocks
 | 
	
		
			
				|  |  | +*** source blocks
 | 
	
		
			
				|  |  |  (see [[* Special editing and evaluation of source code][Special editing and evaluation of source code]])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  *** inline source evaluation
 | 
	
		
			
				|  |  | +*** included source file evaluation
 | 
	
		
			
				|  |  | +It may be nice to be able to include an entire external file of source
 | 
	
		
			
				|  |  | +code, and then evaluate and export that code as if it were in the
 | 
	
		
			
				|  |  | +file.  The format for such a file inclusion could optionally look like
 | 
	
		
			
				|  |  | +the following
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +: #+include_src filename header_arguments
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +*** caching of evaluation
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Any kind of code that can have a block evaluated could optionally define
 | 
	
		
			
				|  |  | +a function to write the output to a file, or to serialize the output of
 | 
	
		
			
				|  |  | +the function.  If a document or block is configured to cache input,
 | 
	
		
			
				|  |  | +write all cached blocks to their own files and either a) hash them, or
 | 
	
		
			
				|  |  | +b) let git and org-attach track them.  Before a block gets eval'd, we
 | 
	
		
			
				|  |  | +check to see if it has changed.  If a document or block is configured to
 | 
	
		
			
				|  |  | +cache output and a print/serialize function is available, write the
 | 
	
		
			
				|  |  | +output of each cached block to its own file.  When the file is eval'd
 | 
	
		
			
				|  |  | +and some sort of display is called for, only update the display if the
 | 
	
		
			
				|  |  | +output has changed.  Each of these would have an override, presumably
 | 
	
		
			
				|  |  | +something like (... & force) that could be triggered with a prefix arg
 | 
	
		
			
				|  |  | +to the eval or export function.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +For R, I would say
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#+begin_src emacs-lisp
 | 
	
		
			
				|  |  | +;; fake code that only pretends to work
 | 
	
		
			
				|  |  | +(add-hook 'rorg-store-output-hook 
 | 
	
		
			
				|  |  | +    '("r" lambda (block-environment block-label)
 | 
	
		
			
				|  |  | +        (ess-exec (concat "save.image("
 | 
	
		
			
				|  |  | +                          block-environment
 | 
	
		
			
				|  |  | +                          ", file = " block-label
 | 
	
		
			
				|  |  | +                          ".Rdata, compress=TRUE)"))))
 | 
	
		
			
				|  |  | +#+end_src
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The idea being that for r blocks that get eval'd, if output needs to be
 | 
	
		
			
				|  |  | +stored, you should write the entire environment that was created in that
 | 
	
		
			
				|  |  | +block to an Rdata file.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(see [[* block scoping][block scoping]])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ** interaction with the source-code's process
 | 
	
		
			
				|  |  |  We should settle on a uniform API for sending code and receiving
 | 
	
	
		
			
				|  | @@ -201,13 +241,6 @@ source-target pairs
 | 
	
		
			
				|  |  |  **** org properties from source block
 | 
	
		
			
				|  |  |  **** org properties from org table
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -** caching of evaluation
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -I'm personally not clear on how this would be implemented, but it does
 | 
	
		
			
				|  |  | -seem to be important.  I'd be interested to hear how Sweave
 | 
	
		
			
				|  |  | -accomplished this.  Should it be based on tracking changes in source
 | 
	
		
			
				|  |  | -blocks.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  ** export
 | 
	
		
			
				|  |  |  once the previous objectives are met export should be fairly simple.
 | 
	
		
			
				|  |  |  Basically it will consist of triggering the evaluation of source code
 | 
	
	
		
			
				|  | @@ -219,7 +252,7 @@ through the htmlp and latexp variables, and can then create quoted
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  * Notes
 | 
	
		
			
				|  |  | -** Special editing and evaluation of source code
 | 
	
		
			
				|  |  | +** Block Formats
 | 
	
		
			
				|  |  |     Unfortunately org-mode how two different block types, both useful.
 | 
	
		
			
				|  |  |     In developing RweaveOrg, a third was introduced.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -230,8 +263,7 @@ through the htmlp and latexp variables, and can then create quoted
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     Note that upper and lower case are not relevant in block headings.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -*** block format
 | 
	
		
			
				|  |  | -**** PROPOSED block format
 | 
	
		
			
				|  |  | +*** PROPOSED block format
 | 
	
		
			
				|  |  |  I (Eric) propose that we use the syntax of source code blocks as they
 | 
	
		
			
				|  |  |  currently exist in org-mode with the addition of *evaluation*,
 | 
	
		
			
				|  |  |  *header-arguments*, *exportation*, *single-line-blocks*, and
 | 
	
	
		
			
				|  | @@ -284,16 +316,21 @@ Single-line Block
 | 
	
		
			
				|  |  |    single line block.  Suggestions? Can we just leave them out?  Dan:
 | 
	
		
			
				|  |  |    I'm not too worried about single line blocks to start off
 | 
	
		
			
				|  |  |    with. Their main advantage seems to be that they save 2 lines.
 | 
	
		
			
				|  |  | +  Eric: Fair enough, lets not worry about this now, also I would guess
 | 
	
		
			
				|  |  | +  that any code simple enough to fit on one line wouldn't need header
 | 
	
		
			
				|  |  | +  arguments anyways.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Include Block
 | 
	
		
			
				|  |  |  : #+include_src lang filename header-arguments
 | 
	
		
			
				|  |  |  - I think this would be useful, and should be much more work (Dan:
 | 
	
		
			
				|  |  | -  didn't get the meaning of that last clause!?).  That way whole
 | 
	
		
			
				|  |  | -  external files of source code could be evaluated as if they were an
 | 
	
		
			
				|  |  | -  inline block. Dan: again I'd say not a massive priority, as I think
 | 
	
		
			
				|  |  | -  all the languages we have in mind have facilities for doing this
 | 
	
		
			
				|  |  | -  natively, thus I think the desired effect can often be achieved from
 | 
	
		
			
				|  |  | -  within a #+begin_src block.
 | 
	
		
			
				|  |  | +  didn't get the meaning of that last clause!?).  Eric: scratch that,
 | 
	
		
			
				|  |  | +  I meant "*shouldn't* be too much work" :) That way whole external
 | 
	
		
			
				|  |  | +  files of source code could be evaluated as if they were an inline
 | 
	
		
			
				|  |  | +  block. Dan: again I'd say not a massive priority, as I think all the
 | 
	
		
			
				|  |  | +  languages we have in mind have facilities for doing this natively,
 | 
	
		
			
				|  |  | +  thus I think the desired effect can often be achieved from within a
 | 
	
		
			
				|  |  | +  #+begin_src block.  Eric: Agreed, while this would be a nice thing
 | 
	
		
			
				|  |  | +  to include we shouldn't wast too much effort on it in the beginning.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  What do you think?  Does this accomplish everything we want to be able
 | 
	
		
			
				|  |  |  to do with embedded R source code blocks?
 | 
	
	
		
			
				|  | @@ -316,6 +353,7 @@ function through the `org-eval-light-interpreters' variable.
 | 
	
		
			
				|  |  |  date
 | 
	
		
			
				|  |  |   #+end_src
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +*** existing formats
 | 
	
		
			
				|  |  |  **** Source code blocks 
 | 
	
		
			
				|  |  |      Org has an extremely useful method of editing source code and
 | 
	
		
			
				|  |  |      examples in their native modes.  In the case of R code, we want to
 | 
	
	
		
			
				|  | @@ -360,11 +398,17 @@ a
 | 
	
		
			
				|  |  |  regardless of the syntax/format chosen for the source blocks, we will
 | 
	
		
			
				|  |  |  need to be able to pass a list of parameters to these blocks.  These
 | 
	
		
			
				|  |  |  should include (but should certainly not be limited to)
 | 
	
		
			
				|  |  | -- label of the block
 | 
	
		
			
				|  |  | -- names of file to which graphical/textual/numerical/tabular output
 | 
	
		
			
				|  |  | -  should be written
 | 
	
		
			
				|  |  | -- flags for when/if the block should be evaluated (on export etc...)
 | 
	
		
			
				|  |  | -- flags for how the results of the export should be displayed/included
 | 
	
		
			
				|  |  | +- label or id :: Label of the block, should we provide facilities for
 | 
	
		
			
				|  |  | +                 automatically generating a unique one of these?
 | 
	
		
			
				|  |  | +- file :: names of file to which graphical/textual/numerical/tabular output
 | 
	
		
			
				|  |  | +  should be written.  Do we need this, or should this be controlled
 | 
	
		
			
				|  |  | +  through the source code itself?
 | 
	
		
			
				|  |  | +- not sure of a good name here :: flags for when/if the block should
 | 
	
		
			
				|  |  | +     be evaluated (on export etc...)
 | 
	
		
			
				|  |  | +- again can't thing of a concise name :: flags for how the results of
 | 
	
		
			
				|  |  | +     the export should be displayed/included
 | 
	
		
			
				|  |  | +- scope :: flag indicating whether the block should have a local or
 | 
	
		
			
				|  |  | +           global scope
 | 
	
		
			
				|  |  |  - flags specific to the language of the source block
 | 
	
		
			
				|  |  |  - etc...
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -376,12 +420,43 @@ different components which have to interactive with R including:
 | 
	
		
			
				|  |  |  - automatic evaluation on export
 | 
	
		
			
				|  |  |  - evaluation of \R{} snippets
 | 
	
		
			
				|  |  |  - evaluation of single source code lines
 | 
	
		
			
				|  |  | +- evaluation of included source code files
 | 
	
		
			
				|  |  |  - sending/receiving vector data
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  I think we currently have two implementations of interaction with R
 | 
	
		
			
				|  |  |  processes; [[file:existing_tools/org-R.el][org-R.el]] and [[file:existing_tools/exp-blocks/org-exp-blocks.el ][org-exp-blocks.el]].  We should be sure to take
 | 
	
		
			
				|  |  |  the best of each of these approaches.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +More on the exchange of data at between org-mode and source code
 | 
	
		
			
				|  |  | +blocks at [[* reference to data and evaluation results][reference to data and evaluation results]].
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +** block scoping
 | 
	
		
			
				|  |  | +(see [[* caching of evaluation][caching of evaluation]])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This inadvertently raises the issue of scoping.  The pretend function
 | 
	
		
			
				|  |  | +pretends that we will create a block-local scope, and that we can save
 | 
	
		
			
				|  |  | +just the things in that scope.  Sweave takes the make-everything-global
 | 
	
		
			
				|  |  | +approach.  I can see advantages either way.  If we make block-local
 | 
	
		
			
				|  |  | +scopes, we can save each one independently, and generally speaking it
 | 
	
		
			
				|  |  | +seems like more granularity==more control.  If we make everything
 | 
	
		
			
				|  |  | +global, we can refer to entities declared in earlier blocks without
 | 
	
		
			
				|  |  | +having to explicitly import those entities into the current block.  I
 | 
	
		
			
				|  |  | +think this counts in the "need to think about it early on" category.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If we did want block-local scopes, in R we can start every eval with
 | 
	
		
			
				|  |  | +something like
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +;; fake code that pretends to create a new, empty environment
 | 
	
		
			
				|  |  | +(ess-exec (concat block-env " <- new.env()"))
 | 
	
		
			
				|  |  | +(ess-exec (concat "eval(" block-contents ", envir=" block-env ")"))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If we decide we want block-scoping, I'm sure Dan and I can figure out
 | 
	
		
			
				|  |  | +the right way to do this in R, if he hasn't already.  I haven't thought
 | 
	
		
			
				|  |  | +at all about how these scope issues generalize to, say, bash blocks.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Maybe this is something that should be controlled by a header
 | 
	
		
			
				|  |  | +argument?
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  * Tasks
 | 
	
		
			
				|  |  |  
 |