SF patch #803449:  modernize demo scripts
(Contributed by George Yoshida.)
diff --git a/Demo/classes/Rev.py b/Demo/classes/Rev.py
index 467bd57..7fd78e0 100755
--- a/Demo/classes/Rev.py
+++ b/Demo/classes/Rev.py
@@ -1,89 +1,95 @@
-# A class which presents the reverse of a sequence without duplicating it.
-# From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
+'''
+A class which presents the reverse of a sequence without duplicating it.
+From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
 
-# It works on mutable or inmutable sequences.
-#
-# >>> for c in Rev( 'Hello World!' ) : sys.stdout.write( c )
-# ... else: sys.stdout.write( '\n' )
-# ...
-# !dlroW olleH
-#
-# The .forw is so you can use anonymous sequences in __init__, and still
-# keep a reference the forward sequence. )
-# If you give it a non-anonymous mutable sequence, the reverse sequence
-# will track the updated values. ( but not reassignment! - another
-# good reason to use anonymous values in creating the sequence to avoid
-# confusion. Maybe it should be change to copy input sequence to break
-# the connection completely ? )
-#
-# >>> nnn = range( 0, 3 )
-# >>> rnn = Rev( nnn )
-# >>> for n in rnn: print n
-# ...
-# 2
-# 1
-# 0
-# >>> for n in range( 4, 6 ): nnn.append( n )   # update nnn
-# ...
-# >>> for n in rnn: print n     # prints reversed updated values
-# ...
-# 5
-# 4
-# 2
-# 1
-# 0
-# >>> nnn = nnn[1:-1]
-# >>> nnn
-# [1, 2, 4]
-# >>> for n in rnn: print n     # prints reversed values of old nnn
-# ...
-# 5
-# 4
-# 2
-# 1
-# 0
-# >>>
-#
-# WH = Rev( 'Hello World!' )
-# print WH.forw, WH.back
-# nnn = Rev( range( 1, 10 ) )
-# print nnn.forw
-# print nnn
-#
-# produces output:
-#
-# Hello World! !dlroW olleH
-# [1, 2, 3, 4, 5, 6, 7, 8, 9]
-# [9, 8, 7, 6, 5, 4, 3, 2, 1]
-#
-# >>>rrr = Rev( nnn )
-# >>>rrr
-# <1, 2, 3, 4, 5, 6, 7, 8, 9>
+It works on mutable or inmutable sequences.
 
-from string import joinfields
+>>> chars = list(Rev('Hello World!'))
+>>> print ''.join(chars)
+!dlroW olleH
+
+The .forw is so you can use anonymous sequences in __init__, and still
+keep a reference the forward sequence. )
+If you give it a non-anonymous mutable sequence, the reverse sequence
+will track the updated values. ( but not reassignment! - another
+good reason to use anonymous values in creating the sequence to avoid
+confusion. Maybe it should be change to copy input sequence to break
+the connection completely ? )
+
+>>> nnn = range(3)
+>>> rnn = Rev(nnn)
+>>> for n in rnn: print n
+...
+2
+1
+0
+>>> for n in range(4, 6): nnn.append(n)   # update nnn
+...
+>>> for n in rnn: print n     # prints reversed updated values
+...
+5
+4
+2
+1
+0
+>>> nnn = nnn[1:-1]
+>>> nnn
+[1, 2, 4]
+>>> for n in rnn: print n     # prints reversed values of old nnn
+...
+5
+4
+2
+1
+0
+
+#
+>>> WH = Rev('Hello World!')
+>>> print WH.forw, WH.back
+Hello World! !dlroW olleH
+>>> nnn = Rev(range(1, 10))
+>>> print nnn.forw
+[1, 2, 3, 4, 5, 6, 7, 8, 9]
+>>> print nnn.back
+[9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+>>> rrr = Rev(nnn)
+>>> rrr
+<1, 2, 3, 4, 5, 6, 7, 8, 9>
+
+'''
+
 class Rev:
-    def __init__( self, seq ):
+    def __init__(self, seq):
         self.forw = seq
         self.back = self
-    def __len__( self ):
-        return len( self.forw )
-    def __getitem__( self, j ):
-        return self.forw[ -( j + 1 ) ]
-    def __repr__( self ):
+
+    def __len__(self):
+        return len(self.forw)
+
+    def __getitem__(self, j):
+        return self.forw[-(j + 1)]
+
+    def __repr__(self):
         seq = self.forw
-        if type(seq) == type( [] ) :
+        if isinstance(seq, list):
             wrap = '[]'
             sep = ', '
-        elif type(seq) == type( () ) :
+        elif isinstance(seq, tuple):
             wrap = '()'
             sep = ', '
-        elif type(seq) == type( '' ) :
+        elif isinstance(seq, str):
             wrap = ''
             sep = ''
         else:
             wrap = '<>'
             sep = ', '
-        outstrs = []
-        for item in self.back :
-            outstrs.append( str( item ) )
-        return wrap[:1] + joinfields( outstrs, sep ) + wrap[-1:]
+        outstrs = [str(item) for item in self.back]
+        return wrap[:1] + sep.join(outstrs) + wrap[-1:]
+
+def _test():
+    import doctest, Rev
+    return doctest.testmod(Rev)
+
+if __name__ == "__main__":
+    _test()
diff --git a/Demo/classes/Vec.py b/Demo/classes/Vec.py
index 0a56ddb..56cb839 100755
--- a/Demo/classes/Vec.py
+++ b/Demo/classes/Vec.py
@@ -2,27 +2,22 @@
 
 
 def vec(*v):
-    return apply(Vec, v)
+    return Vec(*v)
 
 
 class Vec:
 
     def __init__(self, *v):
-        self.v = []
-        for x in v:
-            self.v.append(x)
-
+        self.v = list(v)
 
     def fromlist(self, v):
-        self.v = []
-        if type(v) <> type([]):
+        if not isinstance(v, list):
             raise TypeError
         self.v = v[:]
         return self
 
-
     def __repr__(self):
-        return 'vec(' + `self.v`[1:-1] + ')'
+        return 'vec(' + repr(self.v)[1:-1] + ')'
 
     def __len__(self):
         return len(self.v)
@@ -30,25 +25,19 @@
     def __getitem__(self, i):
         return self.v[i]
 
-    def __add__(a, b):
+    def __add__(self, other):
         # Element-wise addition
-        v = []
-        for i in range(len(a)):
-            v.append(a[i] + b[i])
+        v = map(lambda x, y: x+y, self, other)
         return Vec().fromlist(v)
 
-    def __sub__(a, b):
+    def __sub__(self, other):
         # Element-wise subtraction
-        v = []
-        for i in range(len(a)):
-            v.append(a[i] - b[i])
+        v = map(lambda x, y: x-y, self, other)
         return Vec().fromlist(v)
 
     def __mul__(self, scalar):
         # Multiply by scalar
-        v = []
-        for i in range(len(self.v)):
-            v.append(self.v[i]*scalar)
+        v = map(lambda x: x*scalar, self.v)
         return Vec().fromlist(v)
 
 
@@ -59,6 +48,7 @@
     print a
     print b
     print a+b
+    print a-b
     print a*3.0
 
 test()