wisp
 
(Arne Babenhauserheide)
2013-12-26: niccely refactored code, but it does not work.

niccely refactored code, but it does not work.

diff --git a/examples/tinyenc.w b/examples/tinyenc.w
--- a/examples/tinyenc.w
+++ b/examples/tinyenc.w
@@ -3,83 +3,86 @@
 
 define-module : examples tinyenc
    . #:export : encrypt decrypt
-
+   . #:use-syntax : ice-9 syncase
 ; http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm#toctitle
 
-logxor 1 3
-
 define delta #x9e3779b9
 
 define : uint32 number
   . "ensure that the number fits a uint32"
   modulo number : integer-expt 2 32
 
+define : v0change k0 v1 sum k1
+         logxor
+           uint32 : + k0 : ash v1 -4
+           uint32 : + v1 sum
+           uint32 : + k1 : uint32 : ash v1 5
+
+define : v1change k2 v0 sum k3
+         logxor
+           uint32 : + k2 : ash v0 -4
+           uint32 : + v0 sum
+           uint32 : + k3 : uint32 : ash v0 5
+
+; TODO: Define a macro with-split-kv which executes its body with let bindings to k0 k1 k2 k3 v0 and v1
+define-syntax with-split-vk
+  syntax-rules :
+    : with-split-vk v k ...
+      let
+        : k0 : uint32 : ash k -96
+          k1 : uint32 : ash k -64
+          k2 : uint32 : ash k -32
+          k3 : uint32 k
+          v0 : uint32 : ash v -32
+          v1 : uint32 v
+        . ...
+    
+
 define : encrypt v k
   . "Encrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)."
-  let*
-    : k0 : ash k -96
+;   with-split-vk v k
+  let
+    : k0 : uint32 : ash k -96
       k1 : uint32 : ash k -64
       k2 : uint32 : ash k -32
       k3 : uint32 k
+      v0 : uint32 : ash v -32
+      v1 : uint32 v
     let loop 
       : sum delta
         cycle 0
-        v0 : ash v -32
-        v1 : uint32 v
+        v0 v0
+        v1 v1
       if : = cycle 32
          + v1 : * v0 : integer-expt 2 32
-         let 
-           :
-             v0tmp 
-              uint32
-               + v0
-                 logxor
-                   + k0 : ash v1 -4
-                   + v1 sum
-                   + k1 : ash v1 5
+         let : : v0tmp : uint32 : + v0 : v0change k0 v1 sum k1
            loop
              uint32 : + sum delta
              + cycle 1
              . v0tmp
-             uint32
-              + v1
-               logxor
-                 + k2 : ash v0tmp -4
-                 + v0tmp sum
-                 + k3 : ash v0tmp 5
+             uint32 : + v1 : v1change k2 v0tmp sum k3
 
 define : decrypt v k
   . "Decrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)."
-  let*
-    : k0 : ash k -96
+  let
+    : k0 : uint32 : ash k -96
       k1 : uint32 : ash k -64
       k2 : uint32 : ash k -32
       k3 : uint32 k
+      v0 : uint32 : ash v -32
+      v1 : uint32 v
     let loop
       : sum #xc6ef3720
         cycle 0
-        v0 : ash v -32
-        v1 : uint32 v
+        v0 v0
+        v1 v1
       if : = cycle 32
          + v1 : * v0 : integer-expt 2 32
-         let 
-           :
-             v1tmp 
-              uint32
-               - v1 
-                 logxor
-                   + k2 : ash v0 -4
-                   + v0 sum
-                   + k3 : ash v0 5
+         let : : v1tmp : uint32 : - v1 : v1change k2 v0 sum k3
            loop
              uint32 : + sum delta
              + cycle 1
-             uint32
-              - v0
-               logxor
-                 + k0 : ash v1tmp -4
-                 + v1tmp sum
-                 + k1 : ash v1tmp 5
+             uint32 : - v0 : v0change k0 v1tmp sum k1
              . v1tmp
 
 
@@ -87,11 +90,11 @@ display
     decrypt
         encrypt 
           . 5
-          + 7 : integer-expt 2 96 
-        + 7 : integer-expt 2 96 
+          . 9
+        . 9
 newline
 display
         encrypt 
           . 5
-          + 7 : integer-expt 2 96 
+          . 9
 newline