2

以下の例では、標準関数iterateとの名前の衝突が発生しています。count

(defun svs-to-images (file)
  (with-open-file (stream file)
    (iterate:iter
      (iterate:for line #:= (read-line stream nil nil))
      (iterate:while line)
      (line-to-image
       (iterate:iter
         (iterate:for c #:in-string line)
         (iterate:with word)
         (iterate:with pos #:= 0)
         (iterate:with result #:= ; ---------\/ here
                       (make-array (list (1+ (count #\, line)))
                                   :element-type 'fixnum))
         (if (char= c #\,)
             (setf (aref result pos)
                   (parse-integer
                    (coerce (reverse word) 'string))
                   pos (1+ pos)
                   word nil)
             (setf word (cons c word)))
         (iterate:finally result)) 28))))

私が得ているエラーは次のとおりです。

csv-parser.lisp:19:5:
  error: 
    during macroexpansion of
    (ITERATE:ITER
      (ITERATE:FOR LINE #:= ...)
      (ITERATE:WHILE LINE)
      ...).
    Use *BREAK-ON-SIGNALS* to intercept:

     Iterate, in (COUNT , LINE):
    Missing value for LINE keyword

Compilation failed.

そして、私が正しく理解していれば、元の関数ではなく、からのドライバーでcountあるかのように使用しようとしています。正しいものが使用されるようにするにはどうすればよいですか?countiteratecount

4

2 に答える 2

2

comp.lang.lispで、Chris Riesbeckは、数年前に同様の質問の回避策としてこれを提供しました。

(remprop 'count 'iter::synonym)

それ以降は、反復句としてCOUNTINGを使用する必要があります。CL:COUNTは、CommonLisp関数を参照する必要があります。コードを再コンパイルする必要があります。

于 2012-12-16T14:10:51.590 に答える
1

iterateこれは、本体の処理方法のバグ/機能です。

iteratefrom rutilsのバージョンを使用できます。単純なシンボルの代わりにキーワードを使用するため、シンボルの衝突はありません。

于 2012-12-16T13:38:32.587 に答える