LISP中关于格式函数的语句说明
我必须在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
(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符号和冒号修饰符之间的所需顺序。案件
将忽略指令字符。前缀参数表示为
带符号(符号是可选的)十进制数字,或作为单引号
跟着