【问题标题】:Make list into symbol将列表变成符号
【发布时间】:2016-06-17 21:42:02
【问题描述】:

我试图pop elisp 中的列表元素如下,

(pop '(1 2))

但是,由于我的误解,这不起作用 b/c 该列表尚未被内化为符号。有没有一种惯用的方法来做上述事情,或者这不是一个合适的方法?再胡思乱想,我发现我可以做到

(pop (progn (setq tmp '(1 2)) tmp))

但这似乎不对。有没有办法像我试图做的那样制作匿名列表并就地修改它们?

【问题讨论】:

    标签: list lisp elisp


    【解决方案1】:

    pop 是一个 修改其参数的值, place

    例如,

    (defparameter *var* '(1 2 3))
    (pop *var*)
    ==> 1
    *var*
    ==> (2 3)
    

    请注意,被修改的是地点的值,而不是地点中包含的对象。

    例如,

    (defparameter *var-1* '(1 2 3))
    (defparameter *var-2* *var-1*)
    (pop *var-1*)
    ==> 1
    *var-1*
    ==> (2 3)
    *var-2*
    ==> (1 2 3)
    

    IOW,列表(1 2 3)没有修改,只有变量的值。

    你到底想做什么?

    【讨论】:

      【解决方案2】:

      pop 不会做你认为的那样。它不会修改任何列表。它只是用列表的cdr 重新绑定给定变量。

      在 Emacs 中运行 (macroexpand '(pop foo)),我得到:

      (car-safe (prog1 foo (setq foo (cdr foo))))
      

      请注意缺少任何列表修改功能,例如 rplacarplacd

      【讨论】:

      • @jenesaisquoi 只有变量绑定发生了变化,而不是实际的对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多