lisp - 关于 LISP 中关于格式函数的语句的解释

标签 lisp common-lisp sbcl

我必须在 lisp 中将十进制数转换为二进制数。我在网上搜索时遇到了这段代码。

(defun :bits (value &optional (size 64))
(format t "~v,'~B" size value))

所以请解释一下代码的每个属性将做什么。

最佳答案

Mongus Pong's answer很好地描述了您正在查看的代码的实际行为,但我认为也总是值得一提在哪里来找到答案。 Common Lisp HyperSpec是 Common Lisp 文档的最佳来源,但它的某些部分有点难以阅读。有时 format 的指令文档可能有点密集。在这种情况下,您将需要查看几个部分,因为示例中的某些内容不仅仅适用于二进制指令 ~B。

你想从 22.3 Formatted Output 开始,它描述了格式字符串的语法:

A directive consists of a tilde, optional prefix parameters separated by commas, optional colon and at-sign modifiers, and a single character indicating what kind of directive this is. There is no required ordering between the at-sign and colon modifier. The case of the directive character is ignored. Prefix parameters are notated as signed (sign is optional) decimal numbers, or as a single-quote followed by a character. For example, ~5,'0d can be used to print an integer in decimal radix in five columns with leading zeros, or ~5,'*d to get leading asterisks.

所以我们希望看到一个波浪号,然后是(可选的)由冒号分隔的参数,一个(可选的)at 符号 (@),一个(可选的)冒号 (:),以及实际的前缀指令(大小写敏感的)。也就是说

~v,'~B

分解为

~   ; initial tilde
v   ; prefix parameter (could also be V)
,   ; separator between prefix parameters
'~  ; prefix parameter (character following single quote)
B   ; directive (could also be b)

所以我们有两个前缀参数:v~,指令是B。文档中的下一段描述了 v 作为前缀参数时的作用:

In place of a prefix parameter to a directive, V (or v) can be used. In this case, format takes an argument from args as a parameter to the directive. The argument should be an integer or character. If the arg used by a V parameter is nil, the effect is as if the parameter had been omitted.

现在,要了解 ~B 的一般作用,您需要查看 22.3.2.3 Tilde B: Binary ,尽管它几乎会将您重定向到其他地方:

This is just like ~D but prints in binary radix (radix 2) instead of decimal. The full form is therefore ~mincol,padchar,commachar,comma-intervalB.

该文档描述了可接受的前缀参数(mincol、padchar、commachar 和 comma-interval)。这些是从左到右填写的。示例 ~v,'B 有两个,所以 v 是 mincol 而 ' 是 padchar。但是我们还是要看22.3.2.2 Tilde D: Decimal对于每一个的含义:

~mincolD uses a column width of mincol; spaces are inserted on the left if the number requires fewer than mincol columns for its digits and sign. If the number doesn't fit in mincol columns, additional columns are used as needed.

~mincol,padcharD uses padchar as the pad character instead of space.

… The : modifier causes commas to be printed between groups of digits; commachar may be used to change the character used as the comma. comma-interval must be an integer and defaults to 3. When the : modifier is given to any of these directives, the commachar is printed between groups of comma-interval digits.

所以,mincol,结果的宽度为v,表示将从参数列表中读取,padchar,填充字符,为~>。因此:

CL-USER> (bits 13 10)
~~~~~~1101                ; 10 characters wide, padded with ~

CL-USER> (bits 1022 10)
1111111110                ; 10 characters wide, no need for padding

CL-USER> (bits 1022 11)   ; 11 characters with, padded with ~
~1111111110

关于lisp - 关于 LISP 中关于格式函数的语句的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34408146/

相关文章:

lisp - 在 Common Lisp 中初始化计数器变量

common-lisp - 为什么 SBCL 提示 setf?

lisp - 写入/读取 Common Lisp (SBCL) 哈希表,或替代方案

lisp - 在 Lisp 中,为什么我们需要使用列表函数来返回列表?

file-io - 使用 Common Lisp 读取文件

list - 如何用 nil 创建点对

ssl - Common Lisp 中基于 SSL/TLS 的 Pop3

scheme - 为什么 scheme 不允许您从另一个函数中调用一个函数?

lisp - 如何写一个clisp可执行文件?

lisp - Common Lisp 中的动态绑定(bind)