Lisp 将列表分解为字符串的函数
我的目标是获取一个alist(alist是传递给Drakma的“parameters”param的;但这对这个问题来说并不重要),并将其序列化为某种形式的字符串(在本例中,是HTTP参数字符串) 那么让我们来看看这个列表: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
(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
的输出返回我在另一个函数的其他地方使用的字符串。谢谢你指出这个困惑。我确实编辑了我的问题。这里我真正想要的是(序列化参数)
返回一个字符串以在另一个函数中使用。显然,我的函数是错误的,因为它被写入了一个特殊的变量。然而,我想知道的是如何使用一个词法变量,在这个变量中,我可以正确地格式化字符串以返回该函数。下一步是确保了解输出到字符串的宏的情况,以及循环的具体工作方式。无论如何,我用那个宏改变了我的函数体,一切似乎都按预期工作。这个解决方案比我想做的要干净得多:)