使用 defalias 或新功能创建 Lisp 别名?

Creating a Lisp alias with defalias or new function?

我希望 mylist 具有与 list 相同的功能。在大多数 Lisp 中(我在 Emacs Lisp 上)我可以简单地写

(defalias 'mylist 'list)

但是如果我想自己写我可以写

(defun mylist (&rest x)
    (car (list x)))

具有相同的功能。但后来我通过实验得到了这个。首先,我有这个代码

(defun mylist (&rest x)
        (list x))

其中产生了一个列表中的一个列表。我不确定为什么,但简单的解决方案是将 (list x) 放在 car 中并称其为好。但是我想知道为什么当我不使用 car 技巧时我会在列表中得到一个列表。我错过了什么?

But if I want to write my own I can write

(defun mylist (&rest x) (car (list x)))

但是为什么呢?

3 -> 3
(list 3) -> (3)
(car (list 3)) -> 3

所以 (car (list arg))arg 上的空操作。

因此它只是:

(defun mylist (&rest x)
  x)

But I'd like to know why I get a list inside a list when I don't use the car trick. What am I missing?

如果你有一个列表

x -> (1 2 3)

并在其上调用 list

(list x) -> ((1 2 3))

然后你得到一个列表中的列表。

在列表中调用 car 也不是 技巧。它返回该列表的第一个元素:

(car (list x)) -> (1 2 3)

(defun my-list (&rest x) …

&rest参数意味着所有剩余的参数都被放入一个绑定到这个参数的列表中。 X 然后保存您想要的列表。大功告成。

(defun my-list (&rest x)
  x)