Lisp 如何显式使用标准函数?
在下面的示例中,我遇到了与Lisp 如何显式使用标准函数?,lisp,common-lisp,loops,Lisp,Common Lisp,Loops,在下面的示例中,我遇到了与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
和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
,就像它是iterate
中的count
驱动程序一样,而不是原始函数。如何使用正确的计数?这是迭代
如何处理其主体的一个错误/功能
您可以使用一个版本的iterate
from-它使用关键字而不是普通符号,因此不会出现符号冲突。在comp.lang.lisp中,Chris Riesbeck几年前提出了一个类似问题的解决方法:
(remprop 'count 'iter::synonym)
从那时起,您需要使用COUNTING作为iterate子句。CL:COUNT然后应该引用公共Lisp函数。您需要重新编译代码。使用cl:count没有帮助?在迭代手册中,它提到了必须使用联合来防止与cl:UNION发生冲突的冲突。对伯爵来说,同样的要求也是必要的。但手册同时使用计数和计数。事实上,将iterate
添加到rutils
的两个原因之一是拒绝接受几年前的补丁(不是我的),这解决了这个特殊的问题,我认为这是它的一个关键错误。