LISP中关于格式函数的语句说明

LISP中关于格式函数的语句说明,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,我必须在lisp中将十进制数转换为二进制数。我在网上搜索时遇到了这个代码 (defun :bits (value &optional (size 64)) (format t "~v,'~B" size value)) 因此,请解释代码的每个属性将做什么。因此(格式nil”~B“23)将以二进制形式输出数字: > (format nil "~B" 23) "10111" 但是我们想要指定输出字符串的大小,我们可以通过在格式字符串中添加大小作为前缀来实现 > (format

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

(defun :bits (value &optional (size 64))
(format t "~v,'~B" size value))
因此,请解释代码的每个属性将做什么。

因此
(格式nil”~B“23)
将以二进制形式输出数字:

> (format nil "~B" 23)
"10111"
但是我们想要指定输出字符串的大小,我们可以通过在格式字符串中添加大小作为前缀来实现

> (format nil "~8B" 23)
"   10111"
但我们不想用空格填充它。我们想用
~
填充它

> (format nil "~8,'~B" 23)
"~~~10111"
现在我们不想硬编码格式字符串中的输出大小,我们希望将其作为参数传入。这就是~v的作用所在:

> (format nil "~v,'~B" 8 23)
"~~~10111"
现在请注意,我将
nil
作为第二个参数传递,而不是
t
。传递nil表示format返回格式化字符串,而不是打印它。您可能更愿意这样做。

因此
(格式nil”~B“23)
将以二进制形式输出数字:

> (format nil "~B" 23)
"10111"
但是我们想要指定输出字符串的大小,我们可以通过在格式字符串中添加大小作为前缀来实现

> (format nil "~8B" 23)
"   10111"
但我们不想用空格填充它。我们想用
~
填充它

> (format nil "~8,'~B" 23)
"~~~10111"
现在我们不想硬编码格式字符串中的输出大小,我们希望将其作为参数传入。这就是~v的作用所在:

> (format nil "~v,'~B" 8 23)
"~~~10111"
现在请注意,我将
nil
作为第二个参数传递,而不是
t
。传递nil表示format返回格式化字符串,而不是打印它。您可能更愿意这样做。

非常好地描述了您正在查看的代码的实际行为,但我认为在哪里找到答案也总是值得一提的。是公共Lisp文档的最佳来源,但其中有些部分有点难以阅读。有时,的指令文档可能有点密集。在本例中,您需要看到几个部分,因为您的示例中的一些内容不仅仅适用于二进制指令~B

首先,它描述了格式字符串的语法:

指令由一个tilde组成,可选前缀参数分隔开 通过逗号、可选冒号和at符号修饰符以及单个 指示这是哪种指令的字符。没有 at符号和冒号修饰符之间的所需顺序。案件 将忽略指令字符。前缀参数表示为 带符号(符号是可选的)十进制数字,或作为单引号 后面跟着一个字符。例如,~5,'0d可用于打印 五列中带前导零的十进制整数,或~5'*d 以获取前导星号

所以我们希望看到一个tilde,然后(可选)由冒号分隔的参数,一个(可选)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作为前缀参数时的功能:

可以使用V(或V)代替指令的前缀参数。 在这种情况下,format将args中的参数作为 指令。参数应为整数或字符。如果arg V参数使用的值为nil,其效果就好像该参数 省略了

现在,要了解~B的一般功能,您需要了解,尽管它会将您重定向到其他地方:

这与~D类似,但打印的是二进制基数(基数2),而不是 十进制的因此,全文如下: ~mincol,padchar,commachar,comma intervalB

该文档描述了可接受的前缀参数(mincol、padchar、commachar和逗号间隔)。这些是从左到右填写的。示例~v,'B有两个,因此v是mincol,'是padchar。但我们仍然需要了解其中每一项的含义:

~mincolD使用mincol的列宽;空格将插入到 如果数字的数字要求少于mincol列,则为左 然后签字。如果该数字不适合mincol列,则添加 根据需要使用列

~mincol,padcharD使用padchar作为pad字符,而不是空格

…修饰符:导致在数字组之间打印逗号; commachar可用于更改用作逗号的字符。 逗号间隔必须是整数,默认值为3。当: 如果对这些指令中的任何一个进行修改,则会打印逗号 在逗号间隔数字组之间

因此,mincol,结果的宽度是v,这意味着它将从参数列表中读取,而padchar,padding字符是~。因此:

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文档的最佳来源,但其中有些部分有点难以阅读。有时,的指令文档可能有点密集。在本例中,您需要看到几个部分,因为您的示例中的一些内容不仅仅适用于二进制指令~B

首先,它描述了格式字符串的语法:

指令由一个tilde组成,可选前缀参数分隔开 通过逗号、可选冒号和at符号修饰符以及单个 指示这是哪种指令的字符。没有 at符号和冒号修饰符之间的所需顺序。案件 将忽略指令字符。前缀参数表示为 带符号(符号是可选的)十进制数字,或作为单引号 跟着