commonlisp:cons内部循环

commonlisp:cons内部循环,lisp,common-lisp,Lisp,Common Lisp,我想知道为什么在下面的代码中,d没有被cons插入x。 如有任何提示,我们将不胜感激 (defun it (x) (setq f '(a b c)) (dolist (d f) (cons d x)) (print x)) 谢谢大家! 我对LISP了解不多,但我想我知道的一些事情可能会对您有所帮助: (cons d x)没有将d“放入”x;它创建一个新值,该值由d组成,后跟x的内容。如果x是一个列表,那么(cons d x)也将是一个列表 (cons d x)不会改变任

我想知道为什么在下面的代码中,
d
没有被
cons
插入
x
。 如有任何提示,我们将不胜感激

(defun it (x) 
  (setq f '(a b c))
  (dolist (d f)
    (cons d x))
  (print x))

谢谢大家!

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

  • (cons d x)没有将d“放入”x;它创建一个新值,该值由d组成,后跟x的内容。如果x是一个列表,那么(cons d x)也将是一个列表

  • (cons d x)不会改变任何事情;它创建了一个值,但如果您不捕获该值,它将再次被丢弃。特别是,该表达式不会改变x


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

  • (cons d x)没有将d“放入”x;它创建一个新值,该值由d组成,后跟x的内容。如果x是一个列表,那么(cons d x)也将是一个列表

  • (cons d x)不会改变任何事情;它创建了一个值,但如果您不捕获该值,它将再次被丢弃。特别是,该表达式不会改变x


如果我正确理解您的意图,您希望将包含符号a、b和c的列表
f
附加到提供的参数
x
。这个怎么样

 (defun it (x)
   (append (if (listp x)
               x
               (list x))
           '(a b c)))

请注意,
cons
不会修改任何现有结构;它的意思是“构造”,它创造了新的结构。在这种情况下,您不需要修改任何内容,除非您有意编写一个函数来修改参数
x
所指向的对象。此类函数非常罕见,通常以警告此类破坏性行为的方式命名,如或。前导的n表示“不考虑”,表示它修改了现有的结构,而不是创建新的结构。

如果我正确理解您的意图,您希望将包含符号a、b和c的列表添加到提供的参数
x
。这个怎么样

 (defun it (x)
   (append (if (listp x)
               x
               (list x))
           '(a b c)))

请注意,
cons
不会修改任何现有结构;它的意思是“构造”,它创造了新的结构。在这种情况下,您不需要修改任何内容,除非您有意编写一个函数来修改参数
x
所指向的对象。此类函数非常罕见,通常以警告此类破坏性行为的方式命名,如或。前导的n表示“不考虑”,表示它修改现有结构而不是创建新结构。

您需要使用PUSH以破坏性方式更新变量。 CONS只返回一个新的CONS单元格。如果你不处理那个囚室,那它就不见了。也不是说您需要声明所有变量。让我们引入一个新的局部变量F,因此让在您的示例中很有用。仅仅对一个未声明的变量执行SETQ或SETF不是一件好事——实际上,在Lisp标准中,这种操作的后果是未定义的

(defun it (x) 
  (let ((f '(a b c)))
    (dolist (d f)
      (push d x))
    (print x)))
或者使用更实用的方法

(defun it (x)
  (print (append '(a b c) x)))

您可能还需要调用REVERSE以获得不同顺序的列表元素。

您需要使用PUSH以破坏性方式更新变量。 CONS只返回一个新的CONS单元格。如果你不处理那个囚室,那它就不见了。也不是说您需要声明所有变量。让我们引入一个新的局部变量F,因此让在您的示例中很有用。仅仅对一个未声明的变量执行SETQ或SETF不是一件好事——实际上,在Lisp标准中,这种操作的后果是未定义的

(defun it (x) 
  (let ((f '(a b c)))
    (dolist (d f)
      (push d x))
    (print x)))
或者使用更实用的方法

(defun it (x)
  (print (append '(a b c) x)))

您可能还需要调用REVERSE以获得不同的列表元素顺序。

在我们给您提供更好的提示之前,您必须让我们更好地了解函数应该做什么。我希望列表f的每个元素都添加到列表x中。请注意,f在任何地方都没有定义。这很糟糕。在我们提供更好的提示之前,您必须更好地了解函数应该做什么。我希望将列表f的每个元素添加到列表x中。请注意,没有在任何地方定义f。这不好。cons不会创建新列表。它只是创建了一个新的cons单元(一个有两个指针的结构,并返回它。该单元格的CAR是CONS的第一个参数,而该单元格的CDR是CONS的第二个参数。我知道,但我希望它保持简单。不过,你说得对,我不应该让谎言站在那里。我会编辑我的帖子。CONS不会创建新的列表。它只是创建一个新的CONS单元格(一个有两个指针的结构,并返回它。该单元格的CAR是CONS的第一个参数,而该单元格的CDR是CONS的第二个参数。我知道,但我希望它保持简单。不过,你是对的,我不应该让谎言站在那里。我会编辑我的帖子。