Artifact
8e4f2874806213d602590361009ec862ae0354e9:
- File
redis/main.scm
— part of check-in
[1eaafa95a1]
at
2018-12-09 15:21:26
on branch trunk
— added redis
(user:
aldo
size: 3857)
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 .