常见Lisp循环故障

常见Lisp循环故障,lisp,common-lisp,Lisp,Common Lisp,我很难完全理解CL的循环宏。 这是我的32号Euler项目代码: (defun number-to-list (nr) (map 'list #'digit-char-p (prin1-to-string nr))) (defun nine-digits-p (multiplicand multiplier ) (= (length (equationlist multiplicand multiplier (

我很难完全理解CL的循环宏。 这是我的32号Euler项目代码:

(defun number-to-list (nr)
  (map 'list #'digit-char-p (prin1-to-string nr)))

(defun nine-digits-p (multiplicand multiplier )
  (= (length (equationlist multiplicand multiplier 
                                     (* multiplicand multiplier))) 9))

(defun equationlist (multiplicand multiplier product)
  (append (number-to-list multiplicand) (number-to-list multiplier)
      (number-to-list product)))

(defun pandigital (multiplicand multiplier)
  (equal (sort (equationlist multiplicand multiplier
                 (* multiplicand multiplier)) #'<)
     '(1 2 3 4 5 6 7 8 9)))

(defun pandigital-list ()
  (loop
       for i from 1 to 2000 collect
       (loop for j from 2 to 2000
       when (and (nine-digits-p i j) (pandigital i j)) collect (* i j))))


(defun euler-32 ()
  (reduce #'+ (reduce #'union (pandigital-list))))
(要列出的编号(nr)
(映射'list#'digit-char-p(prin1到string nr)))
(定义九位数p(被乘数)
(=(长度(等式列表被乘数和乘数)
(*被乘数)9)
(defun等式列表(被乘数与乘数乘积)
(追加(数字到列表被乘数)(数字到列表被乘数)
(列出产品的编号)))
(定义泛数字(被乘数和乘数)
(相等(排序)(等式列表乘法器和乘法器

(*被乘数)#'问题在于,内部
循环
在不收集任何其他内容时返回
nil
。(请记住:在常见的Lisp中,所有内容都有一个值。)

一种解决方案是重新定义
pandigital list
,如下所示:

(defun pandigital-list ()
   (loop for i from 1 to 2000
         for sublist = (loop for j from 2 to 2000
                             when (and (nine-digits-p i j)
                                       (pandigital i j))
                             collect (* i j))
             when sublist collect sublist))

问题是,只要内部
循环不收集任何其他内容,它就会返回
nil
。(请记住:在常见的Lisp中,所有内容都有一个值。)

一种解决方案是重新定义
pandigital list
,如下所示:

(defun pandigital-list ()
   (loop for i from 1 to 2000
         for sublist = (loop for j from 2 to 2000
                             when (and (nine-digits-p i j)
                                       (pandigital i j))
                             collect (* i j))
             when sublist collect sublist))

这可以写得稍微短一点:
(当(循环…)收集它时,i从i循环到2000)
它是一个保留测试结果的预定义变量。@Rainer Joswig。谢谢。我忘记了循环的回指可能性。这可以写得稍微短一点:
(当(循环…)收集它时,i从i循环到2000)
它是一个预定义的变量,用于保存测试结果。@Rainer Joswig。谢谢。我忘记了循环的回指可能性。