2010-04-11 39 views
36

Về cơ bản, tôi muốn làm những điều sau đây, chỉ sử dụng Common Lisp thay vì Python:Tương đương của Lisp tương đương với r bên trong hàm định dạng?

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

tôi có thể làm điều này, nhưng nó chỉ xuất ra nhân vật #\newline và bỏ qua #\return:

(format t "Hello world.~%") 

Tôi tin rằng tôi có thể thực hiện điều này bằng cách sử dụng một đối số bên ngoài, như sau:

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

Nhưng có vẻ khó xử với tôi. Chắc chắn tôi bằng cách nào đó có thể nhúng #\return vào chuỗi định dạng rất giống như tôi có thể #\newline?

Trả lời

49

nhân vật để trả lại và linefeed

\r là nhân vật #\return trong Common Lisp.

\n là ký tự #\linefeed trong Lisp thông thường.

Sau đây kết thúc chuỗi "Hello world." với trả lại và dòng cấp.

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

#\newline là bất kỳ nền tảng nào sử dụng làm bộ phận phân chia. Trên các máy Unix, điều này thường giống như #\linefeed. Trên các nền tảng khác (Windows, Lisp Machines, ...), điều này có thể khác.

kiểm soát FORMAT

Việc kiểm soát FORMAT~% in một dòng mới (!).

Vì vậy

(format t "Hello world.~%") 

sẽ in xuống dòng mà hệ điều hành sử dụng. CR hoặc CRLF hoặc LF. Tùy thuộc vào nền tảng này sẽ có một hoặc hai ký tự.

Vì vậy, trên một máy tính Windows của bạn

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

có thể thực sự in: #\return#\return#\linefeed. Đó là BA nhân vật và không phải là hai. Windows sử dụng CRLF cho dòng mới. Unix sử dụng LF. Mac OS cũ (trước Mac OS X) và Lisp Machines sử dụng CR cho dòng mới.

Viết CRLF

Nếu bạn thực sự muốn in CRLF, bạn phải làm điều đó một cách rõ ràng.Ví dụ:

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

FORMAT không có cú pháp đặc biệt cho đầu ra của ký tự trả lại dòng hoặc ký tự xuống dòng.

LINEBREAKS kiểm soát FORMAT

Common Lisp cho phép chuỗi đa dòng. Như vậy chúng ta có thể sử dụng chúng như định dạng điều khiển:

Ở đây bạn có thể thấy rằng các ngắt dòng trong chuỗi điều khiển cũng là trong đầu ra:

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

first line 
second line 

NIL 

Dưới đây là một ví dụ trong đó sự kiểm soát [email protected] FORMAT giữ linebreak , nhưng xóa khoảng trống trên dòng tiếp theo:

CL-USER 78 > (format t "~%first [email protected] 
          second line~%~%") 

first line 
second line 

NIL 
+1

Trong SBCL 1.0.22, CLISP 2.47 và Clozure CL 1.3 trên Windows: (aref (định dạng nil "~%") 0) trả về # \ Dòng mới. –

+0

@Frank Shearar: và những gì (chiều dài (định dạng nil "~%")) sản xuất? Và nó tạo ra gì khi bạn viết nó vào một tập tin? Tệp này dài bao lâu? –

+1

1, 1 và 1 cho chiều dài. Với (với-mở-tệp (s #p "c: \\ foo.txt": hướng: đầu ra: nếu tồn tại: thay thế) (chuỗi ghi (định dạng nil "~%") s)), SBCL và CCL nhổ ra một tập tin 1 byte chứa \ #Newline. Clisp spat ra một tập tin 1-byte có chứa một # \ Return! –

5

Đầu tiên, trong hầu hết các ký tự Lisp thường, bao gồm cả trả về/dòng mới, có thể được chèn trực tiếp vào chuỗi. Ký tự duy nhất yêu cầu thoát là dấu tách chuỗi.

Ngoài ra còn có thư viện cl-interpol cung cấp macro đọc để tạo chuỗi có cú pháp phức tạp hơn, bao gồm cả thoát ký tự đặc biệt.

Các vấn đề liên quan