2

私の目標は、連想リスト (連想リストはドラクマの「パラメーター」パラメーターに渡されるものですが、これはこの質問にはあまり関係ありません) を取得し、それを何らかの形式の文字列 (この場合は HTTP パラメーター文字列) にシリアル化することです。 )。

それでは、そのリストを見てみましょう:

    (list (cons 1 2) (cons 3 4) (cons 5 6))

次に、私が望むのは、次のようにフォーマットされた文字列で終わることです:

    "?1=2&3=4&5=6"

私がこれまでに思いついたのは次のとおりです。

    (defvar *s* 
      (make-array 0 
              :element-type 'character 
              :adjustable t 
              :fill-pointer 0))

    ;; (serialize-params) will return a properly formatted string 
    ;; that will be used elsewhere in another function
    (defun serialize-params (params)
      (loop for (a . b) in params
         do (format *s* "~a=~a&" a b))
      (concatenate 'string "?" (trim *s*)))

    ;; Utility function to remove the last character of a string
    (defun trim (str)
      (subseq str 0 (- (length str) 1)))

それは一種の仕事ですが、私はいくつかの理由でこれが本当に好きではありません:

  • 特別な変数を使いたくない
  • を実行するたびに(serialize-params (...))*s*前の呼び出しに追加するだけです

私の問題を解決するには、loop特別な方法で使用する必要があり、おそらく関数内でレキシカル変数をバインドする必要があると思います。(format nil "...")問題は、そのレキシカル変数に各反復を追加する方法がわからないことです...

免責事項: 私は Lisp の初心者です。

4

1 に答える 1