Loops 公共Lisp循环宏变量绑定

Loops 公共Lisp循环宏变量绑定,loops,common-lisp,Loops,Common Lisp,我在理解带关键字的如何工作时遇到了问题。特别是,我认为它与let语句相同,但它不在后面 例如,这两个代码“应该”打印相同的值,但第一个代码给出(nil nil),而后者工作正常 (loop for c in clauses with p = (car c) collect p) (loop for c in clauses collect (car c)) with用于创建局部辅助变量。它们在循环开始之前被初始化一次,因此与写入以下内容相同: (let ((p (ca

我在理解带关键字的
如何工作时遇到了问题。特别是,我认为它与
let
语句相同,但它不在后面

例如,这两个代码“应该”打印相同的值,但第一个代码给出
(nil nil)
,而后者工作正常

(loop for c in clauses
    with p = (car c)
    collect p)

(loop for c in clauses
    collect (car c))

with
用于创建局部辅助变量。它们在循环开始之前被初始化一次,因此与写入以下内容相同:

(let ((p (car c))
  (loop for c in clauses
    collect p))
除此之外,似乎
c
作为
nil
同时存在
(car c)
i sdone。我想这是因为
loop
一开始就一次性创建了所有变量,就像我在这里创建的
p
一样

您正在为
查找

(loop 
  for c in clauses
  for p = (car c)
  collect p)
为什么不进行分解呢

(loop 
  for (p) in clauses
  collect p)

有一件事有助于更好地理解
循环
,那就是
循环
有三个不同的子句部分

(loop

  ; first a single optional NAME clause

  ; then zero or more variable clauses with WITH, INITIAL, FINALLY and/or FOR

  ; then zero or more main clauses with DO, RETURN, COLLECT, APPEND, SUM, NCONC, ...
  )
必须遵守这些条款和章节的顺序

有两种方法可以引入变量:
FOR
WITH
FOR
在每次迭代中更新变量,而
WITH
只执行一次。您可以在正确的部分中按任意顺序编写这些子句,但是通常在
FOR
变量具有正确的值之前创建具有
绑定的
及其值,尽管不总是这样

LispWorks警告您的特定代码:

CL-USER 6 > (loop for c in '((1) (2) (3))
                  with p = (car c)
                  collect p)

Warning: Local Variable Initialization clause
  (the binding of P) follows iteration forms but will be evaluated before them.

(NIL NIL NIL)

(loop for c in clauses
    with p = (car c)
    collect p)
将通过以下方式实现:

(...
   (let ((c nil) ...)
     (let ((p (car c)))   ; your (CAR ...)  form

        ; iteration code ...

     )))
在本例中,您获得了一些“运气”,因为
(无车)
正好工作,只有结果不是您期望的结果-默默地

但这将产生一个错误:

(loop for c in '((1) (2) (3))
      with p = (1+ c)    ; note the 1+ instead of CAR
      collect p)
这里的
(1+nil)
将不起作用,并且将是一个错误,因为函数
1+
只接受数字作为参数。您不会看到意外的结果,但会看到错误

样式规则

  • 不要将
    FOR
    子句混用
子句的前面写上带有子句的
  • 不要依赖于特定于实现的行为和效果

  • for..
    =
    子句在每次没有
    时执行,然后
    被给出;您不需要重复表单。@Svante这很有意义。我尽量避免使用
    =
    ,因为虽然你可以用它做任何事情,但它从来不是最简单的方法。