【问题标题】:How to explicitly use a standard function?如何显式使用标准函数?
【发布时间】:2012-12-03 18:22:52
【问题描述】:

在下面的示例中,我遇到了与 iteratecount 标准函数的名称冲突:

(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,就好像它是来自iteratecount 驱动程序,而不是原始函数。我如何才能使用正确的count

【问题讨论】:

  • 使用 cl:count 没有帮助?
  • Iterate 手册中提到了必须使用 UNIONING 来防止与 CL:UNION 发生冲突的冲突。 COUNT 也需要类似的方法。但是手册同时使用了 COUNT 和 COUNTING。

标签: lisp common-lisp loops


【解决方案1】:

在 comp.lang.lisp 中,Chris Riesbeck 几年前提出了这个作为类似问题的解决方法:

(remprop 'count 'iter::synonym)

从那时起,您需要使用 COUNTING 作为迭代子句。 CL:COUNT 那么应该是指 Common Lisp 函数。您需要重新编译代码。

【讨论】:

    【解决方案2】:

    这是iterate 如何处理其主体的错误/功能。

    您可以使用 rutils 中的 iterate 版本 - 它使用关键字而不是普通符号,因此不会出现符号冲突。

    【讨论】:

    • 实际上,将iterate 添加到rutils 的两个原因之一是拒绝接受几年前的补丁(不是我的),它解决了这个特殊问题,我认为,这是它的一个严重错误。
    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多