2015-10-29 26 views
0

此代碼Common Lisp的:如何抑制換行符或 「軟回車」

(defun arabic_to_roman (filename) 
    (let ((arab_roman_dp '()) 
      (arab nil) 
      (roman nil)) 

     (with-open-file (in filename 
          :direction :input 
          :if-does-not-exist nil) 

     (when in 
      (loop for line = (read-line in nil) 
       while line do 
       (setq arab (subseq line 0 (search "=" line))) 
       (setq roman (subseq line (1+ (search "=" line)) (length line))) 
       (setf arab_roman_dp (acons arab roman arab_roman_dp)) 
              ;(format t "~S ~S~%" arab roman) 
       ))) 

     (with-open-file (stream #p"ar_out.txt" 
           :direction :output 
           :if-exists :overwrite 
           :if-does-not-exist :create) 
     (write arab_roman_dp :stream stream :escape nil :readably nil)) 
     'done!)) 

似乎運作良好。它需要一個像這樣的條目的文件

1=I 
2=II 
... 

並建立一個大的虛線對列表。但是,當我查看輸出文件時,似乎插入了軟回車或換行符。

((4999 . MMMMCMXCIX) (4998 . MMMMCMXCVIII) (4997 . MMMMCMXCVII) 
(4996 . MMMMCMXCVI) (4995 . MMMMCMXCV) (4994 . MMMMCMXCIV) 
(4993 . MMMMCMXCIII) (4992 . MMMMCMXCII) (4991 . MMMMCMXCI) (4990 . MMMMCMXC) 
... 

我期待輸出看起來更像只是一個連續的行:

((4999 . MMMMCMXCIX) (4998 . MMMMCMXCVIII) (4997 . MMMMCMXCVII) (4996 . MMMCMXCVI) (4995 . MMMMCMXCV) (4994 . MMMMCMXCIV) (4993 . MMMMCMXCIII) (4992 . MMMMCMXCII) (4991 . MMMMCMXCI) (4990 . MMMMCMXC) ... 

是我的代碼它確實不知何故扔在換行的方式嗎?我使用了write版本的princ,據說它抑制了換行符。後來我想把這個文件作爲一個大列表讀回到程序中,所以我不想換行符問題。

+1

如果您使用Lisp閱讀器讀取它,無論如何,換行符都不是問題。 –

回答

5

它看起來像漂亮的打印機正在被調用(默認是實現相關的),打印它與縮進和人類可讀的行長度。使用:pretty nil來禁用此功能。

(write arab_roman_dp :stream stream :escape nil :readably nil :pretty nil) 
0

一種更好的方式把它寫:

  • 使用函數來創建的代碼塊,其可以被組合
  • 更少的副作用和更少的變量
  • 不需要測試in
  • 易於理解的控制流程

示例:

(defun arabic_to_roman (filename) 
    (flet ((read-it() 
      (with-open-file (in filename 
           :direction :input 
           :if-does-not-exist nil) 
      (loop for line = (read-line in nil) 
        for pos = (position #\= line) 
        while line collect (cons (subseq line 0 pos) 
              (subseq line (1+ pos)))))) 
     (write-it (list) 
      (with-open-file (stream #p"ar_out.txt" 
            :direction :output 
            :if-exists :overwrite 
            :if-does-not-exist :create) 
      (write list :stream stream :escape nil :readably nil :pretty nil)))) 
    (write-it (read-it)) 
    'done-read-write))