拆分格式字符串(格式 t ...)

jue*_*jue 2 common-lisp

有时我喜欢用(format t ..).
为了防止源代码中出现长时间不可读的格式字符串,并使输出易于对齐,我使用(format t (concatenate 'string ....).

例子:

(format t (concatenate 'string 
                       "some output~%"
                       "  error-msg: ~a~%"
                       "  uiop-cwd: ~a~%"
                       "  uiop-file-exists: ~a~%")
        "error foo"
        (uiop:getcwd)
        (uiop:file-exists-p "hello_world.bmp"))
Run Code Online (Sandbox Code Playgroud)

在 Common Lisp 中是否有更惯用的和编译时的方式来做同样的事情?

cor*_*ump 6

这是一个等效的格式字符串,它使用Tilde 换行符格式指令,它忽略后面的换行符和空格(直到下一个可见字符)。为了像您一样缩进空格,我在空格~%之前写了强制换行符:

(format t 
        "some output~
       ~%   error-msg: ~a~
       ~%   uiop-cwd: ~a~
       ~%   uiop-file-exists: ~a~%"
        "error foo"
        (uiop:getcwd)
        (uiop:file-exists-p "hello_world.bmp"))
Run Code Online (Sandbox Code Playgroud)

(注意。这是一个单独的字符串,因此在编译时不需要进行连接。)