Hi,

I'm seeking advice for passing simple key-value pairs to a function and generate a string out of these values. Neither the names not the number of keys is known in advance.

Background: This shall become a generic function for generating URI query-strings.

My current approach please see below. Anyhow, I'm wondering whether the quite and quasiquote can be replaced by something simpler.

(use-modules (ice-9 match))

(define limit 100)
(define evaluation "linux")

(define* (api-uri base path #:rest query)

  (define (build-query-string kv)
    (match kv
       ((name #f) #f)
       ((name (? string? value))
        (string-append name "=" value))  ; FIXME: encode
       ((name (? number? value))
        (string-append name "=" (number->string value)))))


  (format #t "~%Query: ~a~%~%" query)
  (let ((query-string
     (when query
       (string-join
        (filter (lambda (x) x) (map build-query-string query))
        "&"))))
    (format #t "~%Query-String: ~a~%~%" query-string)
    ;; todo: build uri incl. query-string
  ))


(api-uri "https://ci.guix.gnu.org"; "/api/jobs")
(api-uri "https://ci.guix.gnu.org"; "/api/jobs"
     `("nr" ,limit)
     `("evaluation" ,evaluation)
     `("system" ,#f))

--
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goe...@crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |


Reply via email to