Skip to content
Snippets Groups Projects
Commit 6da6f5bb authored by Chris Sangwin's avatar Chris Sangwin
Browse files

Work around the fact that adding feedback has side effects.

parent 516001f1
No related branches found
No related tags found
No related merge requests found
...@@ -50,6 +50,36 @@ function stack_string($key, $a = null) { ...@@ -50,6 +50,36 @@ function stack_string($key, $a = null) {
return stack_maths::process_lang_string(get_string($key, 'qtype_stack', $a)); return stack_maths::process_lang_string(get_string($key, 'qtype_stack', $a));
} }
/**
* This function tidies up LaTeX from Maxima.
* @param string $rawfeedback
* @return string
*/
function stack_maxima_latex_tidy($latex) {
$dispfix = array('QMCHAR' => '?', '!LEFTSQ!' => '\left[', '!LEFTR!' => '\left(',
'!RIGHTSQ!' => '\right]', '!RIGHTR!' => '\right)');
// Need to add this in here also because strings may contain question mark characters.
foreach ($dispfix as $key => $fix) {
$latex = str_replace($key, $fix, $latex);
}
$loctags = array('ANDOR', 'SAMEROOTS', 'MISSINGVAR', 'ASSUMEPOSVARS', 'ASSUMEPOSREALVARS', 'LET',
'AND', 'OR', 'NOT');
foreach ($loctags as $tag) {
$latex = str_replace('!'.$tag.'!', stack_string('equiv_'.$tag), $latex);
}
// Also previously some spaces have been eliminated and line changes dropped.
// Apparently returning verbatim LaTeX was not a thing.
$latex = str_replace("\n ", '', $latex);
$latex = str_replace("\n", '', $latex);
// Just don't want to use regexp.
$latex = str_replace(' ', ' ', $latex);
$latex = str_replace(' ', ' ', $latex);
$latex = str_replace(' ', ' ', $latex);
return $latex;
}
/** /**
* This function takes a feedback string from Maxima and unpacks and translates it. * This function takes a feedback string from Maxima and unpacks and translates it.
* @param string $rawfeedback * @param string $rawfeedback
...@@ -57,6 +87,8 @@ function stack_string($key, $a = null) { ...@@ -57,6 +87,8 @@ function stack_string($key, $a = null) {
*/ */
function stack_maxima_translate($rawfeedback) { function stack_maxima_translate($rawfeedback) {
$rawfeedback = stack_maxima_latex_tidy($rawfeedback);
if (strpos($rawfeedback, 'stack_trans') === false) { if (strpos($rawfeedback, 'stack_trans') === false) {
return trim($rawfeedback); return trim($rawfeedback);
} else { } else {
......
...@@ -230,8 +230,7 @@ class stack_answertest_general_cas extends stack_anstest { ...@@ -230,8 +230,7 @@ class stack_answertest_general_cas extends stack_anstest {
if (strrpos($res, '!NEWLINE!') === core_text::strlen($res) - 9) { if (strrpos($res, '!NEWLINE!') === core_text::strlen($res) - 9) {
$res = trim(core_text::substr($res, 0, -9)); $res = trim(core_text::substr($res, 0, -9));
} }
$astc = new stack_ast_container(); $r['feedback'] = stack_maxima_translate($res);
$r['feedback'] = $astc->set_cas_latex_value(stack_maxima_translate($res));
} }
return $r; return $r;
} }
......
...@@ -189,29 +189,7 @@ class stack_ast_container extends stack_ast_container_silent implements cas_late ...@@ -189,29 +189,7 @@ class stack_ast_container extends stack_ast_container_silent implements cas_late
} }
public function set_cas_latex_value(string $latex) { public function set_cas_latex_value(string $latex) {
$dispfix = array('QMCHAR' => '?', '!LEFTSQ!' => '\left[', '!LEFTR!' => '\left(', $this->latex = stack_maxima_latex_tidy($latex);
'!RIGHTSQ!' => '\right]', '!RIGHTR!' => '\right)');
// Need to add this in here also because strings may contain question mark characters.
foreach ($dispfix as $key => $fix) {
$latex = str_replace($key, $fix, $latex);
}
$loctags = array('ANDOR', 'SAMEROOTS', 'MISSINGVAR', 'ASSUMEPOSVARS', 'ASSUMEPOSREALVARS', 'LET',
'AND', 'OR', 'NOT');
foreach ($loctags as $tag) {
$latex = str_replace('!'.$tag.'!', stack_string('equiv_'.$tag), $latex);
}
// Also previously some spaces have been eliminated and line changes dropped.
// Apparently returning verbatim LaTeX was not a thing.
$latex = str_replace("\n ", '', $latex);
$latex = str_replace("\n", '', $latex);
// Just don't want to use regexp.
$latex = str_replace(' ', ' ', $latex);
$latex = str_replace(' ', ' ', $latex);
$latex = str_replace(' ', ' ', $latex);
$this->latex = $latex;
return $latex;
} }
public function get_evaluated(): MP_Node { public function get_evaluated(): MP_Node {
......
...@@ -467,6 +467,8 @@ _APPEND_NOTE(note) := if ev(stackmap_has_key(%NOTES, %stmt), simp) ...@@ -467,6 +467,8 @@ _APPEND_NOTE(note) := if ev(stackmap_has_key(%NOTES, %stmt), simp)
else else
%NOTES:stackmap_set(%NOTES,%stmt,[note])$ %NOTES:stackmap_set(%NOTES,%stmt,[note])$
_RESET_NOTE(note) := %NOTES:["stack_map"]$
/* Function to attach a note to the current statement. */ /* Function to attach a note to the current statement. */
_APPEND_FEEDBACK(feedback) := if ev(stackmap_has_key(%FEEDBACK, %stmt), simp) _APPEND_FEEDBACK(feedback) := if ev(stackmap_has_key(%FEEDBACK, %stmt), simp)
then then
...@@ -474,6 +476,9 @@ _APPEND_FEEDBACK(feedback) := if ev(stackmap_has_key(%FEEDBACK, %stmt), simp) ...@@ -474,6 +476,9 @@ _APPEND_FEEDBACK(feedback) := if ev(stackmap_has_key(%FEEDBACK, %stmt), simp)
else else
%FEEDBACK:stackmap_set(%FEEDBACK,%stmt,[feedback])$ %FEEDBACK:stackmap_set(%FEEDBACK,%stmt,[feedback])$
/* Reset any feedback. */
_RESET_FEEDBACK(feedback) := %FEEDBACK:["stack_map"]$
/* General error catching wrapper */ /* General error catching wrapper */
_EC(errcatched, reference) := if errcatched = [] _EC(errcatched, reference) := if errcatched = []
then then
...@@ -756,6 +761,10 @@ stack_validate(expr, LowestTerms, TAns) := block([simp:false, exs, SameType, fvs ...@@ -756,6 +761,10 @@ stack_validate(expr, LowestTerms, TAns) := block([simp:false, exs, SameType, fvs
if exs=[] then return(false), if exs=[] then return(false),
if length(expr)#1 then print(StackAddFeedback("", "CommaError", string(expr), string(setify(expr)))), if length(expr)#1 then print(StackAddFeedback("", "CommaError", string(expr), string(setify(expr)))),
expr: first(expr), expr: first(expr),
/* Check if the student's answer is the same type as the Teacher's. */
SameType:ATSameTypefun(expr, TAns),
if ev(is(SameType[2]=false),simp) then print(SameType[4])
else (_RESET_NOTE(true),_RESET_FEEDBACK(true)),
/* Check to see if a variable is also a function name. */ /* Check to see if a variable is also a function name. */
fvs1: setify(listofvars(expr)), fvs1: setify(listofvars(expr)),
fvs2: get_ops(expr), fvs2: get_ops(expr),
...@@ -772,9 +781,6 @@ stack_validate(expr, LowestTerms, TAns) := block([simp:false, exs, SameType, fvs ...@@ -772,9 +781,6 @@ stack_validate(expr, LowestTerms, TAns) := block([simp:false, exs, SameType, fvs
exs:stack_validate_missing_assignment(expr), exs:stack_validate_missing_assignment(expr),
if first(exs) then if first(exs) then
print(StackAddFeedback("", "Bad_assignment", stack_disp(second(exs), "i"))), print(StackAddFeedback("", "Bad_assignment", stack_disp(second(exs), "i"))),
/* Check if the student's answer is the same type as the Teacher's. */
SameType:ATSameTypefun(expr, TAns),
if SameType[2]#true then print(SameType[4]),
/* Now display the result. */ /* Now display the result. */
simp: false, simp: false,
expr: detexcolor(expr), expr: detexcolor(expr),
...@@ -1227,7 +1233,7 @@ ATAlgEquiv(SA,SB) := block([simp:true, ret, newret, SAN], ...@@ -1227,7 +1233,7 @@ ATAlgEquiv(SA,SB) := block([simp:true, ret, newret, SAN],
)$ )$
/* ATAlgEquivfun is a recursive "thing" comparing function. It is designed to /* ATAlgEquivfun is a recursive "thing" comparing function. It is designed to
cope with a variety of different objects, eg lists of inequalities etc. cope with a variety of different objects, e.g. lists of inequalities etc.
Returns [valid, RawMark, AnswerNote, FeedBack] Returns [valid, RawMark, AnswerNote, FeedBack]
where valid = true/false where valid = true/false
...@@ -1562,12 +1568,10 @@ ATMatrix(SA, SB) := block([RawMark, FeedBack, AnswerNote, str, ret, SAr, SAc, SB ...@@ -1562,12 +1568,10 @@ ATMatrix(SA, SB) := block([RawMark, FeedBack, AnswerNote, str, ret, SAr, SAc, SB
SAc:length(SA[1]), SAc:length(SA[1]),
SBr:length(SB), SBr:length(SB),
SBc:length(SB[1]), SBc:length(SB[1]),
FeedBack:StackAddFeedback("", "ATMatrix_wrongsz", stack_disp(SBr, "i"), stack_disp(SBc, "i"), stack_disp(SAr, "i"), stack_disp(SAc, "i")),
if (SAr#SBr) then if (SAr#SBr) then
return([true, false, StackAddNote("", "ATMatrix_wrongsz_rows"), FeedBack]), return([true, false, StackAddNote("", "ATMatrix_wrongsz_rows"), StackAddFeedback("", "ATMatrix_wrongsz", stack_disp(SBr, "i"), stack_disp(SBc, "i"), stack_disp(SAr, "i"), stack_disp(SAc, "i"))]),
if (SAc#SBc) then if (SAc#SBc) then
return([true, false, StackAddNote("", "ATMatrix_wrongsz_columns"), FeedBack]), return([true, false, StackAddNote("", "ATMatrix_wrongsz_columns"), StackAddFeedback("", "ATMatrix_wrongsz", stack_disp(SBr, "i"), stack_disp(SBc, "i"), stack_disp(SAr, "i"), stack_disp(SAc, "i"))]),
FeedBack:"",
/* Check they are equal */ /* Check they are equal */
ret:[true, true, "", ""], ret:[true, true, "", ""],
AddFeedBack:false, AddFeedBack:false,
...@@ -1590,12 +1594,10 @@ ATMatrix(SA, SB) := block([RawMark, FeedBack, AnswerNote, str, ret, SAr, SAc, SB ...@@ -1590,12 +1594,10 @@ ATMatrix(SA, SB) := block([RawMark, FeedBack, AnswerNote, str, ret, SAr, SAc, SB
ATSet(SA, SB) := block([RawMark, FeedBack, AnswerNote, str, SAl, SBl, ZM], ATSet(SA, SB) := block([RawMark, FeedBack, AnswerNote, str, SAl, SBl, ZM],
RawMark:true, FeedBack:"", AnswerNote:"", RawMark:true, FeedBack:"", AnswerNote:"",
/* Get sizes of sets. */ /* Get sizes of sets. */
SAl:cardinality(SA), SAl:ev(cardinality(SA), simp),
SBl:cardinality(SB), SBl:ev(cardinality(SB), simp),
FeedBack:StackAddFeedback("", "ATSet_wrongsz", stack_disp(SBl, "i"), stack_disp(SAl, "i")),
if (SAl#SBl) then if (SAl#SBl) then
return([true, false, StackAddNote("", "ATSet_wrongsz"), FeedBack]), return([true, false, StackAddNote("", "ATSet_wrongsz"), StackAddFeedback("", "ATSet_wrongsz", stack_disp(SBl, "i"), stack_disp(SAl, "i"))]),
FeedBack:"",
/* Check they are equal */ /* Check they are equal */
SA:map(ineqprepare, map(trigreduce, SA)), SA:map(ineqprepare, map(trigreduce, SA)),
SB:map(ineqprepare, map(trigreduce, SB)), SB:map(ineqprepare, map(trigreduce, SB)),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment