Lisp 将列表分解为字符串的函数

Lisp 将列表分解为字符串的函数,lisp,destructuring,Lisp,Destructuring,我的目标是获取一个alist(alist是传递给Drakma的“parameters”param的;但这对这个问题来说并不重要),并将其序列化为某种形式的字符串(在本例中,是HTTP参数字符串) 那么让我们来看看这个列表: (list (cons 1 2) (cons 3 4) (cons 5 6)) 那么我想要的是,以如下格式的字符串结束: "?1=2&3=4&5=6" 到目前为止,我的想法是: (defvar *s* (make-ar

我的目标是获取一个alist(alist是传递给Drakma的“parameters”param的;但这对这个问题来说并不重要),并将其序列化为某种形式的字符串(在本例中,是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)))
这是一种工作,但我真的不喜欢这样,原因如下:

  • 我不想使用特殊变量
  • 每次我运行
    (序列化参数(…)
    *s*
    只需附加到上一个调用
我认为要解决我的问题,我必须以某种特殊的方式使用
循环
,并且可能必须在函数中绑定一个词法变量。问题是,我不确定如何将
(format nil“…)
的每次迭代附加到该词法变量中


免责声明:我对lisp非常陌生。

输出到字符串似乎非常适合您的问题。它生成一个可以在循环中写入的流,并以字符串形式返回您写入的内容:

(with-output-to-string (s)
   (loop with first = t
         for (a . b) in params
         if first 
           do (setq first nil)
              (princ "?" s)
         else
           do (princ "&" s)
         end
         do (format s "~a=~a" a b)))

我不明白你的问题。如果您的函数
serialize params
调用
PRINT
进行输出,为什么不直接打印,而不是使用
MAKE-ARRAY
/
FORMAT
/
SUBSEQ
/
连接
并使用
PRINT
打印字符串
FORMAT
可以直接打印到输出。对不起,我认为在
serialize params
中的打印只是检查我的代码正在执行的操作时留下的。让我编辑它,使
serialize params
返回该字符串。这里的问题是,我希望
serialize params
的输出返回我在另一个函数的其他地方使用的字符串。谢谢你指出这个困惑。我确实编辑了我的问题。这里我真正想要的是
(序列化参数)
返回一个字符串以在另一个函数中使用。显然,我的函数是错误的,因为它被写入了一个特殊的变量。然而,我想知道的是如何使用一个词法变量,在这个变量中,我可以正确地格式化字符串以返回该函数。下一步是确保了解输出到字符串的
宏的情况,以及
循环的具体工作方式。无论如何,我用那个宏改变了我的函数体,一切似乎都按预期工作。这个解决方案比我想做的要干净得多:)