【问题标题】:How to convert a list into a string in lisp如何在lisp中将列表转换为字符串
【发布时间】:2017-12-06 00:40:50
【问题描述】:

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

【问题讨论】:

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

标签: lisp common-lisp


【解决方案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

注意#. 表示法如何导致字符串数据中指定的+ 函数被执行。这可以是任何功能,例如破坏文件系统中的文件或将敏感数据发送到远程服务器的功能。

【讨论】:

    【解决方案2】:

    Format 的第一个参数是要打印到的流。你似乎打算返回字符串而不是打印,所以你应该把nil放在那里:(format nil "~s" nums)

    格式控制字符串"%s" 不包含任何格式指令。整个format 表单在这里没有多大意义,因为您似乎打算循环遍历给定的nums。您应该为此使用一些循环结构,例如。 G。 loop, do, map, mapcar ....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2013-10-31
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多