| … | |
… | |
| 25 | # |
25 | # |
| 26 | # Make the answer checker |
26 | # Make the answer checker |
| 27 | # |
27 | # |
| 28 | sub vector_cmp { |
28 | sub vector_cmp { |
| 29 | my $v = shift; |
29 | my $v = shift; |
| 30 | die "vector_cmp requires a vector" unless defined $v; |
30 | die "vector_cmp requires a vector argument" unless defined $v; |
| 31 | my $v = Vector($v); # covert to vector if it isn't already |
31 | my $v = Vector($v); # covert to vector if it isn't already |
| 32 | my $ans = new AnswerEvaluator; |
32 | my $ans = new AnswerEvaluator; |
| 33 | $ans->ans_hash(type => "vector",correct_ans => $v->string, vector=>$v); |
33 | $ans->ans_hash(type => "vector",correct_ans => $v->string, vector=>$v); |
| 34 | $ans->install_evaluator(~~&vector_cmp_check); |
34 | $ans->install_evaluator(~~&vector_cmp_check); |
| 35 | return $ans; |
35 | return $ans; |
| … | |
… | |
| 39 | my $ans = shift; my $v = $ans->{vector}, |
39 | my $ans = shift; my $v = $ans->{vector}, |
| 40 | $ans->score(0); # assume failure |
40 | $ans->score(0); # assume failure |
| 41 | my $student = $ans->{student_ans}; |
41 | my $student = $ans->{student_ans}; |
| 42 | # |
42 | # |
| 43 | # Make student answer safe to eval by doubling \ and quoting ' |
43 | # Make student answer safe to eval by doubling \ and quoting ' |
|
|
44 | # (remember, ~~ equals \) |
| 44 | # |
45 | # |
| 45 | $student =~ s/~~~~/~~~~~~~~/g; $student =~ s/'/~~~~'/g; # remember that ~~ means \ |
46 | $student =~ s/~~~~/~~~~~~~~/g; $student =~ s/'/~~~~'/g; |
| 46 | my ($fV,$err) = PG_restricted_eval('$f = Formula(~~''.$student.'~~'); [$f,$f->eval]'); |
47 | my ($fV,$err) = PG_restricted_eval('$f = Formula(~~''.$student.'~~'); [$f,$f->eval]'); |
| 47 | if (defined $fV) { |
48 | if (defined $fV) { |
| 48 | my ($f,$V) = @{$fV}; # extract the formula and is value |
49 | my ($f,$V) = @{$fV}; # extract the formula and is value |
| 49 | $ans->{preview_latex_string} = $f->TeX; |
50 | $ans->{preview_latex_string} = $f->TeX; |
| 50 | $ans->{preview_text_string} = $f->string; |
51 | $ans->{preview_text_string} = $f->string; |
| … | |
… | |
| 59 | $ans->{ans_message} = $ans->{error_message} = |
60 | $ans->{ans_message} = $ans->{error_message} = |
| 60 | "Your answer doesn't seem to be a Vector" unless $inputs_ref->{previewAnswers}; |
61 | "Your answer doesn't seem to be a Vector" unless $inputs_ref->{previewAnswers}; |
| 61 | } |
62 | } |
| 62 | } else { |
63 | } else { |
| 63 | # |
64 | # |
| 64 | # Student answer evaluation Failed. |
65 | # Student answer evaluation failed. |
| 65 | # Report the error, with formatting, if possible. |
66 | # Report the error, with formatting, if possible. |
| 66 | # |
67 | # |
| 67 | my $context = Context(); |
68 | my $context = Context(); |
| 68 | my $message = $context->{error}{message}; |
69 | my $message = $context->{error}{message}; |
| 69 | if ($context->{error}{pos}) { |
70 | if ($context->{error}{pos}) { |