Создание псевдонима Lisp с помощью defalias или новой функции? - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу, чтобы mylist имел ту же функциональность, что и list. В большинстве Lisps (я на Emacs Lisp) я могу просто написать

(defalias 'mylist 'list)

Но если я хочу написать свой собственный, я могу написать

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

, который имеет те же функции. Но потом я получил это, экспериментируя. Во-первых, у меня был этот код

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

, который создавал список в списке. Я не был уверен, почему, но простое решение состояло в том, чтобы просто поместить (list x) в car и назвать это хорошим. Но я хотел бы знать, почему я получаю список внутри списка, когда я не использую трюк car. Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Но если я хочу написать свой собственный, я могу написать

(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)

Но я бы хотел знать, почему я получаю список в списке, когда я не использую трюк с машиной. Чего мне не хватает?

, если у вас есть список

x -> (1 2 3)

и назовите list на нем

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

Тогда вы получите список в список.

Вызов car в списке также не является трюком . Возвращает первый элемент этого списка:

(car (list x)) -> (1 2 3)
1 голос
/ 11 февраля 2020

(defun my-list (&rest x) …

Параметр &rest означает, что все оставшиеся аргументы заносятся в список, связанный с этим параметром. X затем содержит список, который вы хотите. Вы сделали.

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