Common Lisp:内部循环的缺点

1 lisp common-lisp

我想知道为什么在下面的代码中,d没有被cons编入x.任何提示都非常感谢.

(defun it (x) 
  (setq f '(a b c))
  (dolist (d f)
    (cons d x))
  (print x))
Run Code Online (Sandbox Code Playgroud)

谢谢!

Car*_*icz 10

我对LISP了解不多,但我认为我知道的一些事情可能会对你有所帮助:

  • (cons dx)不将d"放入"x; 它创建一个由d组成的新值,后跟x的内容.如果x是列表,那么(cons dx)也将是一个列表.

  • (cons dx)不会改变任何东西; 它会创建一个值,但是如果您没有捕获该值,它将再次被丢弃.特别是,该表达式不会改变x.

  • cons不会创建新列表.它只是创建一个新的cons单元格(一个带有两个指针并返回的结构.该单元格的CAR是CONS的第一个参数,该单元格的CDR是CONS的第二个参数. (3认同)

Rai*_*wig 6

您需要使用PUSH来破坏性地更新变量.CONS只返回一个新的cons小区.如果你没有对那个利弊细胞做任何事情,那就消失了.也不是你需要声明所有变量.LET引入了一个新的局部变量F,因此LET在您的示例中很有用.在未声明的变量上执行SETQ或SETF并不是一件好事 - 实际上在Lisp标准中,后果对于这样的操作是不确定的.

(defun it (x) 
  (let ((f '(a b c)))
    (dolist (d f)
      (push d x))
    (print x)))
Run Code Online (Sandbox Code Playgroud)

或者使用更实用的方法.

(defun it (x)
  (print (append '(a b c) x)))
Run Code Online (Sandbox Code Playgroud)

您也可能想要调用REVERSE以获得不同的列表元素顺序.