1 ## Copyright (C) 2000-2012 Paul Kienzle
3 ## This file is part of Octave.
5 ## Octave is free software; you can redistribute it and/or modify it
6 ## under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
10 ## Octave is distributed in the hope that it will be useful, but
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 ## General Public License for more details.
15 ## You should have received a copy of the GNU General Public License
16 ## along with Octave; see the file COPYING. If not, see
17 ## <http://www.gnu.org/licenses/>.
20 ## @deftypefn {Command} {} demo @var{name}
21 ## @deftypefnx {Command} {} demo @var{name} @var{n}
22 ## @deftypefnx {Function File} {} demo ('@var{name}')
23 ## @deftypefnx {Function File} {} demo ('@var{name}', @var{n})
25 ## Run example code block @var{n} associated with the function @var{name}.
26 ## If @var{n} is not specified, all examples are run.
28 ## Examples are stored in the script file, or in a file with the same
29 ## name but no extension located on Octave's load path. To keep examples
30 ## separate from regular script code, all lines are prefixed by @code{%!}. Each
31 ## example must also be introduced by the keyword 'demo' flush left to the
32 ## prefix with no intervening spaces. The remainder of the example can
33 ## contain arbitrary Octave code. For example:
38 ## %! t=0:0.01:2*pi; x = sin (t);
40 ## %! %-------------------------------------------------
41 ## %! % the figure window shows one cycle of a sine wave
45 ## Note that the code is displayed before it is executed, so a simple
46 ## comment at the end suffices for labeling what is being shown. It is
47 ## generally not necessary to use @code{disp} or @code{printf} within the demo.
49 ## Demos are run in a function environment with no access to external
50 ## variables. This means that every demo must have separate initialization
51 ## code. Alternatively, all demos can be combined into a single large demo
55 ## %! input("Press <enter> to continue: ","s");
59 ## between the sections, but this is discouraged. Other techniques
60 ## to avoid multiple initialization blocks include using multiple plots
61 ## with a new @code{figure} command between each plot, or using @code{subplot}
62 ## to put multiple plots in the same window.
64 ## Also, because demo evaluates within a function context, you cannot
65 ## define new functions inside a demo. If you must have function blocks,
66 ## rather than just anonymous functions or inline functions, you will have to
67 ## use @code{eval(example('function',n))} to see them. Because eval only
68 ## evaluates one line, or one statement if the statement crosses
69 ## multiple lines, you must wrap your demo in "if 1 <demo stuff> endif"
70 ## with the 'if' on the same line as 'demo'. For example:
83 ## @seealso{test, example}
86 ## FIXME: modify subplot so that gnuplot_has_multiplot == 0 causes it to
87 ## use the current figure window but pause if not plotting in the
90 function demo (name, n)
92 if (nargin < 1 || nargin > 2)
102 [code, idx] = test (name, "grabdemo");
104 warning ("no demo available for %s", name);
106 elseif (n >= length (idx))
107 warning ("only %d demos available for %s", length (idx) - 1, name);
114 doidx = 1:length(idx)-1;
116 for i = 1:length (doidx)
117 ## Pause between demos
119 input ("Press <enter> to continue: ", "s");
122 ## Process each demo without failing
124 block = code(idx(doidx(i)):idx(doidx(i)+1)-1);
125 ## FIXME: need to check for embedded test functions, which cause
126 ## segfaults, until issues with subfunctions in functions are resolved.
127 embed_func = regexp (block, '^\s*function ', 'once', 'lineanchors');
128 if (isempty (embed_func))
129 ## Use an environment without variables
130 eval (cstrcat ("function __demo__()\n", block, "\nendfunction"));
131 ## Display the code that will be executed before executing it
132 printf ("%s example %d:%s\n\n", name, doidx(i), block);
135 error (["Functions embedded in %!demo blocks are not allowed.\n", ...
136 "Use the %!function/%!endfunction syntax instead to define shared functions for testing.\n"]);
139 ## Let the programmer know which demo failed.
140 printf ("%s example %d: failed\n%s\n", name, doidx(i), lasterr ());
148 %! t=0:0.01:2*pi; x = sin(t);
150 %! %-------------------------------------------------
151 %! % the figure window shows one cycle of a sine wave
154 %!error demo (1, 2, 3);