Реализация минусов с использованием `list` или` append` - PullRequest
3 голосов
/ 18 ноября 2010

Есть ли способ реализовать cons в Common LISP с помощью list, append, first, rest и т. Д.

В следующем коде

(defun my_list (&rest arguments)
   `(,@arguments) ; Line 1
)

Что означает полная строка 1?

Ответы [ 4 ]

6 голосов
/ 18 ноября 2010

Первый вопрос: Нет, потому что cons является строительным блоком для list и append, а не наоборот. Это все равно что пытаться построить кирпич из домов.

Второй вопрос: синтаксис обратной цитаты объясняется в CLHS (http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/sec_2-4-6.html).

Стилистические комментарии:

  • Это пишется "Common Lisp".

  • Не используйте подчеркивания для разделения частей имен, но дефисы: my-list.

  • Не позволяйте скобкам болтаться. Ваш фрагмент должен быть отформатирован так:

    (defun my-list (&rest arguments)
      `(,@arguments)) ; Line 1
    
  • Использование синтаксиса обратных цитат вне макросов обычно не очень хорошая идея. В этом случае это совершенно лишнее:

    (defun my-list (&rest arguments)
      arguments)
    
1 голос
/ 19 ноября 2010

Да, теоретически можно определить cons в терминах list и append, например:

(defun cons (car cdr) (append (list car) cdr))
0 голосов
/ 18 ноября 2010

У меня есть ответ на второй вопрос:
для,:
, если my_symbol = 1
`(my_symbol 2 3) = (my_symbol 2 3), но с:

`(,my_symbol 2 3) = (1 2 3)

, вычисляет следующий символ в операторе `

Теперь для @ (который является символом, поэтому он должен быть активирован)

`(,@('a 'b 'c) ('d 'e 'f)) = ('a 'b 'c ('d 'e 'f) )

`(,@('a 'b 'c) ,@('d 'e 'f) ) = ('a 'b 'c 'd 'e 'f)

Iнадеюсь, что эти примеры могут помочь.Таким образом, строка 1 просто извлекает аргументы из списка и помещает их в другой.

0 голосов
/ 18 ноября 2010

Как насчет этого?

(defun cons (a b) '(a . b))

Или, если вам крайне необходимо использовать списки ...

(defun cons (a b) (first (list '(a . b))))
...