[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 3670 - (download) (as text) (annotate)
Thu Sep 29 22:08:43 2005 UTC (14 years, 4 months ago) by dpvc
File size: 2629 byte(s)
Only add the 'dx' variable if it isn't already in the context.

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

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9