Eric Schulte <schulte.e...@gmail.com> writes: > Eric Abrahamsen <e...@ericabrahamsen.net> writes: > >> Gary Oberbrunner <ga...@oberbrunner.com> writes: >> >>> It seems like you can define "procedures" in org-mode and call them >>> from elsewhere, with args. >>> But I'm not sure how well-defined that process is; the documentation >>> is not completely perfect yet I think. Here's one thing I'm trying >>> that seems not to work. >>> >>> I define a "procedure" as a named ref called recorddate with two args, >>> ver and order. The idea is I could later call that with different >>> values of those args. >>> >>> #+NAME: recorddate(order="desc") >>> #+BEGIN_SRC sql :exports none :colnames no :results scalar >>> select Event.CreatedAt from Event join MachineInfo as MI on >>> Event.MachineInfoId=MI.Id >>> where Event.CreatedAt is not NULL order by CreatedAt $order limit 1; >>> #+END_SRC sql >>> >>> (BTW, I really like how $ vars are substituted into SQL. Nice.) But >>> when I try to call it like this: >>> >>> * earliest record is call_recorddate(ver="'.'", order="asc") >>> or like this: >>> #+CALL: recorddate(ver="'.'", order="asc") >>> >>> and I try to export as LaTeX (or anything), I get >>> org-babel-ref-resolve: Reference 'recorddate' not found in this buffer >>> >>> Is this supposed to work? >> > > Yes, your example should work. From the "Evaluating code blocks" > section of the Org-mode manual. > > ,---- > | It is also possible to evaluate named code blocks from anywhere in an > | Org mode buffer or an Org mode table. Live code blocks located in the > | current Org mode buffer or in the "Library of Babel" (see *note Library > | of Babel::) can be executed. Named code blocks can be executed with a > | separate '#+CALL:' line or inline within a block of text. > `---- > > There is no need to load code blocks in the same buffer into the library > of babel.
I think what he (and I, when I tried his version) ran into is that without a ":var" attribute on the named code block, you get the "not found" error. Ie, simply declaring #+name: recorddate(order="desc") isn't enough to let the block know to expect the var. Presumably that *should* be an error, as the variable should be declared before being used, but the actual error message is a little misleading. Eric > This example works for me evaluating code blocks in the same buffer > using call lines. > > #+Title: Call Example > > #+name: example-block > #+begin_src sh :var input="" > echo "input is $input" > #+end_src > > Here's a simple call using a named argument. > #+call: example-block(input="foo") > > #+RESULTS: example-block(input="foo") > : input is foo > > It also works with a positional argument. > #+call: example-block("bar") > > #+RESULTS: example-block("bar") > : input is bar > > When I export this to e.g., html I get the following. > > Call Example > > Call Example > > echo "input is $input" > > Here's a simple call using a named argument. > > > input is foo > > It also works with a positional argument. > > > input is bar > > Date: 2013-04-01T19:39-0600 > > Author: > > Org version 7.9.3f with Emacs version 24 > > Validate XHTML 1.0 > > > The call lines are replaced with their results as part of the export > process. > > If the above doesn't work for you, then I imagine something is wrong > with your install.