279_common lisp Format小结

完整的emacs and lisp的学习集合整理如下:

https://github.com/GreyZhang/g_lisp

    继续学习emacs,继续学习lisp。这一次小结一下common lisp中的format。

    上面是一个加单的小例子,format函数传入了两个参数。第一个参数,指定的是输出的stream,第二个参数是输出信息。这里,输出的stream是nil,也就是没有。输出信息直接作为返回值返回。

    上面的测试,输出stream为t,意思是标准输入输出IO。这样,我们看到了字符串的输出,同时带有一个NIL的返回值。同样有字符串的信息输出,这个与上面的测试有什么差异呢?其实从形式上就可以看得出,一个是字符串对象,一个是纯粹的文字显示。

    当参数为t的时候,绑定的stream其实是terminal-io

    使用~a的时候代表的是格式化的参数,后面对应的是其数值。当输出信息等待接收的参数是2个的时候,输入一个会导致报错,从信息提示看是缺少了参数。以下是修正后的测试结果:

    ~可以类比为我们C语言中的printf的%。那么,既然有多种字符格式,lisp是否有呢?其实也是有的。做几个测试:

    对比之下,我们能够发现很多共同点。当然,这两者之间的部分形式也不是百分之百的等同。

    如果,后面的传入输出参数是一个列表,那么当遇到独立的~a的时候会直接导入列表。如果我们想使用列表的内容组合,那么就得使用~{。这一部分倒是可以从我最初接触的《实用common lisp编程》那本书中找到说明。当fromat遇到第一个~{的时候,接下来的参数必须是一个列表,接下来format将会在列表上循环操作。操作位于~{与~}之间。

    既然是循环操作,我们就可以在每一次的操作后增加一部分分隔信息。这个分隔信息可以使单个字符,也可以使多个。

    回到仅仅增加了逗号的情况,这时候,最后一个元素也增加了逗号。如何让最后一个不再增加呢?我们需要在~a这个参数后面继续增加其他的属性标识,通过增加~^提示排除最后一个元素。其实,在正则表达式中,我们经常用到$^,这引发了我的一点联想。做了一个测试,其实我也暂时没找到文档类的说明。当然,这个测试仅仅是胡乱猜测尝试,毕竟开始以及结尾的锚定符号与这里似乎也是相反的。从上面的表达效果看,看上去似乎是触发了一个浮点的转换指令。关于这个具体的用法,后面我还会寻找更详细的文档学习。

    上面的例子主要是看一个~s的格式标识符,这个s其实是standard的意思。从效果看,其实这个输出总是尽量输出一个能够回读解析的一种格式。

    ~[~]是条件选择,使用@修饰可以实现当掺入的参数是非nil的时候才采用条件输出。

    上面的这个功能,主要是展示了一个换行的功能。类似于C语言printf中的\n。目前在C语言中,printf是我的一个软件调试的好帮手,那么在lisp学习中,这个替代者无疑就是format了。

完整的emacs and lisp的学习集合整理如下:

https://github.com/GreyZhang/g_lisp

发布了891 篇原创文章 · 获赞 170 · 访问量 176万+

猜你喜欢

转载自blog.csdn.net/grey_csdn/article/details/104526271