Eric

In line with my earlier posts, I would like to think of Babel codeblocks
filters that take as a textual content and produce another textual
content. Think of babel codeblocks as indeed custom exporters.

Power of Babel is the flexibility that the user gets in associating
different code blocks with the same content and have different
representations produced for the same.

Let's revisit the original example. Let me walk through the whole
sequence ...

# Input Textual Content

# User need not say that the content is table. It is obvious. In other
# words babel is dynamically typed and tables are one of the primitive
# datatypes within Babel runtime environment. Name of the table is the
# name of the headline.

* tableTestBabel
  |   0 | 4.40 |
  |  30 | 4.54 |
  |  60 | 7.09 |
  |  90 | 9.40 |
  | 120 | 9.22 |
  | 150 | 6.65 |
  | 180 | 4.22 |


# Output Textual Content 
testBabel.pdf

# Babel block named 'charPolAngle' is the custom exporter which would
# act on the input text and produce an output text. 

# Note that the signature of the chartPolAngle and the use of a reserved
# babel keyword 'this' which stand for the input textual content.

#+srcname: chartPolAngle()
#+begin_src R
  angle <- this[,1]
  energy <- this[,2]
  plot(angle,energy)
  energy.model <-  nls (energy ~ a1 + a2 * (sin(pi / a3 *(angle-a4)))^2,
start=list(a1=3.0, a2=7.0, a3=180, a4=0.0))
  lines(spline(angle, fitted.values(energy.model)), lwd=2)
  summary(energy.model)
#+end_src


# To make a call, the user executes the headline and passes it the
# custom routine.

# Transform text
<<tableTestBabel (:fmt chartPolAngle)>>
  ^^^^^^^^^^^^^

With this shift in call syntax one could do these with obvious
interpretation.


<<tabletestBabel>> # identity mapping 
<<tabletestBabel (:fmt csv)>> # map to csv 
<<tabletestBabel (:fmt latex)>> # map to latex


To summarize Babel srcnames takes the following params as a must (they
could be implicit)

1. A 'this' parameterw which is input text content. An headline entry in
   the above example.

A babel invocation line takes a ':fmt ' param. It could be one of the
inbuilt exporters like text, org, latex, pdf etc or left unspecified if
the babel srcblock always produces only one format.

It would also be usefult to specify how the transformed text is handled
by a babel srcblock. Let's denote this param as :results

If :results is nil then the exporter creates a side-effect. i.e., it
produces a pdf file. 

If :results is inline then output text content is inserted inline i.e.,
wherever the macro invocation occurs.

If :results is a Org Headline then output text content is inserted in
that headline.

To summarize, Babel macros acts on text blocks and produces text
blocks. 

A babel macro with names outfmt is invoked as 
<<org headline (:fmt outfmt :results X)>>

or as 

[[outfmt][input text content]]

Let me know if you have questions.

My lack of understanding of Babel's internals prevents me from being
more specific or anticipate the issues involved. 

Nevertheless a shift in perspective from

babel-src(intxt)

to 

intxt(babel-src) is what is required.


I invite you to go through my earlier mails[1]. Each one of them takes
examples that have already surfaced in the mailing list and tries to
reconcile what the user likes to accomplish with Babel macros with what
the Org's existing world view is.

Let me know whether or not I make sense.


ps: I haven't really tried to address issues reported by the original
poster. I need to have a buyin from you on what I am proposing before I
am willing to put that effort.

[1] http://article.gmane.org/gmane.emacs.orgmode/30040

Jambunathan K.

>
> #+call: chartPolAngle[:session testBabel :file 
> testBabel.pdf](pol=tableTestBabel)
>

> I'd be interested to hear what the community thinks of this new syntax.
>
> As an unrelated note, we also need to think of a natural way to allow
> the header argument portion of a code block to span multiple lines.
>
> Best -- Eric
>
> Christopher Witte <ch...@witte.net.au> writes:
>
>> I'm having a bit of trouble with org bable and R. When I try to execute the
>> code below (C-c C-c on the call line), as you can see, I get the results
>> :nil
>>
>> ---------------------------------------
>> #+tblname: tableTestBabel
>> |   0 | 4.40 |
>> |  30 | 4.54 |
>> |  60 | 7.09 |
>> |  90 | 9.40 |
>> | 120 | 9.22 |
>> | 150 | 6.65 |
>> | 180 | 4.22 |
>>
>> #+srcname: chartPolAngle(pol)
>> #+begin_src R
>>   angle <- pol[,1]
>>   energy <- pol[,2]
>>   plot(angle,energy)
>>   energy.model <-  nls (energy ~ a1 + a2 * (sin(pi / a3 *(angle-a4)))^2,
>> start=list(a1=3.0, a2=7.0, a3=180, a4=0.0))
>>   lines(spline(angle, fitted.values(energy.model)), lwd=2)
>>   summary(energy.model)
>> #+end_src
>>
>> #+call: chartPolAngle(pol=tableTestBabel) :session testBabel :file 
>> testBabel.pdf
>>
>> #+results: chartPolAngle(pol=tableTestBabel)
>> : nil
>> ------------------------------------
>>
>> but If I move the header arguments to the source block, as in the code
>> below, everything works fine. I also get asked "ESS [S(R): R] starting data
>> directory? ~/doc/org/" which I don't get with the code above.
>>
>> ---------------------------------------
>> #+tblname: tableTestBabel
>> |   0 | 4.40 |
>> |  30 | 4.54 |
>> |  60 | 7.09 |
>> |  90 | 9.40 |
>> | 120 | 9.22 |
>> | 150 | 6.65 |
>> | 180 | 4.22 |
>>
>> #+call: chartPolAngle(pol=tableTestBabel)
>>
>> #+results: chartPolAngle(pol=tableTestBabel)
>> : testBabel.pdf
>>
>>
>> #+srcname: chartPolAngle(pol)
>> #+begin_src R :session testBabel :file testBabel.pdf
>>   angle <- pol[,1]
>>   energy <- pol[,2]
>>   plot(angle,energy)
>>   energy.model <-  nls (energy ~ a1 + a2 * (sin(pi / a3 *(angle-a4)))^2,
>> start=list(a1=3.0, a2=7.0, a3=180, a4=0.0))
>>   lines(spline(angle, fitted.values(energy.model)), lwd=2)
>>   summary(energy.model)
>> #+end_src
>> ---------------------------------------
>>
>> Org doesn't appear to respect the head arguments on the call. I pulled from
>> git a couple days ago. Any ideas why?
>>
>> Cheers
>> Chris Witte
>> _______________________________________________
>> Emacs-orgmode mailing list
>> Please use `Reply All' to send replies to the list.
>> Emacs-orgmode@gnu.org
>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode

_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

Reply via email to