[system] / trunk / pg / macros / parserDifferenceQuotient.pl Repository:
ViewVC logotype

View of /trunk/pg/macros/parserDifferenceQuotient.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5392 - (download) (as text) (annotate)
Sun Aug 19 21:50:23 2007 UTC (12 years, 6 months ago) by dpvc
File size: 2630 byte(s)
Move the context creation to the _init routine so that modifications
to main:: occur at initialization time, not when the file is loaded.

    1 
    2 loadMacros('MathObjects.pl');
    3 
    4 sub _parserDifferenceQuotient_init {DifferenceQuotient::Init()}; # don't reload this file
    5 
    6 =head1 DESCRIPTION
    7 
    8  ######################################################################
    9  #
   10  #  This is a Parser class that implements an answer checker for
   11  #  difference quotients as a subclass of the Formula class.  The
   12  #  standard ->cmp routine will work for this.  The difference quotient
   13  #  is just a special type of formula with a special variable
   14  #  for 'dx'.  The checker will give an error message if the
   15  #  student's result contains a dx in the denominator, meaning it
   16  #  is not fully reduced.
   17  #
   18  #  Use DifferenceQuotient(formula) to create a difference equation
   19  #  object.  If the context has more than one variable, the last one
   20  #  alphabetically is used to form the dx.  Otherwise, you can specify
   21  #  the variable used for dx as the second argument to
   22  #  DifferenceQuotient().  You could use a variable like h instead of
   23  #  dx if you prefer.
   24  #
   25  #  Usage examples:
   26  #
   27  #      $df = DifferenceQuotient("2x+dx");
   28  #      ANS($df->cmp);
   29  #
   30  #      $df = DifferenceQuotient("2x+h","h");
   31  #      ANS($df->cmp);
   32  #
   33  #      Context()->variables->are(t=>'Real',a=>'Real');
   34  #      ANS(DifferenceQuotient("-a/[t(t+dt)]","dt")->cmp);
   35  #
   36 
   37 =cut
   38 
   39 package DifferenceQuotient;
   40 our @ISA = qw(Value::Formula);
   41 
   42 sub Init {
   43   main::Context("Numeric");  ### FIXME:  probably should require author to set this explicitly
   44   main::PG_restricted_eval('sub DifferenceQuotient {new DifferenceQuotient(@_)}');
   45 }
   46 
   47 sub new {
   48   my $self = shift; my $class = ref($self) || $self;
   49   my $current = (Value::isContext($_[0]) ? shift : $self->context);
   50   my $formula = shift;
   51   my $dx = shift || $current->flag('diffQuotientVar') || 'd'.($current->variables->names)[-1];
   52   #
   53   #  Make a copy of the context to which we add a variable for 'dx'
   54   #
   55   my $context = $current->copy;
   56   $context->variables->add($dx=>'Real') unless ($context->variables->get($dx));
   57   $q = bless $context->Package("Formula")->new($context,$formula), $class;
   58   $q->{'dx'} = $dx;
   59   return $q;
   60 }
   61 
   62 sub cmp_class {'a Difference Quotient'}
   63 
   64 sub cmp_defaults{(
   65   shift->SUPER::cmp_defaults,
   66   ignoreInfinity => 0,
   67 )}
   68 
   69 sub cmp_postprocess {
   70   my $self = shift; my $ans = shift; my $dx = $self->{'dx'};
   71   return if $ans->{score} == 0 || $ans->{isPreview};
   72   $main::__student_value__ = $ans->{student_value};
   73   my ($value,$err) = main::PG_restricted_eval('$__student_value__->substitute(\''.$dx.'\'=>0)->reduce');
   74   $self->cmp_Error($ans,"It looks like you didn't finish simplifying your answer")
   75     if $err && $err =~ m/division by zero/i;
   76 }
   77 
   78 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9