如何在lisp中将列表转换为字符串

如何在lisp中将列表转换为字符串,lisp,common-lisp,Lisp,Common Lisp,如何将列表转换为字符串?我试图使用parse int获取数字列表并将其转换为十进制,但最终得到一个错误:“控制字符串必须是字符串,而不是(内容)”。 我正在使用格式,但我不确定是否使用了错误的格式 这是我的密码: (princ "Enter a or list of hexadecimal numbers: ") (setq numList (read-from-string (concatenate 'string "(" (read-line) ")"))) (def

如何将列表转换为字符串?我试图使用parse int获取数字列表并将其转换为十进制,但最终得到一个错误:“控制字符串必须是字符串,而不是(内容)”。 我正在使用格式,但我不确定是否使用了错误的格式

这是我的密码:

    (princ "Enter a or list of hexadecimal numbers: ")
    (setq numList (read-from-string (concatenate 'string "(" (read-line) ")")))
    (defun hextodec(nums)
            (setq  numString (format "%s" nums))
            (setq newNum (parse-integer numString :radix 16))
            (write nums)
            (princ " = ")
            (write newNum)
    ) ;This will format the number that the user enters
    (hextodec numList)

Format
的第一个参数是要打印到的流。您似乎打算返回字符串而不是打印,因此应该将
nil
放在那里:
(格式nil”~s“nums)


格式控制字符串
“%s”
不包含任何格式指令。整个
格式
表单在这里没有多大意义,因为您似乎打算在给定的
nums
上循环。您应该为此使用一些循环构造,例如。g<代码>循环,
执行
映射
映射车

既然您使用的是
从字符串读取
,您可以告诉Lisp的阅读器读取以16为基数的整数:

;; CLISP session
[1]> (let ((*read-base* 16)) (read-from-string "(9 A B C F 10)"))
(9 10 11 12 15 16) ;
14
从字符串读取
是一个潜在的安全漏洞,如果字符串的内容是不可信的输入,因为哈希点计算符号

在不受信任的数据上使用Lisp读取器时,请确保将
*read eval*
绑定到
nil

[2]> (read-from-string "(#.(+ 2 2))")
(4) ;
11

请注意
#.
符号是如何导致执行字符串数据中指定的
+
函数的。这可以是任何函数,例如,对文件系统中的文件进行重击,或将敏感数据发送到远程服务器。

“%s”在Lisp中无效。您还使用了许多未声明的变量,如numList、numString、newNum。打印后也无法清除输出缓冲区。请参阅FINISH-OUTPUT。基本字符串打印指令是
~a
(美学)。也许你已经习惯了Clojure的格式?正如其他人所指出的,Lisp格式(以及来自pretty print模块的Clojure cl format函数)将是(格式为nil“~s”)。在另一个问题上,hextodec似乎认为它的输入是一个列表在一个地方,一个十六进制字符串在另一个地方。@RainerJoswig
“%s”
在Common Lisp的
格式中无效,但在Emacs Lisp的
格式中有效。但是,它被标记为
commonlisp
,因此这似乎没有什么意义。