Elisp的cl-loop设施中的条件

tma*_*urg 4 lisp loops elisp continue

我试图绕着Elisp的cl循环设施,但似乎无法找到跳过元素的方法.这是一个人为的例子来说明这个问题:我想循环一个整数列表并得到一个新的列表,其中原始列表中的所有奇数整数都是平方的.偶数整数应该省略.

根据cl-loop的文档,我应该能够这样做:

(loop for i in '(1 2 3)
      if (evenp i)
        append (list)
      else
        for x = (* x x)
        and append (list x))
Run Code Online (Sandbox Code Playgroud)

我想要的输出是'(1 9)一个错误:

cl--parse-loop-clause: Expected a `for' preposition, found (list x)
Run Code Online (Sandbox Code Playgroud)

显然这and不符合预期,但我不明白为什么.(我知道我可以简化else块只包含一个子句,这样and就不再需要了.但是,我对你真正需要连接几个子句的情况感兴趣and.)

问题的第二部分:理想情况下,我可以这样写:

(loop for i in '(1 2 3)
      if (evenp i)
        continue
      for x = (* x x)
      append (list x))
Run Code Online (Sandbox Code Playgroud)

继续是跳过其他语言迭代的一种非常常见的方法.为什么cl-loop没有continue运算符?是否有一种简单的方法可以跳过我忽略的元素(比我在第一个例子中尝试的更简单)?

Rai*_*wig 7

在Common Lisp中,不可能编写这样的LOOP.请参阅LOOP语法.

顶部有一组变量子句.但是你不能FOR在后面的主要条款中使用它.所以在一个IF条款中你不能使用FOR.如果你想引入一个局部变量,那么你需要在顶部作为一个WITH子句引入它,然后在体内设置它.

(loop for i in '(1 2 3)
      with x
      if (evenp i)
        append (list)
      else
        do (setf x (* i i))
        and append (list x))
Run Code Online (Sandbox Code Playgroud)

LOOP在Common Lisp中也没有任何continue功能.人们会使用条件子句.

请注意,Common Lisp具有更高级的迭代构造作为库ITERATE.但是Emacs Lisp并不存在.