Common Lisp's equivalent of \r inside the format function?

后端 未结 2 821
感动是毒
感动是毒 2021-01-31 08:11

Basically, I\'d like to do the following, only using Common Lisp instead of Python:

print(\"Hello world.\\r\\n\")

I can do this, but it only ou

相关标签:
2条回答
  • 2021-01-31 08:18

    First, in Common Lisp most characters, including return/newline, can be inserted directly into the string. The only character requiring escaping is the string delimiter.

    There is also a library cl-interpol which provides a read macro to construct strings with more complex syntax, including special character escapes.

    0 讨论(0)
  • 2021-01-31 08:25

    Characters for return and linefeed

    \r is the character #\return in Common Lisp.

    \n is the character #\linefeed in Common Lisp.

    The following ends the string "Hello world." with return and linefeed.

    (format t "Hello world.~C~C" #\return #\linefeed)
    

    #\newline is whatever the platform uses as a line division. On Unix machines this is often the same as #\linefeed. On other platforms (Windows, Lisp Machines, ...) this could be different.

    FORMAT control

    The FORMAT control ~% prints a newline (!).

    So

    (format t "Hello world.~%")
    

    will print the newline that the operating system uses. CR or CRLF or LF. Depending on the platform this will be one or two characters.

    So, on a Windows machine your

    (format t "Hello world.~C~%" #\return)
    

    might actually print: #\return #\return #\linefeed. Which is THREE characters and not two. Windows uses CRLF for newlines. Unix uses LF. Old Mac OS (prior to Mac OS X) and Lisp Machines used CR for newlines.

    Writing CRLF

    If you really want to print CRLF, you have to do it explicitly. For example with:

    (defun crlf (&optional (stream *standard-output*))
      (write-char #\return stream)
      (write-char #\linefeed stream)
      (values))
    

    FORMAT does not have special syntax for output of linefeed or carriage return characters.

    Linebreaks in FORMAT control

    Common Lisp allows multi-line strings. Thus we can use them as format controls:

    Here you can see that the line break in the control string is also in the output:

    CL-USER 77 > (format t "~%first line
    second line~%~%")
    
    first line
    second line
    
    NIL
    

    Here is an example where the ~@ FORMAT control keeps the linebreak, but removes the whitespace on the next line:

    CL-USER 78 > (format t "~%first line~@
                              second line~%~%")
    
    first line
    second line
    
    NIL
    
    0 讨论(0)
提交回复
热议问题