如何将列表转换为字符串?我试图使用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)
答案 0 :(得分:1)
既然你正在使用read-from-string
,你可以告诉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
如果字符串的内容是不受信任的输入, read-from-string
是一个潜在的安全漏洞,因为哈希点评估符号。
在不受信任的数据上使用Lisp阅读器时,请务必将*read-eval*
绑定到nil
。
[2]> (read-from-string "(#.(+ 2 2))")
(4) ;
11
注意#.
表示法如何导致执行字符串数据中指定的+
函数。这可能是任何功能,例如在文件系统中敲击文件或将敏感数据发送到远程服务器的东西。
答案 1 :(得分:0)
Format
的第一个参数是要打印到的流。您似乎打算返回字符串而不是打印,因此您应该将nil
放在那里:(format nil "~s" nums)
格式控制字符串"%s"
不包含任何格式指令。整个format
形式在这里没有多大意义,因为您似乎打算在给定的nums
上循环。你应该使用一些循环结构,例如: G。 loop
,do
,map
,mapcar
...