List Emacs——如何用let绑定变量替换列表的第n个元素

List Emacs——如何用let绑定变量替换列表的第n个元素,list,sorting,emacs,List,Sorting,Emacs,我没有找到任何示例,说明如何替换列表中的第n个元素,而不首先使用函数添加到有序列表中——例如,(添加到有序列表中“列表”a1)。这需要随后删除元素——例如,(delq a列表)。该过程的第三步是添加新元素,例如,(将列表“HELLO-WORLD!”1添加到有序列表中)。由于以下名为变量列表示例的函数使用26个元素,因此我正在寻找一种比首先逐个添加所有26个元素(来为每个元素分配一个位置号)更好的方法。函数add to ordered list使用与标准nth元素方法不同的一位数字赋值,其中第一个

我没有找到任何示例,说明如何替换列表中的
第n个
元素,而不首先使用函数
添加到有序列表中
——例如,
(添加到有序列表中“列表”a1)
。这需要随后删除元素——例如,
(delq a列表)
。该过程的第三步是添加新元素,例如,
(将列表“HELLO-WORLD!”1添加到有序列表中)
。由于以下名为
变量列表示例
的函数使用26个元素,因此我正在寻找一种比首先逐个添加所有26个元素(来为每个元素分配一个位置号)更好的方法。函数
add to ordered list
使用与标准
nth
元素方法不同的一位数字赋值,其中第一个元素的值为
0
,而
add to ordered list
使用第一个元素的值为
1
。以下是
添加到有序列表的文档链接:

此外,使用组合
'(
在列表的开头似乎会阻止在列表中使用let绑定变量——例如,let绑定变量在列表中显示为
my variable
,而不是
HELLO-WORLD!
。我发现的唯一解决方法是上面提到的使用
add to ordered list
——这是一个很长的三个示例ep过程(即,在开始时逐个添加每个元素)

为了解决这两个问题,我正在寻求帮助,请将列表的
第17个
元素
(即字母
r
替换为
我的变量
(即
HELLO-WORLD!



列表

'(a b c d e f g h i j k l m n o p q r s t u v w x y z)

n个元素--备忘单/图例

element 0:   a
element 1:   b
element 2:   c
element 3:   d
element 4:   e
element 5:   f
element 6:   g
element 7:   h
element 8:   i
element 9:   j
element 10:  k
element 11:  l
element 12:  m
element 13:  n
element 14:  o
element 15:  p
element 16:  q
element 17:  r
element 18:  s
element 19:  t
element 20:  u
element 21:  v
element 22:  w
element 23:  x
element 24:  y
element 25:  z
您需要使用和:

更常见的类似lisp的方法是使用:

Emacs的概念是,它本质上允许您使用
setf
更改任意存储位置。例如,您可以更改
car
cdr
列表位置,包括
nth
返回的
car
。因此,下面的代码

(let ((foo 10)
      (l '(1 2 3 4 5 6 7 8)))
  (setf (nth 4 l) foo)
  l)
将返回列表
(1 2 3 4 10 6 7 8)

要将变量直接放入带引号的列表中,必须更改引号的类型。禁止在带引号的表达式中进行任何计算

但是,特殊表达式允许您在带引号的表达式中计算表达式:

(let* ((foo 10)
      (l `(1 2 3 4 5 ,foo 7 foo)))
  l)

前导逗号标记要计算的后续表达式,而不带前导逗号的表达式将按字面意思表示。在上述示例中,将计算列表中第一次出现的
foo
,并因此替换为
10
,而第二次出现则按字面意思在列表中结束。

添加迟交的回答特别是关于
添加到有序列表
,因为我认为对它的功能和工作方式存在混淆

add to ordered list
用于指定(记录)单个列表元素的特定顺序

但是列表中也可以有没有特定顺序记录的元素。这些元素总是放在列表的末尾,在所有有特定顺序记录的元素之后

如果要替换具有记录顺序的元素,则需要将其从列表中删除并添加其替换项(这是您猜测的)

(添加到有序列表“列表”a 1);记录元素(符号)a的顺序1。
(从列表中删除);从列表中删除。
(添加到有序列表“列表”HELLO 1);记录元素(符号)HELLO的顺序1。
要补充一些东西,以帮助澄清一点:

  • 不能使用字符串元素,例如
    “HELLO”
    ,因为记录元素顺序需要使用
    eq
    (而不是
    equal
    string=
    )来区分它们

  • 您可以从元素中删除记录的顺序,而不是从列表中删除该元素。如果您这样做,该元素将保留在列表中,但会在记录了顺序的任何元素之后移动。这不是您想要的(您想要替换它),但要知道这是可能的。您可以使用元素调用
    add to ordered list
    ,而不使用
    ordered
    值(或
    nil
    值)

  • 不需要为所有要素指定要素记录的订单(见上文),它们不必是连续的。重要的是它们可以进行数字比较,这样它们的元素就可以排序。例如,您可以将元素
    a
    b
    、和
    c'添加到空列表中,分别记录13、42和6的顺序。结果是列表
    (c a b)`,因为6<12<42

  • 您甚至可以为多个列表元素记录相同的顺序,在这种情况下,这些元素在列表中是连续的,但它们之间的顺序并不重要。您可以将记录的顺序视为桶或分数。分数为3的所有元素在列表中显示在分数为7的所有元素和分数为3的元素之前(或7)是连续的


  • 另请参见。

    非常感谢您帮助我理解为什么我在尝试使用列表中的变量时遇到了很多麻烦。您提供的课程将来会非常有用的!:)旁注:
    add to list
    add to ordered list
    只能用于保存在全局变量中的列表。注意更改配置变量之类的内容。在所有其他情况下,您需要使用
    push
    cl pushnew
    cons
    ncoc
    (setf (nth 17 the-list) my-variable)
    (let ((foo 10)
          (l '(1 2 3 4 5 6 7 8)))
      (setf (nth 4 l) foo)
      l)
    
    (let* ((foo 10)
          (l `(1 2 3 4 5 ,foo 7 foo)))
      l)