0

フラットファイルに列を追加する新しい関数にいくつかの引数を渡そうとしています。呼び出しは次のようになります。

(add-col-to-ff '(:absolute "home" "lambda" "Documents") "test-col-col"
               '(:absolute "home" "lambda" "Documents") "test-col-ff"     
               '(:absolute "home" "lambda" "Documents") "test-col-new.txt") 

しかし、SLIMEはエラーを返します:

#<SB-SYS:FD-STREAM for "file /home/lambda/Documents/test-col-new.txt" 
{B50D7E1}> is not a character input stream.
[Condition of type SIMPLE-TYPE-ERROR]
Backtrace:
  0: (SB-KERNEL:ILL-IN #<SB-SYS:FD-STREAM for "file /home/lambda/Documents/test-    
     col-new.txt" {B50D7E1}>)

私は疑問に思っていました、私はここで何が欠けていますか?ストリームのレイアウトは問題ないようです。

(defun add-col-to-ff (col-dir col-file 
                      ff-dir ff-file 
                      out-dir out-file)
  (let ((M (make-ff-array ff-dir ff-file))
        (vec (vec-from-1col-ff col-dir col-file))
        (path (make-pathname :name out-file 
                             :directory out-dir)))
    (with-open-file (addcol-str path :direction :output)
      (do ((line (read-line addcol-str nil 'eof)
                 (read-line addcol-str nil 'eof))
           (i 0 (1+ i)))
          ((eql i (array-dimension M 1))) 
          (dotimes (k (array-dimension M 0))
            (cond ((eql (1+ k) (array-dimension M 0))
                   (format addcol-str "~A ~A~%" (aref M i k) (svref vec k)))
                  ((and (eql (1+ i) (array-dimension M 1)) 
                        (eql (1+ k) (array-dimension M 0)))
                   (format addcol-str "~A ~A"  (aref M i k) (svref vec k)))
                  (t (format addcol-str "~A " (aref M i k)))))))))                 
4

2 に答える 2

2

出力用のストリームを開きます。ただし、を使用してその出力ストリームから読み取ろうとしますREAD-LINE。当然、これは機能しません。

于 2013-02-19T16:25:57.707 に答える
0

受け入れられた答えに従って、私はdoマクロをdotimes次のように置き換えました。

(defun add-col-to-ff (col-dir col-file 
                      ff-dir ff-file 
                      out-dir out-file)
  (let ((M (make-ff-array ff-dir ff-file))
        (vec (vec-from-1col-ff col-dir col-file))
        (path (make-pathname :name out-file 
                             :directory out-dir)))
    (with-open-file (addcol-str path :direction :output)
      (dotimes (i (array-dimension M 0)) 
          (dotimes (k (array-dimension M 1))
            (cond ((eql (1+ k) (array-dimension M 0))
                   (format addcol-str "~A ~A~%" (aref M i k) (svref vec k)))
                  ((and (eql (1+ i) (array-dimension M 0)) 
                        (eql (1+ k) (array-dimension M 1)))
                   (format addcol-str "~A ~A"  (aref M i k) (svref vec k)))
                  (t (format addcol-str "~A " (aref M i k))))))))) 

チャームのように機能します。

于 2013-02-19T16:52:40.610 に答える