2016-03-09 2 views
-2

Я пытаюсь создать функцию, которая создает копии любого списка, который пользователь помещает на нужное количество копий.Функция копирования LISP

Пользователь: (копия '(A)' (7)) Выход: (AAAAAAA)

(defun copy (x y) 
    (cond ((-1 counter) 
     nil) 
     (T 
     (list (cons (car x) (cdr x))) 
       copy 
       (cdr x))) 

Я пытаюсь настроить счетчик и просто создать новый список в текущий список по уменьшая счетчик. Пока счетчик является псевдокодом.
Это счетчик, который я пытаюсь выяснить.

(defun count (y) 
    (let ((a y)) 
    (- a 1))) 

Я получаю ошибку в том, что все, что я вкладываю в y не число.

+1

Из любопытства, почему вы хотите, чтобы передать аргументы в виде списков, когда один это просто элемент, а другой - просто число? – lurker

+0

Возможно ли иметь оба? Скажите, что пользователь хочет: Пользователь: (A B C D E), и они хотят, чтобы каждый элемент был скопирован много раз (1 0 5 1 1 1). Таким образом, выход будет (A B B B B B C D E). – F0xcr4f7

+0

Конечно. :) Вам просто нужно сделать это требование ясным в вашем вопросе. Этот случай не обязательно принимается вашим первым примером. – lurker

ответ

2

Хотя я могу понять, почему первым параметром является список, второй должен быть числом. Очень простая реализация может выглядеть следующим образом:

(defun copy (lst count) 
    (when (> count 0) 
    (append (copy-list lst) (copy lst (1- count))))) 

Тестирование:

CL-USER> (copy '(A) 7) 
(A A A A A A A) 
CL-USER> (copy '(A B C) 7) 
(A B C A B C A B C A B C A B C A B C A B C) 

обычные предостережения относительно использования append и объекта копирования применяются.

+0

Может быть, второе должно быть похоже на размеры массива? (Я сомневаюсь, что это было намерение.) –

+0

Как lisp определить, что будет int и что будет строка? Я использую java-разговор, поскольку я очень новичок в lisp. – F0xcr4f7

1

Я хотел бы предложить, передавая свой список в качестве аргумента &rest вместо этого и использовать loop:

(defun repeat (n &rest items) 
    (loop repeat n append items)) 

Тест

CL-USER> (repeat 10 0 1 2) 
(0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2) 
Смежные вопросы