2011/02/16

query string


小粒つながりで、こういうのも良いかも。あんまりスッキリしないけど。
(alist->query-string '((hoge . 1)(fuga . 2)(foo . bar)))
;; -> "?hoge=1&fuga=2&foo=bar"

(use srfi-13)
(use util.list)
(use rfc.uri)

(define (alist->query-string alist)
  (let1 ues (^v (uri-encode-string (x->string v)))
    (string-append
     "?"
     (string-concatenate
      (intersperse
      "&"
      (fold-right (^ (e acc)
                     (cons (string-append
                            (ues (car e)) "=" (ues (cdr e)))
                           acc))
                  '() alist))))))

それともこんなん。
(use srfi-1)
(use rfc.uri)

(define (alist->query-string alist)
  (let1 ues (^v (uri-encode-string (x->string v)))
    (pair-fold (^ (pr acc)
                  (let1 e (car pr)
                    (string-append
                     acc (ues (car e)) "=" (ues (cdr e))
                     (if (null? (cdr pr))
                         ""
                         "&")
                     )))
               "?" alist)))

こういうのって別に中身なんてどうでも良いんだけど、なぜか楽しい。

追記

(define (query-compose query)
  (string-join (map (cut string-join <> "=") query) "&"))

(query-compose '(("hoge" "1")("fuga" "foo")))
;; "hoge=1&fuga=foo"
うわー、すっきり。

パズルゲームアルゴリズムマニアックス

0 件のコメント:

コメントを投稿