/home/jaubrey/webwork//pg_TRUNK/macros/answerHints.pl
From WeBWorK
AnswerHints()
This is an answerchecker postfilter that allows you to produce additional error messages for incorrect answers. You can trigger a message for a single answer, a collection of answers, or via a subroutine that determines the condition for the message.
Note that this filter only works for MathObjects answer checkers.
The answer hints are given as a pair using => with the righthand side being the answer message and the lefthand side being one of three possibilities: 1) the value that triggers the message, 2) a reference to an array of values that trigger the message, or 3) a code reference to a subtroutine that accepts the correct answer, the student's answer, and the answer hash, and returns 1 or 0 depending on whether the message should or should not be displayed. (See the examples below.)
The righthand side can be either the message string itself, or a referrence to an array where the first element is the message string, and the remaining elements are namevalue pairs that set options for the message. These can include:
checkCorrect => 0 or 1

1 means check for messages even if the answer is correct. Default: 0
replaceMessage => 0 or 1

1 means it's OK to repalce any message that is already in place in the answer hash. Default: 0
checkTypes => 0 or 1

1 means only perform the test if the student answer is the same type as the correct one. Default: 1
score => number

Specifies the score to use if the message is triggered (so that partial credit can be given). Default: keep original score
cmp_options => [...]

provides options for the cmp routine used to check if the student answer matches these answers. Default: []
If more than one message matches the student's answer, the first one in the list is used.
Example:
ANS(Vector(1,2,3)>cmp(showCoordinateHints=>0)>withPostFilter(AnswerHints( Vector(0,0,0) => "The zero vector is not a valid solution", "<1,2,3>" => "Try the opposite direction", "<1,2,3>" => "Well done!", ["<1,1,1>","<2,2,2>","<3,3,3>"] => "Don't just guess!", sub { my ($correct,$student,$ans) = @_; return $correct . $student == 0; } => "Your answer is perpendicular to the correct one", Vector(1,2,3) => [ "You have the right direction, but not length", cmp_options => [parallel=>1], ], 0 => ["Careful, your answer should be a vector!", checkTypes => 0, replaceMessage => 1], sub { my ($correct,$student,$ans) = @_; return norm($correct$student) < .1; } => ["Close! Keep trying.", score => .25], )));