Hex Artifact Content
Not logged in

Artifact 8e4f2874806213d602590361009ec862ae0354e9:


0000: 23 7c 20 43 72 65 61 74 65 64 20 61 6e 64 20 4d  #| Created and M
0010: 61 69 6e 74 61 69 6e 65 64 20 62 79 20 4a 61 63  aintained by Jac
0020: 6b 20 4c 75 63 61 73 20 3c 73 69 6c 76 65 72 62  k Lucas <silverb
0030: 65 61 72 64 40 70 72 6f 74 6f 6e 6d 61 69 6c 2e  eard@protonmail.
0040: 63 6f 6d 3e 0a 73 65 65 20 73 74 61 6e 64 61 6c  com>.see standal
0050: 6f 6e 65 20 72 65 70 6f 20 61 74 20 68 74 74 70  one repo at http
0060: 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 73  s://github.com/s
0070: 69 6c 76 65 72 62 65 61 72 64 30 30 2f 73 69 72  ilverbeard00/sir
0080: 65 64 69 73 20 66 6f 72 20 6c 69 63 65 6e 73 65  edis for license
0090: 0a 7c 23 0a 0a 28 64 65 66 69 6e 65 2d 72 65 63  .|#..(define-rec
00a0: 6f 72 64 2d 74 79 70 65 20 72 65 64 73 6f 63 6b  ord-type redsock
00b0: 0a 20 20 28 66 69 65 6c 64 73 20 6e 61 6d 65 20  .  (fields name 
00c0: 69 70 20 70 6f 72 74 20 73 65 6e 64 20 28 6d 75  ip port send (mu
00d0: 74 61 62 6c 65 20 72 65 63 65 69 76 65 29 29 29  table receive)))
00e0: 0a 0a 28 64 65 66 69 6e 65 20 28 72 65 64 2d 6d  ..(define (red-m
00f0: 6b 2d 73 6f 63 6b 65 74 20 61 64 64 72 20 70 6f  k-socket addr po
0100: 72 74 29 0a 20 20 28 6c 65 74 20 28 28 73 20 28  rt).  (let ((s (
0110: 73 6f 63 6b 65 74 20 27 69 6e 65 74 20 27 73 74  socket 'inet 'st
0120: 72 65 61 6d 20 27 28 29 20 30 29 29 29 0a 20 20  ream '() 0))).  
0130: 20 20 28 63 6f 6e 6e 65 63 74 2f 69 6e 65 74 20    (connect/inet 
0140: 73 20 61 64 64 72 20 70 6f 72 74 29 0a 20 20 20  s addr port).   
0150: 20 28 6d 61 6b 65 2d 72 65 64 73 6f 63 6b 20 22   (make-redsock "
0160: 52 65 64 69 73 22 20 61 64 64 72 20 70 6f 72 74  Redis" addr port
0170: 20 73 20 30 29 29 29 0a 0a 28 64 65 66 69 6e 65   s 0)))..(define
0180: 20 28 72 65 64 2d 73 6e 64 20 72 65 64 73 6f 63   (red-snd redsoc
0190: 6b 20 63 6f 6d 6d 61 6e 64 29 0a 20 20 28 6c 65  k command).  (le
01a0: 74 20 28 28 61 63 74 69 76 65 2d 73 6f 63 6b 20  t ((active-sock 
01b0: 28 72 65 64 73 6f 63 6b 2d 73 65 6e 64 20 72 65  (redsock-send re
01c0: 64 73 6f 63 6b 29 29 29 0a 20 20 20 20 28 70 75  dsock))).    (pu
01d0: 74 2d 62 79 74 65 76 65 63 74 6f 72 0a 20 20 20  t-bytevector.   
01e0: 20 20 61 63 74 69 76 65 2d 73 6f 63 6b 0a 20 20    active-sock.  
01f0: 20 20 20 28 73 74 72 69 6e 67 2d 3e 75 74 66 38     (string->utf8
0200: 20 28 66 6f 72 6d 61 74 20 23 66 20 22 7e 61 5c   (format #f "~a\
0210: 72 5c 6e 22 20 63 6f 6d 6d 61 6e 64 29 29 29 0a  r\n" command))).
0220: 20 20 20 20 28 66 6c 75 73 68 2d 6f 75 74 70 75      (flush-outpu
0230: 74 2d 70 6f 72 74 20 61 63 74 69 76 65 2d 73 6f  t-port active-so
0240: 63 6b 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ck)))..(define (
0250: 72 65 64 2d 72 65 63 76 20 72 65 64 73 6f 63 6b  red-recv redsock
0260: 29 0a 20 20 28 72 65 64 2d 72 65 61 64 2d 73 6f  ).  (red-read-so
0270: 63 6b 65 74 20 72 65 64 73 6f 63 6b 29 29 0a 0a  cket redsock))..
0280: 28 64 65 66 69 6e 65 20 28 72 65 64 2d 62 79 74  (define (red-byt
0290: 65 2d 63 6f 6e 76 65 72 74 20 73 6f 63 6b 29 0a  e-convert sock).
02a0: 20 20 28 75 74 66 38 2d 3e 73 74 72 69 6e 67 20    (utf8->string 
02b0: 28 62 79 74 65 76 65 63 74 6f 72 20 28 67 65 74  (bytevector (get
02c0: 2d 75 38 20 73 6f 63 6b 29 29 29 29 0a 0a 28 64  -u8 sock))))..(d
02d0: 65 66 69 6e 65 20 28 72 65 64 2d 63 6c 65 61 72  efine (red-clear
02e0: 2d 65 6e 64 2d 74 61 67 73 20 73 6f 63 6b 29 0a  -end-tags sock).
02f0: 20 20 28 67 65 74 2d 75 38 20 73 6f 63 6b 29 20    (get-u8 sock) 
0300: 28 67 65 74 2d 75 38 20 73 6f 63 6b 29 29 0a 0a  (get-u8 sock))..
0310: 28 64 65 66 69 6e 65 20 28 72 65 64 2d 72 65 61  (define (red-rea
0320: 64 2d 69 6e 74 65 67 65 72 20 73 6f 63 6b 29 0a  d-integer sock).
0330: 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65    (string->numbe
0340: 72 20 28 72 65 64 2d 72 65 61 64 2d 73 6f 63 6b  r (red-read-sock
0350: 65 74 20 73 6f 63 6b 29 29 29 0a 0a 3b 3b 3b 53  et sock)))..;;;S
0360: 68 6f 75 6c 64 20 62 65 20 74 75 72 6e 65 64 20  hould be turned 
0370: 69 6e 74 6f 20 61 20 76 65 63 74 6f 72 20 76 65  into a vector ve
0380: 72 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 76 65  rsion that conve
0390: 72 74 73 20 74 6f 0a 3b 3b 3b 61 20 73 74 72 69  rts to.;;;a stri
03a0: 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20 73  ng at the last s
03b0: 74 65 70 2e 0a 28 64 65 66 69 6e 65 20 28 72 65  tep..(define (re
03c0: 64 2d 72 65 61 64 2d 73 6f 63 6b 65 74 20 73 6f  d-read-socket so
03d0: 63 6b 29 0a 20 20 28 6c 65 74 20 28 28 72 65 64  ck).  (let ((red
03e0: 73 6f 63 6b 20 28 72 65 64 73 6f 63 6b 2d 73 65  sock (redsock-se
03f0: 6e 64 20 73 6f 63 6b 29 29 29 0a 20 20 20 20 28  nd sock))).    (
0400: 6c 65 74 20 67 65 74 74 65 72 20 28 28 64 61 74  let getter ((dat
0410: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
0420: 20 20 20 20 28 72 65 64 2d 62 79 74 65 2d 63 6f      (red-byte-co
0430: 6e 76 65 72 74 20 72 65 64 73 6f 63 6b 29 29 0a  nvert redsock)).
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 28 61 63 63 20 22 22 29 20 28 70 72 65 76 20   (acc "") (prev 
0460: 30 29 29 0a 20 20 20 20 20 20 28 63 6f 6e 64 0a  0)).      (cond.
0470: 20 20 20 20 20 20 20 28 28 61 6e 64 20 28 65 71         ((and (eq
0480: 75 61 6c 3f 20 61 63 63 20 22 22 29 20 28 65 71  ual? acc "") (eq
0490: 75 61 6c 3f 20 64 61 74 61 20 22 2a 22 29 29 0a  ual? data "*")).
04a0: 20 20 20 20 20 20 20 20 28 72 65 64 2d 72 65 61          (red-rea
04b0: 64 2d 61 72 72 61 79 20 73 6f 63 6b 29 29 0a 20  d-array sock)). 
04c0: 20 20 20 20 20 20 28 28 61 6e 64 20 28 65 71 75        ((and (equ
04d0: 61 6c 3f 20 61 63 63 20 22 22 29 20 28 65 71 75  al? acc "") (equ
04e0: 61 6c 3f 20 64 61 74 61 20 22 3a 22 29 29 0a 20  al? data ":")). 
04f0: 20 20 20 20 20 20 20 28 72 65 64 2d 72 65 61 64         (red-read
0500: 2d 69 6e 74 65 67 65 72 20 73 6f 63 6b 29 29 0a  -integer sock)).
0510: 20 20 20 20 20 20 20 28 28 61 6e 64 20 28 65 71         ((and (eq
0520: 75 61 6c 3f 20 61 63 63 20 22 22 29 20 28 65 71  ual? acc "") (eq
0530: 75 61 6c 3f 20 64 61 74 61 20 22 24 22 29 29 0a  ual? data "$")).
0540: 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 6c          (let ((l
0550: 20 28 72 65 64 2d 62 79 74 65 2d 63 6f 6e 76 65   (red-byte-conve
0560: 72 74 20 72 65 64 73 6f 63 6b 29 29 29 0a 20 20  rt redsock))).  
0570: 20 20 20 20 20 20 20 20 28 69 66 20 28 61 6e 64          (if (and
0580: 20 28 65 71 75 61 6c 3f 20 6c 20 22 2d 22 29 0a   (equal? l "-").
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 28 65 71 75 61 6c 3f 20 28 72 65 64 2d     (equal? (red-
05b0: 62 79 74 65 2d 63 6f 6e 76 65 72 74 20 72 65 64  byte-convert red
05c0: 73 6f 63 6b 29 20 22 31 22 29 29 0a 20 20 20 20  sock) "1")).    
05d0: 20 20 20 20 20 20 20 20 20 20 28 62 65 67 69 6e            (begin
05e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
05f0: 20 28 72 65 64 2d 63 6c 65 61 72 2d 65 6e 64 2d   (red-clear-end-
0600: 74 61 67 73 20 72 65 64 73 6f 63 6b 29 0a 20 20  tags redsock).  
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 66                #f
0620: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0630: 28 62 65 67 69 6e 0a 20 20 20 20 20 20 20 20 20  (begin.         
0640: 20 20 20 20 20 20 20 28 72 65 64 2d 63 6c 65 61         (red-clea
0650: 72 2d 65 6e 64 2d 74 61 67 73 20 72 65 64 73 6f  r-end-tags redso
0660: 63 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck).            
0670: 20 20 20 20 28 72 65 64 2d 72 65 61 64 2d 73 6f      (red-read-so
0680: 63 6b 65 74 20 73 6f 63 6b 29 29 29 29 29 0a 0a  cket sock)))))..
0690: 20 20 20 20 20 20 20 28 28 65 71 75 61 6c 3f 20         ((equal? 
06a0: 64 61 74 61 20 22 5c 72 22 29 0a 20 20 20 20 20  data "\r").     
06b0: 20 20 20 28 6c 65 74 20 28 28 6c 20 28 72 65 64     (let ((l (red
06c0: 2d 62 79 74 65 2d 63 6f 6e 76 65 72 74 20 72 65  -byte-convert re
06d0: 64 73 6f 63 6b 29 29 29 0a 20 20 20 20 20 20 20  dsock))).       
06e0: 20 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 6c     (if (equal? l
06f0: 20 22 5c 6e 22 29 0a 20 20 20 20 20 20 20 20 20   "\n").         
0700: 20 20 20 20 20 61 63 63 0a 20 20 20 20 20 20 20       acc.       
0710: 20 20 20 20 20 20 20 28 67 65 74 74 65 72 20 6c         (getter l
0720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0730: 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d 61         (string-a
0740: 70 70 65 6e 64 20 61 63 63 20 64 61 74 61 29 0a  ppend acc data).
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0760: 20 20 20 20 20 20 64 61 74 61 29 29 29 29 0a 20        data)))). 
0770: 20 20 20 20 20 20 28 65 6c 73 65 0a 20 20 20 20        (else.    
0780: 20 20 20 20 28 67 65 74 74 65 72 20 28 72 65 64      (getter (red
0790: 2d 62 79 74 65 2d 63 6f 6e 76 65 72 74 20 72 65  -byte-convert re
07a0: 64 73 6f 63 6b 29 0a 20 20 20 20 20 20 20 20 20  dsock).         
07b0: 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d 61         (string-a
07c0: 70 70 65 6e 64 20 61 63 63 20 64 61 74 61 29 0a  ppend acc data).
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 64 61 74 61 29 29 29 29 29 29 0a 0a 28 64 65 66  data))))))..(def
07f0: 69 6e 65 20 28 72 65 64 2d 61 72 72 61 79 2d 6c  ine (red-array-l
0800: 65 6e 67 74 68 20 72 65 64 73 6f 63 6b 29 0a 20  ength redsock). 
0810: 20 28 6c 65 74 20 28 28 64 61 74 61 20 28 73 74   (let ((data (st
0820: 72 69 6e 67 2d 3e 6c 69 73 74 20 28 72 65 64 2d  ring->list (red-
0830: 72 65 61 64 2d 73 6f 63 6b 65 74 20 72 65 64 73  read-socket reds
0840: 6f 63 6b 29 29 29 29 0a 20 20 20 20 28 73 74 72  ock)))).    (str
0850: 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 6c 69 73  ing->number (lis
0860: 74 2d 3e 73 74 72 69 6e 67 20 64 61 74 61 29 29  t->string data))
0870: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 65 64  ))..(define (red
0880: 2d 72 65 61 64 2d 61 72 72 61 79 20 72 65 64 73  -read-array reds
0890: 6f 63 6b 29 0a 20 20 28 6c 65 74 20 28 28 61 63  ock).  (let ((ac
08a0: 74 69 76 65 2d 73 6f 63 6b 20 28 72 65 64 73 6f  tive-sock (redso
08b0: 63 6b 2d 73 65 6e 64 20 72 65 64 73 6f 63 6b 29  ck-send redsock)
08c0: 29 0a 20 20 20 20 20 20 20 20 28 6e 75 6d 20 28  ).        (num (
08d0: 72 65 64 2d 61 72 72 61 79 2d 6c 65 6e 67 74 68  red-array-length
08e0: 20 72 65 64 73 6f 63 6b 29 29 29 0a 20 20 20 20   redsock))).    
08f0: 28 69 66 20 28 3d 20 6e 75 6d 20 2d 31 29 0a 20  (if (= num -1). 
0900: 20 20 20 20 20 20 20 23 66 0a 20 20 20 20 20 20         #f.      
0910: 20 20 28 6c 65 74 20 61 72 72 61 79 2d 72 65 61    (let array-rea
0920: 64 20 28 28 6e 75 6d 20 6e 75 6d 29 0a 20 20 20  d ((num num).   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 20 20 28 61 63 63 20 27 28 29 29 29        (acc '()))
0950: 0a 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 64  .          (cond
0960: 0a 20 20 20 20 20 20 20 20 20 20 20 28 28 3d 20  .           ((= 
0970: 6e 75 6d 20 30 29 20 28 72 65 76 65 72 73 65 20  num 0) (reverse 
0980: 61 63 63 29 29 0a 20 20 20 20 20 20 20 20 20 20  acc)).          
0990: 20 28 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20   (else.         
09a0: 20 20 20 28 6c 65 74 20 28 28 64 61 74 61 20 28     (let ((data (
09b0: 72 65 64 2d 72 65 61 64 2d 73 6f 63 6b 65 74 20  red-read-socket 
09c0: 72 65 64 73 6f 63 6b 29 29 29 0a 20 20 20 20 20  redsock))).     
09d0: 20 20 20 20 20 20 20 20 20 28 61 72 72 61 79 2d           (array-
09e0: 72 65 61 64 20 28 2d 20 6e 75 6d 20 31 29 20 28  read (- num 1) (
09f0: 63 6f 6e 73 20 64 61 74 61 20 61 63 63 29 29 29  cons data acc)))
0a00: 29 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ))))))..(define 
0a10: 28 72 65 64 2d 70 61 72 73 65 2d 63 6f 6d 6d 61  (red-parse-comma
0a20: 6e 64 20 63 6d 64 29 0a 20 20 28 66 6f 6c 64 2d  nd cmd).  (fold-
0a30: 6c 65 66 74 20 28 6c 61 6d 62 64 61 20 28 78 20  left (lambda (x 
0a40: 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y).             
0a50: 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 20 20 20    (cond.        
0a60: 20 20 20 20 20 20 20 20 28 28 73 79 6d 62 6f 6c          ((symbol
0a70: 3f 20 79 29 0a 20 20 20 20 20 20 20 20 20 20 20  ? y).           
0a80: 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d 61 70        (string-ap
0a90: 70 65 6e 64 20 78 20 22 20 22 20 28 73 79 6d 62  pend x " " (symb
0aa0: 6f 6c 2d 3e 73 74 72 69 6e 67 20 79 29 29 29 0a  ol->string y))).
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 28 28 6e 75 6d 62 65 72 3f 20 79 29 0a 20 20 20  ((number? y).   
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
0ae0: 74 72 69 6e 67 2d 61 70 70 65 6e 64 20 78 20 22  tring-append x "
0af0: 20 22 20 28 6e 75 6d 62 65 72 2d 3e 73 74 72 69   " (number->stri
0b00: 6e 67 20 79 29 29 29 0a 20 20 20 20 20 20 20 20  ng y))).        
0b10: 20 20 20 20 20 20 20 20 28 28 73 74 72 69 6e 67          ((string
0b20: 3f 20 79 29 0a 20 20 20 20 20 20 20 20 20 20 20  ? y).           
0b30: 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d 61 70        (string-ap
0b40: 70 65 6e 64 20 78 20 22 20 22 20 79 29 29 29 29  pend x " " y))))
0b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73  .             (s
0b60: 79 6d 62 6f 6c 2d 3e 73 74 72 69 6e 67 20 28 63  ymbol->string (c
0b70: 61 72 20 63 6d 64 29 29 0a 20 20 20 20 20 20 20  ar cmd)).       
0b80: 20 20 20 20 20 20 28 63 64 72 20 63 6d 64 29 29        (cdr cmd))
0b90: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 65 64 2d  )..(define (red-
0ba0: 70 61 72 73 65 2d 63 6f 6d 6d 61 6e 64 73 20 63  parse-commands c
0bb0: 6d 64 73 29 0a 20 20 28 6d 61 70 20 28 6c 61 6d  mds).  (map (lam
0bc0: 62 64 61 20 28 78 29 20 20 28 72 65 64 2d 70 61  bda (x)  (red-pa
0bd0: 72 73 65 2d 63 6f 6d 6d 61 6e 64 20 78 29 29 0a  rse-command x)).
0be0: 20 20 20 20 20 20 20 63 6d 64 73 29 29 0a 0a 28         cmds))..(
0bf0: 64 65 66 69 6e 65 20 28 72 65 64 2d 70 69 70 65  define (red-pipe
0c00: 2d 72 65 63 76 20 73 6f 63 6b 20 63 6d 64 29 0a  -recv sock cmd).
0c10: 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28    (map (lambda (
0c20: 63 6d 64 30 29 20 28 72 65 64 2d 72 65 63 76 20  cmd0) (red-recv 
0c30: 73 6f 63 6b 29 29 0a 20 20 20 20 20 20 20 63 6d  sock)).       cm
0c40: 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 65  d))..(define (re
0c50: 64 2d 6f 70 65 72 61 74 65 20 73 6f 63 6b 20 63  d-operate sock c
0c60: 6d 64 29 0a 20 20 28 69 66 20 28 61 6e 64 20 28  md).  (if (and (
0c70: 70 61 69 72 3f 20 28 66 69 72 73 74 20 63 6d 64  pair? (first cmd
0c80: 29 29 20 28 6c 69 73 74 3f 20 28 66 69 72 73 74  )) (list? (first
0c90: 20 63 6d 64 29 29 29 0a 20 20 20 20 20 20 28 62   cmd))).      (b
0ca0: 65 67 69 6e 0a 20 20 20 20 20 20 20 20 28 6d 61  egin.        (ma
0cb0: 70 20 28 6c 61 6d 62 64 61 20 28 63 6d 64 30 29  p (lambda (cmd0)
0cc0: 20 28 72 65 64 2d 73 6e 64 20 73 6f 63 6b 20 63   (red-snd sock c
0cd0: 6d 64 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  md0)).          
0ce0: 20 20 20 28 72 65 64 2d 70 61 72 73 65 2d 63 6f     (red-parse-co
0cf0: 6d 6d 61 6e 64 73 20 63 6d 64 29 29 0a 20 20 20  mmands cmd)).   
0d00: 20 20 20 20 20 28 72 65 64 2d 70 69 70 65 2d 72       (red-pipe-r
0d10: 65 63 76 20 73 6f 63 6b 20 63 6d 64 29 29 0a 20  ecv sock cmd)). 
0d20: 20 20 20 20 20 28 62 65 67 69 6e 0a 20 20 20 20       (begin.    
0d30: 20 20 20 20 28 72 65 64 2d 73 6e 64 20 73 6f 63      (red-snd soc
0d40: 6b 20 28 72 65 64 2d 70 61 72 73 65 2d 63 6f 6d  k (red-parse-com
0d50: 6d 61 6e 64 20 63 6d 64 29 29 0a 20 20 20 20 20  mand cmd)).     
0d60: 20 20 20 28 72 65 64 2d 72 65 63 76 20 73 6f 63     (red-recv soc
0d70: 6b 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  k))))..(define (
0d80: 72 65 74 75 72 6e 2d 72 65 64 69 73 2d 63 6c 6f  return-redis-clo
0d90: 73 75 72 65 20 69 70 20 70 6f 72 74 29 0a 20 20  sure ip port).  
0da0: 28 6c 65 74 20 28 28 69 6e 74 65 72 6e 61 6c 2d  (let ((internal-
0db0: 73 6f 63 6b 65 74 20 28 72 65 64 2d 6d 6b 2d 73  socket (red-mk-s
0dc0: 6f 63 6b 65 74 20 69 70 20 70 6f 72 74 29 29 29  ocket ip port)))
0dd0: 0a 20 20 20 20 28 6c 61 6d 62 64 61 20 63 6d 64  .    (lambda cmd
0de0: 0a 20 20 20 20 20 20 28 72 65 64 2d 6f 70 65 72  .      (red-oper
0df0: 61 74 65 20 69 6e 74 65 72 6e 61 6c 2d 73 6f 63  ate internal-soc
0e00: 6b 65 74 20 63 6d 64 29 29 29 29 0a 0a 0a 23 7c  ket cmd))))...#|
0e10: 45 78 61 6d 70 6c 65 73 20 6f 66 20 63 72 65 61  Examples of crea
0e20: 74 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 20 66  ting shorthand f
0e30: 6f 72 20 72 65 64 69 73 20 63 6f 6d 6d 61 6e 64  or redis command
0e40: 73 7c 23 0a 0a 28 64 65 66 69 6e 65 20 28 72 65  s|#..(define (re
0e50: 64 2d 73 65 74 20 6b 65 79 20 76 61 6c 75 65 29  d-set key value)
0e60: 0a 20 20 60 28 73 65 74 20 2c 6b 65 79 20 2c 76  .  `(set ,key ,v
0e70: 61 6c 75 65 29 29 0a 0a 28 64 65 66 69 6e 65 20  alue))..(define 
0e80: 28 72 65 64 2d 67 65 74 20 6b 65 79 29 0a 20 20  (red-get key).  
0e90: 60 28 67 65 74 20 2c 6b 65 79 29 29 0a 0a 28 64  `(get ,key))..(d
0ea0: 65 66 69 6e 65 20 28 72 65 64 2d 61 70 70 65 6e  efine (red-appen
0eb0: 64 20 6b 65 79 20 76 61 6c 75 65 29 0a 20 20 60  d key value).  `
0ec0: 28 61 70 70 65 6e 64 20 2c 6b 65 79 20 2c 76 61  (append ,key ,va
0ed0: 6c 75 65 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  lue))..(define (
0ee0: 72 65 64 2d 67 65 74 73 65 74 20 6b 65 79 20 76  red-getset key v
0ef0: 61 6c 75 65 29 0a 20 20 60 28 67 65 74 2d 73 65  alue).  `(get-se
0f00: 74 20 2c 6b 65 79 20 2c 76 61 6c 75 65 29 29 0a  t ,key ,value)).
0f10: 0a                                               .