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

时间:2017-12-06 00:40:51

标签: lisp common-lisp

如何将列表转换为字符串?我试图使用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)

2 个答案:

答案 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。 loopdomapmapcar ...