axiom-developer
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Axiom-developer] 20080120.03.tpd.patch (7102/412)


From: daly
Subject: [Axiom-developer] 20080120.03.tpd.patch (7102/412)
Date: Sun, 20 Jan 2008 11:04:22 -0600

This patch by Martin fixes equality testing in TableAggregate.
The problem is that the syntax " => false" causes the loop to 
iterate, skipping any following expressions in the loop. However,
the intention of this loop is clearly to cause an early exit from
the function when it can be determined that the arguments are not
equal. As originally written, the loop always returned true.

There is a regression test file, tbagg.input, added.

Tim

===========================================================================
diff --git a/changelog b/changelog
index 2d037de..665492c 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,6 @@
+20080120 tpd src/input/Makefile add tbagg.input regression test (7102/412)
+20080120 tpd src/input/tbagg.input regression test equality in TBAGG (7102/412)
+20080120 mxr src/algebra/aggcat.spad fix equality in TBAGG (7102/412)
 20080120 tpd src/input/Makefile fix MoreSystemCommand loading (7101/204)
 20080119 gxv src/hyper/keyin handle numlock in hyperdoc correctly (7100/149)
 20080119 gxv src/hyper/dialog handle numlock in hyperdoc correctly (7100/149)
diff --git a/src/algebra/aggcat.spad.pamphlet b/src/algebra/aggcat.spad.pamphlet
index 1363c02..ae221f4 100644
--- a/src/algebra/aggcat.spad.pamphlet
+++ b/src/algebra/aggcat.spad.pamphlet
@@ -1270,7 +1270,7 @@ TableAggregate(Key:SetCategory, Entry:SetCategory): 
Category ==
        eq?(s,t) => true
        #s ^= #t => false
        for k in keys s repeat
-        (e := search(k, t)) case "failed" or (e::Entry) ^= s.k => false
+        (e := search(k, t)) case "failed" or (e::Entry) ^= s.k => return false
        true
 
      map(f: Record(key:Key,entry:Entry)->Record(key:Key,entry:Entry), t: %): % 
==
diff --git a/src/input/Makefile.pamphlet b/src/input/Makefile.pamphlet
index 533002e..65741f8 100644
--- a/src/input/Makefile.pamphlet
+++ b/src/input/Makefile.pamphlet
@@ -363,7 +363,8 @@ REGRES= algaggr.regress algbrbf.regress  algfacob.regress 
alist.regress  \
     stbl.regress      stream2.regress  stream.regress   streams.regress \
     string.regress    strtbl.regress   summation.regress \
     symbol.regress    t111293.regress  table.regress    tancot.regress \
-    tanhcoth.regress  tanatan.regress  textfile.regress torus.regress \
+    tanhcoth.regress  tanatan.regress  tbagg.regress \
+    textfile.regress  torus.regress \
     triglim.regress   tsetcatvermeer.regress            tutchap1.regress \
     void.regress      uniseg.regress
 
@@ -638,7 +639,7 @@ FILES= ${OUT}/algaggr.input  ${OUT}/algbrbf.input    
${OUT}/algfacob.input \
        ${OUT}/symbol.input \
        ${OUT}/synonym.input  ${OUT}/t111293.input \
        ${OUT}/table.input    ${OUT}/tancot.input     ${OUT}/tanhcoth.input \
-       ${OUT}/tanatan.input  ${OUT}/test.input \
+       ${OUT}/tanatan.input  ${OUT}/tbagg.input      ${OUT}/test.input \
        ${OUT}/tetra.input    ${OUT}/textfile.input   ${OUT}/tknot.input \
        ${OUT}/tree.input \
        ${OUT}/triglim.input  ${OUT}/tschirn.input ${OUT}/tsetcatbutcher.input \
@@ -960,6 +961,7 @@ DOCFILES= \
   ${DOC}/synonym.input.dvi     ${DOC}/t111293.input.dvi    \
   ${DOC}/table.input.dvi       ${DOC}/tanatan.input.dvi    \
   ${DOC}/tancot.input.dvi      ${DOC}/tanhcoth.input.dvi   \
+  ${DOC}/tbagg.input.dvi       \
   ${DOC}/test.input.dvi        ${DOC}/tetra.input.dvi      \
   ${DOC}/textfile.input.dvi    ${DOC}/tknot.input.dvi      \
   ${DOC}/torus.input.dvi       ${DOC}/tree.input.dvi       \
diff --git a/src/input/tbagg.input.pamphlet b/src/input/tbagg.input.pamphlet
new file mode 100644
index 0000000..c33dd1f
--- /dev/null
+++ b/src/input/tbagg.input.pamphlet
@@ -0,0 +1,92 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/input tbagg.input}
+\author{Timothy Daly}
+\maketitle
+\begin{abstract}
+Equality testing was broken in TableAggregate (TBAGG)
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+The equality function int TableAggregate used to read:
+\begin{verbatim}
+     s:% = t:% ==
+       eq?(s,t) => true
+       #s ^= #t => false
+       for k in keys s repeat
+        (e := search(k, t)) case "failed" or (e::Entry) ^= s.k => false
+       true
+\end{verbatim}
+but this always returns true. Using the ``$=>$'' operator in a loop
+just causes the loop to move to the next iteration. Thus the loop
+will not take an early exit from the function and the code will always
+fall thru to the ``true'' case. This is fixed by calling the return function.
+\begin{verbatim}
+     s:% = t:% ==
+       eq?(s,t) => true
+       #s ^= #t => false
+       for k in keys s repeat
+        (e := search(k, t)) case "failed" or (e::Entry) ^= s.k => return false
+       true
+\end{verbatim}
+<<*>>=
+)spool tbagg.output
+)set message test on
+)set message auto off
+)clear all
+ 
+--S 1 of 7
+R ==> Record(key: Symbol, entry: String)
+--R                                                                   Type: 
Void
+--E 1
+
+--S 2 of 7
+T ==> AssociationList(Symbol, String)
+--R                                                                   Type: 
Void
+--E 2
+
+--S 3 of 7
+t1:=construct([[x,"ix"]$R])$T
+--R
+--R   (3)  table(x= "ix")
+--R                                         Type: 
AssociationList(Symbol,String)
+--E 3
+
+--S 4 of 7
+t2:=construct([[y,"iy"]$R])$T
+--R
+--R   (4)  table(y= "iy")
+--R                                         Type: 
AssociationList(Symbol,String)
+--E 4
+
+--S 5 of 7
+(t1=t2)::Boolean
+--R
+--R   (5)  false
+--R                                                                Type: 
Boolean
+--E 5
+
+--S 6 of 7
+t3:=construct([[y,"iy"]$R])$T
+--R
+--R   (6)  table(y= "iy")
+--R                                         Type: 
AssociationList(Symbol,String)
+--E 6
+
+--S 7 of 7
+(t3=t2)::Boolean
+--R
+--R   (7)  true
+--R                                                                Type: 
Boolean
+--E 7
+)spool 
+)lisp (bye)
+ 
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]