--- loncom/homework/default_homework.lcpm 2008/11/26 18:11:52 1.142 +++ loncom/homework/default_homework.lcpm 2010/01/06 16:59:30 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # -# $Id: default_homework.lcpm,v 1.142 2008/11/26 18:11:52 raeburn Exp $ +# $Id: default_homework.lcpm,v 1.147 2010/01/06 16:59:30 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -220,7 +220,7 @@ sub caparesponse_check { if (($type eq '9') || ($type eq '8')) { if ($response=~/\=/) { return ('BAD_FORMULA','Please submit just an expression, not an equation.'); - } elsif ($response =~ /\,/) { + } elsif ($response =~ /\,/ and $response !~ /^\s*\{.*\}\s*$/) { return ('BAD_FORMULA'); } } @@ -326,10 +326,20 @@ sub caparesponse_check_list { $element =~ s/\s//g; } my $appendunit=$unit; - if (($unit=~/\%/) && ($answerunit ne '%')) { - $element=$element/100; - $appendunit=~s/\%//; - } +# Deal with percentages +# unit is unit entered by student, answerunit is unit by author +# Deprecated: divide answer by 100 if student entered percent, +# but author did not. Too much confusion +# if (($unit=~/\%/) && ($answerunit ne '%')) { +# $element=$element/100; +# $appendunit=~s/\%//; +# } +# Author entered percent, student did not + if (($unit!~/\%/) && ($answerunit=~/\%/)) { + $element=$element*100; + $appendunit='%'.$appendunit; + } +# Zero does not need a dimension if (($element==0) && ($unit!~/\w/) && ($answerunit=~/\w/)) { $appendunit=$answerunit; } @@ -434,14 +444,47 @@ sub caparesponse_check_list { sub cas { my ($system,$input,$library)=@_; my $output; + my $dump; if ($system eq 'maxima') { $output=&maxima_eval($input,$library); + } elsif ($system eq 'R') { + ($output,$dump)=&r_eval($input,$library,0); } else { $output='Error: unrecognized CAS'; } return $output; } +sub cas_hashref { + my ($system,$input,$library)=@_; + if ($system eq 'maxima') { + return 'Error: unsupported CAS'; + } elsif ($system eq 'R') { + return &r_eval($input,$library,1); + } else { + return 'Error: unrecognized CAS'; + } +} + +# +# cas_hashref_entry takes a list of indices and gets the entry in a hash generated by Rreturn. +# Call: cas_hashref_entry(Rvalue, index1, index2, ...) where Rvalue is a hash returned by Rreturn. +# Rentry will return the first scalar value it encounters (ignoring excess indices). +# If an invalid key is given, it returns undef. +# +sub cas_hashref_entry { + return &Rentry(@_); +} + +# +# cas_hashref_array takes a list of indices and gets a column array from a hash generated by Rreturn. +# Call: cas_hashref_array(Rvalue, index1, index2, ...) where Rvalue is a hash returned by Rreturn. +# If an invalid key is given, it returns undef. +# +sub cas_hashref_array { + return &Rarray(@_); +} + sub tex { if ( $external::target eq "tex" ) { return $_[0];