Difference between revisions of "AddingFunctions"

From WeBWorK_wiki
Jump to navigation Jump to search
Line 2: Line 2:
   
 
<p style="background-color:#eeeeee;border:black solid 1px;padding:3px;">
 
<p style="background-color:#eeeeee;border:black solid 1px;padding:3px;">
<em>This code snippet shows the essential PG code to add a named function to the Context in a problem. (March 2010: There is a easier way to do this: [http://webwork.maa.org/doc/cvs/pg_CURRENT/macros/parserFunction.pl.html parserFunction.pl.html].) Note that these are <b>insertions</b>, not a complete PG file. This code will have to be incorporated into the problem file on which you are working. (The information here is taken from [http://webwork.maa.org/moodle/mod/forum/discuss.php?d=6194 this discussion thread] and [http://cvs.webwork.rochester.edu/viewcvs.cgi/webwork2/doc/parser/extensions/1-function.pg?rev=1.6&content-type=text/vnd.viewcvs-markup a sample problem] in the doc/parser/extensions directory of the WeBWorK tree.)</em>
+
<em>This code snippet shows the essential PG code to add a named function to the Context in a problem. Note that these are <b>insertions</b>, not a complete PG file. This code will have to be incorporated into the problem file on which you are working. </em>
 
</p>
 
</p>
   
   
  +
<ul>
  +
<li><b>Example 1:</b> The newer and easier way to add a function to the context.</li>
  +
<li><b>Example 2:</b> The rudimentary way to add a function to the context.</li>
  +
</ul>
   
 
<p style="background-color:#eeeeee;border:black solid 1px;padding:3px;">
 
<p style="background-color:#eeeeee;border:black solid 1px;padding:3px;">
<em>Example 1: The newer and easier way to add a function to the context.</em>
+
<em><b>Example 1:</b> The newer and easier way to add a function to the context.</em>
 
</p>
 
</p>
   
Line 34: Line 38:
 
<p>
 
<p>
 
<b>Initializaiton and Setup:</b>
 
<b>Initializaiton and Setup:</b>
We need to load the <code>parserFunction.pl</code> macro, and then use one of its routines to define a new function that students may type in their answers.
+
We need to load the <code>parserFunction.pl</code> macro, and then use one of its routines to define a new function that students may type in their answers. For more information, see [http://webwork.maa.org/doc/cvs/pg_CURRENT/macros/parserFunction.pl.html parserFunction.pl.html]
 
</p>
 
</p>
 
</td>
 
</td>
Line 52: Line 56:
   
 
<p style="background-color:#eeeeee;border:black solid 1px;padding:3px;">
 
<p style="background-color:#eeeeee;border:black solid 1px;padding:3px;">
<em>Example 2: The rudimentary way to add a function to the context.</em>
+
<em><b>Example 2:</b> The rudimentary way to add a function to the context.
  +
<br />
  +
<br />
  +
(The information here is taken from [http://webwork.maa.org/moodle/mod/forum/discuss.php?d=6194 this discussion thread] and [http://cvs.webwork.rochester.edu/viewcvs.cgi/webwork2/doc/parser/extensions/1-function.pg?rev=1.6&content-type=text/vnd.viewcvs-markup a sample problem] in the doc/parser/extensions directory of the WeBWorK tree.)</em>
 
</p>
 
</p>
   

Revision as of 00:21, 21 March 2010

Adding Functions to the Context: PG Code Snippet

This code snippet shows the essential PG code to add a named function to the Context in a problem. Note that these are insertions, not a complete PG file. This code will have to be incorporated into the problem file on which you are working.


  • Example 1: The newer and easier way to add a function to the context.
  • Example 2: The rudimentary way to add a function to the context.

Example 1: The newer and easier way to add a function to the context.

Problem Techniques Index

PG problem file Explanation
loadMacros(
"MathObjects.pl",
"parserFunction.pl",
);

parserFunction("f(x,y)" => "sqrt(x*y)");

Initializaiton and Setup: We need to load the parserFunction.pl macro, and then use one of its routines to define a new function that students may type in their answers. For more information, see parserFunction.pl.html

Problem Techniques Index





Example 2: The rudimentary way to add a function to the context.

(The information here is taken from this discussion thread and a sample problem in the doc/parser/extensions directory of the WeBWorK tree.)

Problem Techniques Index

PG problem file Explanation
  package NewFunc;
  # this next line makes the function a 
  #   function from reals to reals
  our @ISA = qw(Parser::Function::numeric);

  sub log2 {
    shift; my $x = shift;
    return CORE::log($x)/CORE::log(2);
  }

  package main;

  # Make it work on formulas as well as numbers
  sub log2 {Parser::Function->call('log2',@_)}

  #  Add the new functions to the Context
  Context()->functions->add(
    log2 => {class => 'NewFunc',
             TeX => '\log_2'}, );

To define our new function, we first create a class in which it can live, where the behavior of the function is articulated, and then we add the function to the Context for the problem. Here, we borrow from the extensions sample provided in the webwork2/doc directory of the distribution and define a log base 2 function. If we didn't have any fancy TeX formatting for the function we could omit that hash key in the functions->add() call from the Context.

We can define a multivariable function by changing the inheritance list: if we had our ISA = qw(Parser::Function::numeric2);, then our function would be a two-variable function, f(x,y), and the subroutine defining it would take two variable arguments:

  sub f {
    shift; my ( $x, $y ) = @_;
    ...
  }
  BEGIN_TEXT
  Solve \( 2^{3x} = 5 \): 
  \( x = \) \{ ans_rule(25) \}
  $BR
  ${BITALIC}(Your answer may involve the 
  function \(log_2(x)\), which you should
  enter as ${BTT}log2(x)$ETT.)$EITALIC
  END_TEXT

The problem text is as we would expect, except that we are allowed to use the function that we defined in the problem text.

  ANS( Compute("(1/3)*log2(5)")->cmp() );

And then in the answer and solution section of the problem the function may also be used.

Problem Techniques Index