Henrik,

Thank you for sharing. I have also thought about using redis for session
state.

Just curious on the coding style, why did you choose to use a class? I have
noticed some of your other code uses classes too. In general I think of
using classes to encapsulate state or to group related functions.

I tend to use picolisp in more of a functional form possibly because its a
breath of fresh air after 10 years of oop in c#.  I sometimes wonder when
its a good fit to mix in oop in picolisp.

Thanks
Joe
On Nov 25, 2012 2:20 PM, "Henrik Sarvell" <hsarv...@gmail.com> wrote:

> Hi everyone, at work I use Redis ( http://redis.io/ ) for various things
> such as session data, to avoid as much disk scratching as possible (I've
> configured it to only live in memory).
>
> I thought it would be interesting to see how much work it would take to
> implement a Redis client in PL, as it happens not much.
>
> The most interesting part of the documentation for the purpose:
> http://redis.io/topics/protocol
> http://redis.io/topics/data-types
>
> The below is by no means a complete client that can handle all scenarios
> but I thought I might just put it "out there". In case someone else gets
> the same idea they won't have to start from scratch.
>
> (class +Redis)
>
> (dm e> (Cmd . @)
>    (let? Sock (connect "localhost" 6379)
>       (prog1
>          (out Sock
>             (prinl "*" (+ 1 (length (rest))) "^M")
>             (for Arg (append (list Cmd) (rest))
>                (prinl "$" (size Arg) "^M")
>                (prinl (pack Arg "^M")) )
>             (flush)
>             (in Sock
>                (let? Res (char)
>                   (cond
>                      ((= Res "+") (line T))          #status
>                      ((= Res ":") (any (line T)))    #integer
>                      ((= Res "$")                    #bulk
>                       (let Length (peek)
>                          (if (= Length "-")
>                             NIL
>                             (line)
>                             (line T) ) ) )
>                      ((= Res "*")                    #multi bulk
>                       (let Length (any (line T))
>                          (if (member Length '("0" "-"))
>                             NIL
>                             (make
>                                (do Length
>                                 (line)
>                                 (link (line T)) ) ) ) ) )
>                      (T NIL) ) ) ) )
>          (close Sock) ) ) )
>
> (de redis (Cmd . @)
>    (apply 'e> (rest) '+Redis (uppc Cmd)))
>
> (println (redis 'set "key" "value"))
> (println (redis 'get "monkey"))
> (println (redis 'get "key"))
> (println (redis 'lpush "monkeys" "orangutang"))
> (println (redis 'lpush "monkeys" "gorilla"))
> (println (redis 'lpush "monkeys" "schimpanzee"))
> (println (redis 'lrange "monkeys" 0 2))
>
>
> Output:
> "OK"
> NIL
> "value"
> 1
> 2
> 3
> ("schimpanzee" "gorilla" "orangutang")
>
>

Reply via email to