如何在lisp中将列表转换为字符串
如何将列表转换为字符串?我试图使用parse int获取数字列表并将其转换为十进制,但最终得到一个错误:“控制字符串必须是字符串,而不是(内容)”。 我正在使用格式,但我不确定是否使用了错误的格式 这是我的密码:如何在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
(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
,因此这似乎没有什么意义。